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: dk4sock28.ctr
12 */
13 
14 /**	@file dk4sock28.c The dk4sock28 module.
15 */
16 
17 
18 #include "dk4conf.h"
19 #include <libdk4base/dk4types.h>
20 #include <libdk4base/dk4error.h>
21 #include <libdk4sock/dk4sock.h>
22 #include <libdk4c/dk4sto.h>
23 
24 
25 
26 
27 
28 
29 
30 #if DK4_HAVE_STRUCT_SOCKADDR_IN6
31 
32 /**	Compare IPv6 address structures.
33 	@param	left	Left address in comparison.
34 	@param	mask	Network mask to use, may be NULL.
35 	@param	right	Right address in comparison.
36 	@return	-1, 0 or 1 if l<r, l==r or l>r.
37 */
38 static
39 int
dk4socket_compare_in6_addr3(const struct in6_addr * left,const struct in6_addr * mask,const struct in6_addr * right)40 dk4socket_compare_in6_addr3(
41   const struct in6_addr	*left,
42   const struct in6_addr	*mask,
43   const struct in6_addr	*right
44 )
45 {
46   const unsigned char	*ucl;
47   const unsigned char	*ucm;
48   const unsigned char 	*ucr;
49   unsigned char  ul;
50   unsigned char  ur;
51   size_t	 i;
52 
53   int		 back = 0;
54   ucl = &(left->s6_addr[0]);
55   ucm = &(mask->s6_addr[0]);
56   ucr = &(right->s6_addr[0]);
57   for (i = 0; ((16 > i) && (0 == back)); i++) {
58     ul = ucl[i];
59     ur = ucr[i];
60     if (NULL != mask) {
61       ul &= ucm[i];
62       ur &= ucm[i];
63     }
64     if (ul > ur) {
65       back = 1;
66     } else {
67       if (ul < ur) {
68         back = -1;
69       }
70     }
71   }
72   return back;
73 }
74 
75 #endif
76 
77 
78 
79 int
dk4socket_allowed_peer_compare(const void * pl,const void * pr,int cr)80 dk4socket_allowed_peer_compare(
81   const void	*pl,
82   const void	*pr,
83   int		 cr
84 )
85 {
86   const dk4_allowed_peer_t	*ppl;
87   const dk4_allowed_peer_t	*ppr;
88   const struct sockaddr		*pso;
89   const struct sockaddr_in	*ps4;
90 #if DK4_HAVE_STRUCT_SOCKADDR_IN6
91   const struct sockaddr_in6	*ps6;
92 #endif
93   unsigned long			 ul1;
94   unsigned long			 ul2;
95   unsigned long			 ul3;
96   int				 back = 0;
97 
98   if (NULL != pl) {
99     if (NULL != pr) {
100       switch (cr) {
101         case 1: {
102 	  ppl = (const dk4_allowed_peer_t *)pl;
103 	  pso = (const struct sockaddr *)pr;
104 
105 	  if (ppl->af < pso->sa_family) {
106 	    back = -1;
107 	  } else {
108 	    if (ppl->af > pso->sa_family) {
109 	      back = 1;
110 	    }
111 	  }
112 	  if (0 == back) {
113 	    switch (ppl->af) {
114 	      case AF_INET : {
115 	        ul1 = (ppl->data).ipv4.ad.s_addr;
116 		ul3 = (ppl->data).ipv4.ma.s_addr;
117 		ps4 = (const struct sockaddr_in *)pso;
118 		ul2 = ps4->sin_addr.s_addr;
119 		ul1 = (unsigned long)dk4socket_ntohl((uint32_t)ul1);
120 		ul2 = (unsigned long)dk4socket_ntohl((uint32_t)ul2);
121 		ul3 = (unsigned long)dk4socket_ntohl((uint32_t)ul3);
122 
123 
124 
125 		ul1 &= ul3;
126 		ul2 &= ul3;
127 
128 
129 		if (ul1 > ul2) {
130 		  back = 1;
131 		} else {
132 		  if (ul1 < ul2) {
133 		    back = -1;
134 		  }
135 		}
136 	      } break;
137 #if DK4_HAVE_STRUCT_SOCKADDR_IN6
138 	      case AF_INET6 : {
139 	        ps6 = (const struct sockaddr_in6 *)pso;
140 		back = dk4socket_compare_in6_addr3(
141 		  &((ppl->data).ipv6.ad),
142 		  &((ppl->data).ipv6.ma),
143 		  &(ps6->sin6_addr)
144 		);
145 	      } break;
146 #endif
147 	    }
148 	  }
149 	} break;
150 	default : {
151 	  ppl = (const dk4_allowed_peer_t *)pl;
152 	  ppr = (const dk4_allowed_peer_t *)pr;
153 	  if (ppl->af < ppr->af) {
154 	    back = -1;
155 	  } else {
156 	    if (ppl->af > ppr->af) {
157 	      back = 1;
158 	    }
159 	  }
160 	  if (0 == back) {
161 	    switch (ppl->af) {
162 	      case AF_INET : {
163 	        ul1 = (ppl->data).ipv4.ad.s_addr;
164 		ul2 = (ppr->data).ipv4.ad.s_addr;
165 		ul1 = (unsigned long)dk4socket_ntohl((uint32_t)ul1);
166 		ul2 = (unsigned long)dk4socket_ntohl((uint32_t)ul2);
167 		if (ul1 > ul2) {
168 		  back = 1;
169 		} else {
170 		  if (ul1 < ul2) {
171 		    back = -1;
172 		  }
173 		}
174 	        ul1 = (ppl->data).ipv4.ma.s_addr;
175 		ul2 = (ppr->data).ipv4.ma.s_addr;
176 		ul1 = (unsigned long)dk4socket_ntohl((uint32_t)ul1);
177 		ul2 = (unsigned long)dk4socket_ntohl((uint32_t)ul2);
178 		if (ul1 > ul2) {
179 		  back = 1;
180 		} else {
181 		  if (ul1 < ul2) {
182 		    back = -1;
183 		  }
184 		}
185 	      } break;
186 #if DK4_HAVE_STRUCT_SOCKADDR_IN6
187 	      case AF_INET6 : {
188 		back = dk4socket_compare_in6_addr3(
189 		  &((ppl->data).ipv6.ad),
190 		  NULL,
191 		  &((ppr->data).ipv6.ad)
192 		);
193 		if (0 == back) {
194 		  back = dk4socket_compare_in6_addr3(
195 		    &((ppl->data).ipv6.ma),
196 		    NULL,
197 		    &((ppr->data).ipv6.ma)
198 		  );
199 		}
200 	      } break;
201 #endif
202 	    }
203 	  }
204 	} break;
205       }
206     } else { back= 1; }
207   } else {
208     if (NULL != pr) { back = -1; }
209   }
210   return back;
211 }
212 
213