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