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