1 /*
2 Copyright (C) 2015-2021, Dirk Krause
3 SPDX-License-Identifier: BSD-3-Clause
4 */
5 
6 /*
7 	WARNING: This file was generated by the dkct program (see
8 	http://dktools.sourceforge.net/ for details).
9 	Changes you make here will be lost if dkct is run again!
10 	You should modify the original source and run dkct on it.
11 	Original source: dk4sock02.ctr
12 */
13 
14 
15 /**	@file	dk4sock01.c	Conversion between host and net representation.
16 */
17 
18 #include "dk4conf.h"
19 
20 #if DK4_HAVE_ASSERT_H
21 #ifndef	ASSERT_H_INCLUDED
22 #include <assert.h>
23 #define	ASSERT_H_INCLUDED 1
24 #endif
25 #endif
26 
27 #include <libdk4base/dk4types.h>
28 #include <libdk4base/dk4error.h>
29 #include <libdk4sock/dk4sock.h>
30 
31 #if DK4_HAVE_STRINGS_H
32 #ifndef	STRINGS_H_INCLUDED
33 #include <strings.h>
34 #define	STRINGS_H_INCLUDED 1
35 #endif
36 #endif
37 
38 #if (!DK4_ON_WINDOWS) \
39 && (DK4_HAVE_HTONS || DK4_HAVE_NTOHS || DK4_HAVE_HTONL || DK4_HAVE_NTOHL)
40 
41 #if DK4_HAVE_ARPA_INET_H
42 #ifndef ARPA_INET_H_INCLUDED
43 #include <arpa/inet.h>
44 #define	ARPA_INET_H_INCLUDED 1
45 #endif
46 #endif
47 #if DK4_HAVE_NETINET_IN_H
48 #ifndef NETINET_IN_H_INCLUDED
49 #include <netinet/in.h>
50 #define	NETINET_IN_H_INCLUDED 1
51 #endif
52 #endif
53 
54 #endif
55 
56 
57 #if DK4_ON_WINDOWS || (!DK4_HAVE_HTONS) || (!DK4_HAVE_NTOHS)
58 #if !DK4_WORDS_BIGENDIAN
59 
60 static
61 uint16_t
dk4socket_short_swap(uint16_t u)62 dk4socket_short_swap(uint16_t u)
63 {
64   return (
65     ((u >> 8) & 0x00FFU)
66     | ((u << 8) & 0xFF00U)
67   );
68 }
69 
70 #endif
71 #endif
72 
73 #if DK4_ON_WINDOWS || (!DK4_HAVE_HTONL) || (!DK4_HAVE_NTOHL)
74 #if !DK4_WORDS_BIGENDIAN
75 
76 static
77 uint32_t
dk4socket_long_swap(uint32_t u)78 dk4socket_long_swap(uint32_t u)
79 {
80   return (
81     (  (u >> 24) & 0x000000FFUL)
82     | ((u >>  8) & 0x0000FF00UL)
83     | ((u <<  8) & 0x00FF0000UL)
84     | ((u << 24) & 0xFF000000UL)
85   );
86 }
87 
88 #endif
89 #endif
90 
91 uint16_t
dk4socket_htons(uint16_t u)92 dk4socket_htons(uint16_t u)
93 {
94 #if DK4_HAVE_HTONS && (!DK4_ON_WINDOWS)
95   return (htons(u));
96 #else
97 #if DK4_WORDS_BIGENDIAN
98   return u;
99 #else
100   return (dk4socket_short_swap(u));
101 #endif
102 #endif
103 }
104 
105 
106 
107 uint16_t
dk4socket_ntohs(uint16_t u)108 dk4socket_ntohs(uint16_t u)
109 {
110 #if DK4_HAVE_NTOHS && (!DK4_ON_WINDOWS)
111   return (ntohs(u));
112 #else
113 #if DK4_WORDS_BIGENDIAN
114   return u;
115 #else
116   return (dk4socket_short_swap(u));
117 #endif
118 #endif
119 }
120 
121 uint32_t
dk4socket_htonl(uint32_t u)122 dk4socket_htonl(uint32_t u)
123 {
124 #if DK4_HAVE_HTONL && (!DK4_ON_WINDOWS)
125   return (htonl(u));
126 #else
127 #if DK4_WORDS_BIGENDIAN
128   return u;
129 #else
130   return (dk4socket_long_swap(u));
131 #endif
132 #endif
133 }
134 
135 uint32_t
dk4socket_ntohl(uint32_t u)136 dk4socket_ntohl(uint32_t u)
137 {
138 #if DK4_HAVE_NTOHL && (!DK4_ON_WINDOWS)
139   return (ntohl(u));
140 #else
141 #if DK4_WORDS_BIGENDIAN
142   return u;
143 #else
144   return (dk4socket_long_swap(u));
145 #endif
146 #endif
147 }
148 
149 void
dk4socket_swap_bytes_if_not_bigendian(void * buf,size_t sz)150 dk4socket_swap_bytes_if_not_bigendian(void *buf, size_t sz)
151 {
152 #if !DK4_WORDS_BIGENDIAN
153   unsigned char	*ucp;		/* Buffer address converted ty bytes pointer */
154   size_t	 szh;		/* Half of the size sz */
155   size_t	 i;		/* Current byte index, 0 to szh-1 */
156   unsigned char	 u;		/* Byte variable used to swap bytes */
157 
158   if ((NULL != buf) && (0 < sz)) {
159     ucp = (unsigned char *)buf;
160     szh = sz / 2;
161     for (i = 0; i < szh; i++) {
162       u = ucp[i];
163       ucp[i] = ucp[sz - 1 - i];
164       ucp[sz - 1 - i] = u;
165     }
166   }
167 #endif
168 }
169 
170 
171 
172 int
dk4socket_mask_bits(unsigned long * dptr,size_t sz,dk4_er_t * erp)173 dk4socket_mask_bits(unsigned long *dptr, size_t sz, dk4_er_t *erp)
174 {
175   unsigned long		res	= 0UL;
176   unsigned long		val	= 0x80000000UL;
177   int			back	= DK4_SOCKET_RESULT_FAILED;
178 #if	DK4_USE_ASSERT
179   assert(NULL != dptr);
180 #endif
181   if (NULL != dptr) {
182     if ((0 < sz) && (33 > sz)) {
183       while (0 < sz--) {
184         res |= val;
185         val =  val / 2UL;
186       }
187       *dptr = res;
188       back = DK4_SOCKET_RESULT_SUCCESS;
189     } else {
190       dk4error_set_simple_error_code(erp, DK4_E_SYNTAX);
191     }
192   } else {
193     dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS);
194   }
195   return back;
196 }
197 
198 
199 
200 #if DK4_HAVE_STRUCT_SOCKADDR_IN6
201 
202 int
dk4socket_mask6_bits(struct in6_addr * inp,size_t sz,dk4_er_t * erp)203 dk4socket_mask6_bits(struct in6_addr *inp, size_t sz, dk4_er_t *erp)
204 {
205   int			 back	= DK4_SOCKET_RESULT_FAILED;
206   size_t		 i	= 0;
207   size_t		 j	= 0;
208   unsigned char		 rchr	= 0x00;
209   unsigned char		 vchr	= 0x80;
210 #if	DK4_USE_ASSERT
211   assert(NULL != inp);
212 #endif
213   if (NULL != inp) {
214     for (i = 0; i < 16; i++) { inp->s6_addr[i] = 0xFF; }
215     if ((0 < sz) && (129 > sz)) {
216       for (i = 0; i < 16; i++) {
217         rchr = 0x00;
218 	vchr = 0x80;
219 	for (j = 0; j < 8; j++) {
220 	  if (0 < sz) {
221 	    rchr |= vchr;
222 	    sz--;
223 	  }
224 	  vchr = vchr / 2;
225 	}
226 	inp->s6_addr[i] = rchr;
227       }
228       back = DK4_SOCKET_RESULT_SUCCESS;
229     } else {
230       dk4error_set_simple_error_code(erp, DK4_E_SYNTAX);
231     }
232   } else {
233     dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS);
234   }
235   return back;
236 }
237 
238 #endif
239 
240 
241 
242 void
dk4socket_set_one_bytes(void * ptr,size_t nbytes)243 dk4socket_set_one_bytes(void *ptr, size_t nbytes)
244 {
245   unsigned char	*cptr;
246 #if	DK4_USE_ASSERT
247   assert(NULL != ptr);
248   assert(0 < nbytes);
249 #endif
250   cptr = (unsigned char *)ptr;
251   while (0 < nbytes--) { *(cptr++) = 0x01; }
252 }
253 
254 
255 
256 #if DK4_HAVE_STRUCT_SOCKADDR_UN
257 
258 size_t
dk4socket_unix_length(const struct sockaddr_un * sock)259 dk4socket_unix_length(const struct sockaddr_un *sock)
260 {
261   size_t	back = 0;
262 #if	DK4_USE_ASSERT
263   assert(NULL != sock);
264 #endif
265   if (NULL != sock) {
266 #ifdef SUN_LEN
267     back = SUN_LEN(sock);
268 #else
269     back = sizeof(struct sockaddr_un)
270            - sizeof(sock->sun_path)
271 	   + strlen(sock->sun_path);
272 #endif
273   }
274   return back;
275 }
276 
277 #endif
278 
279 
280 int
dk4socket_pf_for_af(int af)281 dk4socket_pf_for_af(int af)
282 {
283   int		 back = 0;
284   switch (af) {
285 
286 #if defined(AF_UNSPEC) && defined(PF_UNSPEC)
287     case AF_UNSPEC : { back = PF_UNSPEC ; } break;
288 #endif
289 #if defined(AF_UNIX) && defined(PF_UNIX)
290     case AF_UNIX : { back = PF_UNIX ; } break;
291 #endif
292 #if defined(AF_LOCAL) && defined(PF_LOCAL) && \
293 	(!(defined(AF_UNIX) && defined(PF_UNIX)))
294     case AF_LOCAL : { back = PF_LOCAL ; } break;
295 #endif
296 #if defined(AF_FILE) && defined(PF_FILE) && \
297 	(!(defined(AF_UNIX) && defined(PF_UNIX))) && \
298 	(!(defined(AF_LOCAL) && defined(PF_LOCAL)))
299     case AF_FILE : { back = PF_FILE ; } break;
300 #endif
301 #if defined(AF_INET) && defined(PF_INET)
302     case AF_INET : { back = PF_INET ; } break;
303 #endif
304 #if defined(AF_AX25) && defined(PF_AX25)
305     case AF_AX25 : { back = PF_AX25 ; } break;
306 #endif
307 #if defined(AF_IPX) && defined(PF_IPX)
308     case AF_IPX : { back = PF_IPX ; } break;
309 #endif
310 #if defined(AF_APPLETALK) && defined(PF_APPLETALK)
311     case AF_APPLETALK : { back = PF_APPLETALK ; } break;
312 #endif
313 #if defined(AF_NETROM) && defined(PF_NETROM)
314     case AF_NETROM : { back = PF_NETROM ; } break;
315 #endif
316 #if defined(AF_BRIDGE) && defined(PF_BRIDGE)
317     case AF_BRIDGE : { back = PF_BRIDGE ; } break;
318 #endif
319 #if defined(AF_ATMPVC) && defined(PF_ATMPVC)
320     case AF_ATMPVC : { back = PF_ATMPVC ; } break;
321 #endif
322 #if defined(AF_X25) && defined(PF_X25)
323     case AF_X25 : { back = PF_X25 ; } break;
324 #endif
325 #if defined(AF_INET6) && defined(PF_INET6)
326     case AF_INET6 : { back = PF_INET6 ; } break;
327 #endif
328 #if defined(AF_ROSE) && defined(PF_ROSE)
329     case AF_ROSE : { back = PF_ROSE ; } break;
330 #endif
331 #if defined(AF_DECnet) && defined(PF_DECnet)
332     case AF_DECnet : { back = PF_DECnet ; } break;
333 #endif
334 #if defined(AF_NETBEUI) && defined(PF_NETBEUI)
335     case AF_NETBEUI : { back = PF_NETBEUI ; } break;
336 #endif
337 #if defined(AF_SECURITY) && defined(PF_SECURITY)
338     case AF_SECURITY : { back = PF_SECURITY ; } break;
339 #endif
340 #if defined(AF_KEY) && defined(PF_KEY)
341     case AF_KEY : { back = PF_KEY ; } break;
342 #endif
343 #if defined(AF_NETLINK) && defined(PF_NETLINK)
344     case AF_NETLINK : { back = PF_NETLINK ; } break;
345 #endif
346 #if defined(AF_ROUTE) && defined(PF_ROUTE) && \
347 	(!(defined(AF_NETLINK) && defined(PF_NETLINK)))
348     case AF_ROUTE : { back = PF_ROUTE ; } break;
349 #endif
350 #if defined(AF_PACKET) && defined(PF_PACKET)
351     case AF_PACKET : { back = PF_PACKET ; } break;
352 #endif
353 #if defined(AF_ASH) && defined(PF_ASH)
354     case AF_ASH : { back = PF_ASH ; } break;
355 #endif
356 #if defined(AF_ECONET) && defined(PF_ECONET)
357     case AF_ECONET : { back = PF_ECONET ; } break;
358 #endif
359 #if defined(AF_ATMSVC) && defined(PF_ATMSVC)
360     case AF_ATMSVC : { back = PF_ATMSVC ; } break;
361 #endif
362 #if defined(AF_RDS) && defined(PF_RDS)
363     case AF_RDS : { back = PF_RDS ; } break;
364 #endif
365 #if defined(AF_SNA) && defined(PF_SNA)
366     case AF_SNA : { back = PF_SNA ; } break;
367 #endif
368 #if defined(AF_IRDA) && defined(PF_IRDA)
369     case AF_IRDA : { back = PF_IRDA ; } break;
370 #endif
371 #if defined(AF_PPPOX) && defined(PF_PPPOX)
372     case AF_PPPOX : { back = PF_PPPOX ; } break;
373 #endif
374 #if defined(AF_WANPIPE) && defined(PF_WANPIPE)
375     case AF_WANPIPE : { back = PF_WANPIPE ; } break;
376 #endif
377 #if defined(AF_LLC) && defined(PF_LLC)
378     case AF_LLC : { back = PF_LLC ; } break;
379 #endif
380 #if defined(AF_CAN) && defined(PF_CAN)
381     case AF_CAN : { back = PF_CAN ; } break;
382 #endif
383 #if defined(AF_TIPC) && defined(PF_TIPC)
384     case AF_TIPC : { back = PF_TIPC ; } break;
385 #endif
386 #if defined(AF_BLUETOOTH) && defined(PF_BLUETOOTH)
387     case AF_BLUETOOTH : { back = PF_BLUETOOTH ; } break;
388 #endif
389 #if defined(AF_IUCV) && defined(PF_IUCV)
390     case AF_IUCV : { back = PF_IUCV ; } break;
391 #endif
392 #if defined(AF_RXRPC) && defined(PF_RXRPC)
393     case AF_RXRPC : { back = PF_RXRPC ; } break;
394 #endif
395 #if defined(AF_ISDN) && defined(PF_ISDN)
396     case AF_ISDN : { back = PF_ISDN ; } break;
397 #endif
398 #if defined(AF_PHONET) && defined(PF_PHONET)
399     case AF_PHONET : { back = PF_PHONET ; } break;
400 #endif
401 #if defined(AF_IEEE802154) && defined(PF_IEEE802154)
402     case AF_IEEE802154 : { back = PF_IEEE802154 ; } break;
403 #endif
404 #if defined(AF_CAIF) && defined(PF_CAIF)
405     case AF_CAIF : { back = PF_CAIF ; } break;
406 #endif
407 #if defined(AF_ALG) && defined(PF_ALG)
408     case AF_ALG : { back = PF_ALG ; } break;
409 #endif
410 #if defined(AF_NFC) && defined(PF_NFC)
411     case AF_NFC : { back = PF_NFC ; } break;
412 #endif
413 #if defined(AF_VSOCK) && defined(PF_VSOCK)
414     case AF_VSOCK : { back = PF_VSOCK ; } break;
415 #endif
416   }
417   return back;
418 }
419 
420 
421 
422 int
dk4socket_correct_addr_lgt(const struct sockaddr * soa,size_t * plgt)423 dk4socket_correct_addr_lgt(const struct sockaddr *soa, size_t *plgt)
424 {
425   int		 back	= 0;
426 #if	DK4_USE_ASSERT
427   assert(NULL != soa);
428   assert(NULL != plgt);
429 #endif
430   if ((NULL != soa) && (NULL != plgt)) {
431     back = 1;
432     switch (soa->sa_family) {
433       case AF_INET : {
434 	if (sizeof(struct sockaddr_in) <= *plgt) {
435 	  *plgt = sizeof(struct sockaddr_in);
436 	} else {
437 	  back = 0;
438 	}
439       } break;
440 #if DK4_HAVE_STRUCT_SOCKADDR_IN6
441       case AF_INET6 : {
442         if (sizeof(struct sockaddr_in6) <= *plgt) {
443 	  *plgt = sizeof(struct sockaddr_in6);
444 	} else {
445 	  back = 0;
446 	}
447       } break;
448 #endif
449     }
450   }
451   return back;
452 }
453 
454 
455