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: dk4sock26.ctr
12 */
13
14 /** @file dk4sock26.c The dk4sock26 module.
15 */
16
17
18
19
20 #include "dk4conf.h"
21 #include <libdk4base/dk4types.h>
22 #include <libdk4base/dk4error.h>
23 #include <libdk4base/dk4mem.h>
24 #include <libdk4sock/dk4sock.h>
25 #include <libdk4base/dk4str8.h>
26 #include <libdk4maio8d/dk4mai8dsz.h>
27
28 #if DK4_HAVE_ASSERT_H
29 #ifndef ASSERT_H_INCLUDED
30 #include <assert.h>
31 #define ASSERT_H_INCLUDED 1
32 #endif
33 #endif
34
35
36
37
38
39
40 #if TRACE_DEBUG
41
42 static
43 void
dk4socket_c8_debug_allowed_peer(dk4_allowed_peer_t * peerptr)44 dk4socket_c8_debug_allowed_peer(dk4_allowed_peer_t *peerptr)
45 {
46 FILE *fipo;
47 #if DK4_HAVE_STRUCT_SOCKADDR_IN6
48 unsigned char *ucptr;
49 size_t i;
50 size_t pass;
51 #endif
52 unsigned long ul1, ul2;
53 fipo = dktrace_file();
54
55 if (NULL != fipo) {
56 switch (peerptr->af) {
57 case AF_INET : {
58 ul1 = (peerptr->data).ipv4.ad.s_addr;
59 ul2 = (peerptr->data).ipv4.ma.s_addr;
60 ul1 = dk4socket_ntohl(ul1);
61 ul2 = dk4socket_ntohl(ul2);
62 fprintf(
63 fipo,
64 "Address/Mask: %lu.%lu.%lu.%lu/%lu.%lu.%lu.%lu\n",
65 ((ul1 >> 24) & 0x000000FFUL),
66 ((ul1 >> 16) & 0x000000FFUL),
67 ((ul1 >> 8) & 0x000000FFUL),
68 ((ul1 ) & 0x000000FFUL),
69 ((ul2 >> 24) & 0x000000FFUL),
70 ((ul2 >> 16) & 0x000000FFUL),
71 ((ul2 >> 8) & 0x000000FFUL),
72 ((ul2 ) & 0x000000FFUL)
73 );
74 } break;
75 #if DK4_HAVE_STRUCT_SOCKADDR_IN6
76 case AF_INET6 : {
77 fputs("Address/Mask: ", fipo);
78 for (pass = 0; pass < 2; pass++) {
79 if (0 != pass) {
80 fputc('/', fipo);
81 ucptr = &((peerptr->data).ipv6.ma.s6_addr[0]);
82 } else {
83 ucptr = &((peerptr->data).ipv6.ad.s6_addr[0]);
84 }
85 for (i = 0; i < 16; i++) {
86 if ((0 != i) && (0 == (i % 2))) {
87 fputc(':', fipo);
88 }
89 fprintf(fipo, "%02x", *(ucptr++));
90 }
91 }
92 fputc('\n', fipo);
93 } break;
94 #endif
95 }
96 }
97 }
98
99 #endif
100
101
102
103 int
dk4socket_c8_get_allowed_peer(dk4_allowed_peer_t * peerptr,const char * str,dk4_er_t * erp)104 dk4socket_c8_get_allowed_peer(
105 dk4_allowed_peer_t *peerptr,
106 const char *str,
107 dk4_er_t *erp
108 )
109 {
110 char mycp[128];
111 IN_ADDR in4;
112 IN_ADDR ma4;
113 #if DK4_HAVE_STRUCT_SOCKADDR_IN6
114 IN6_ADDR in6;
115 IN6_ADDR ma6;
116 #endif
117 char *maptr;
118 const char *endptr = NULL;
119 size_t bitno = 0;
120 #if DK4_HAVE_STRUCT_SOCKADDR_IN6
121 size_t i = 0;
122 #endif
123 unsigned long nm4 = 0UL;
124 int back = DK4_SOCKET_RESULT_FAILED;
125 int af = AF_UNSPEC;
126 int res = 0;
127
128 #if DK4_USE_ASSERT
129 assert(NULL != peerptr);
130 assert(NULL != str);
131 #endif
132 if ((NULL != peerptr) && (NULL != str)) {
133 if (0 != dk4str8_cpy_s(mycp, sizeof(mycp), str, erp)) {
134 maptr = dk4str8_chr(mycp, '/');
135 if (NULL != maptr) { *(maptr++) = '\0'; }
136 back = dk4socket_c8_inet_pton( &in4, sizeof(in4), AF_INET, mycp, erp);
137 if (DK4_SOCKET_RESULT_SUCCESS == back) { af = AF_INET; }
138 #if DK4_HAVE_STRUCT_SOCKADDR_IN6
139 else {
140 back = dk4socket_c8_inet_pton( &in6, sizeof(in6), AF_INET6, mycp, erp);
141 if (DK4_SOCKET_RESULT_SUCCESS == back) { af = AF_INET6; }
142 }
143 #endif
144 if (DK4_SOCKET_RESULT_SUCCESS == back) {
145 back = DK4_SOCKET_RESULT_FAILED;
146 if (NULL != maptr) {
147 res = dk4ma_input_c8_dec_size_t(&bitno, maptr, &endptr, 1, NULL);
148 if (0 != res) {
149 /* Bit number was specified.
150 */
151 switch (af) {
152 case AF_INET : {
153 if (0 != dk4socket_mask_bits(&nm4, bitno, erp)) {
154 ma4.s_addr = dk4socket_htonl((uint32_t)nm4);
155 DK4_MEMCPY(&((peerptr->data).ipv4.ad),&in4,sizeof(in4));
156 DK4_MEMCPY(&((peerptr->data).ipv4.ma),&ma4,sizeof(ma4));
157 peerptr->af = af;
158 back = DK4_SOCKET_RESULT_SUCCESS;
159 } else {
160 }
161 } break;
162 #if DK4_HAVE_STRUCT_SOCKADDR_IN6
163 case AF_INET6 : {
164 back = dk4socket_mask6_bits(&ma6, bitno, erp);
165 if (DK4_SOCKET_RESULT_SUCCESS == back) {
166 DK4_MEMCPY(&((peerptr->data).ipv6.ad),&in6,sizeof(in6));
167 DK4_MEMCPY(&((peerptr->data).ipv6.ma),&ma6,sizeof(ma6));
168 peerptr->af = af;
169 } else {
170 }
171 } break;
172 #endif
173 default : {
174 /* Must not happen */
175 } break;
176 }
177 } else {
178 /* Not a bit number, probably an address.
179 */
180 switch (af) {
181 case AF_INET : {
182 back = dk4socket_c8_inet_pton(
183 &ma4, sizeof(ma4), AF_INET, maptr, erp
184 );
185 if (DK4_SOCKET_RESULT_SUCCESS == back) {
186 DK4_MEMCPY(&((peerptr->data).ipv4.ad),&in4,sizeof(in4));
187 DK4_MEMCPY(&((peerptr->data).ipv4.ma),&ma4,sizeof(ma4));
188 peerptr->af = af;
189 } else {
190 }
191 } break;
192 #if DK4_HAVE_STRUCT_SOCKADDR_IN6
193 case AF_INET6 : {
194 back = dk4socket_c8_inet_pton(
195 &ma6, sizeof(ma6), AF_INET6, maptr, erp
196 );
197 if (DK4_SOCKET_RESULT_SUCCESS == back) {
198 DK4_MEMCPY(&((peerptr->data).ipv6.ad),&in6,sizeof(in6));
199 DK4_MEMCPY(&((peerptr->data).ipv6.ma),&ma6,sizeof(ma6));
200 peerptr->af = af;
201 } else {
202 }
203 } break;
204 #endif
205 }
206 }
207 } else {
208 /* Host was specified
209 */
210 switch (af) {
211 case AF_INET : {
212 ma4.s_addr = dk4socket_htonl(0xFFFFFFFFUL);
213 DK4_MEMCPY(&((peerptr->data).ipv4.ad), &in4, sizeof(in4));
214 DK4_MEMCPY(&((peerptr->data).ipv4.ma), &ma4, sizeof(ma4));
215 peerptr->af = af;
216 back = DK4_SOCKET_RESULT_SUCCESS;
217 } break;
218 #if DK4_HAVE_STRUCT_SOCKADDR_IN6
219 case AF_INET6 : {
220 for (i = 0; i < 16; i++) { ma6.s6_addr[i] = 0xFF; }
221 DK4_MEMCPY(&((peerptr->data).ipv6.ad), &in6, sizeof(in6));
222 DK4_MEMCPY(&((peerptr->data).ipv6.ma), &ma6, sizeof(ma6));
223 peerptr->af = af;
224 back = DK4_SOCKET_RESULT_SUCCESS;
225 } break;
226 #endif
227 default : {
228 /* Must not happen */
229 } break;
230 }
231 }
232 } else {
233 }
234 } else {
235 }
236 } else {
237 dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS);
238 }
239 #if TRACE_DEBUG
240 if (DK4_SOCKET_RESULT_SUCCESS == back) {
241 dk4socket_c8_debug_allowed_peer(peerptr);
242 }
243 #endif
244
245 return back;
246 }
247
248