@@ -80,14 +80,15 @@ struct net{
80
80
struct ip_addr mask ;
81
81
};
82
82
83
- union sockaddr_union {
83
+ struct sockaddr_union_struct {
84
+ union {
84
85
struct sockaddr s ;
85
86
struct sockaddr_in sin ;
86
87
struct sockaddr_in6 sin6 ;
88
+ } u ;
89
+ char hostname [256 ]; /* remote side hostname (used for TLS certificate hostname verification) */
87
90
};
88
91
89
-
90
-
91
92
enum si_flags { SI_NONE = 0 , SI_IS_IP = 1 , SI_IS_LO = 2 , SI_IS_MCAST = 4 ,
92
93
SI_IS_ANYCAST = 8 , SI_FRAG = 16 , SI_REUSEPORT = 32 };
93
94
@@ -99,7 +100,7 @@ struct receive_info {
99
100
int proto ;
100
101
unsigned int proto_reserved1 ; /*!< tcp stores the connection id here */
101
102
unsigned int proto_reserved2 ;
102
- union sockaddr_union src_su ; /*!< useful for replies*/
103
+ struct sockaddr_union_struct src_su ; /*!< useful for replies*/
103
104
struct socket_info * bind_address ; /*!< sock_info structure on which the msg was received*/
104
105
/* no need for dst_su yet */
105
106
};
@@ -108,7 +109,7 @@ struct receive_info {
108
109
struct dest_info {
109
110
int proto ;
110
111
unsigned int proto_reserved1 ; /*!< tcp stores the connection id here */
111
- union sockaddr_union to ;
112
+ struct sockaddr_union_struct to ;
112
113
struct socket_info * send_sock ;
113
114
};
114
115
@@ -130,10 +131,10 @@ struct socket_id {
130
131
131
132
/* len of the sockaddr */
132
133
#ifdef HAVE_SOCKADDR_SA_LEN
133
- #define sockaddru_len (su ) ((su).s.sa_len)
134
+ #define sockaddru_len (su ) ((su).u. s.sa_len)
134
135
#else
135
136
#define sockaddru_len (su ) \
136
- (((su).s.sa_family==AF_INET6)?sizeof(struct sockaddr_in6):\
137
+ (((su).u. s.sa_family==AF_INET6)?sizeof(struct sockaddr_in6):\
137
138
sizeof(struct sockaddr_in))
138
139
#endif /* HAVE_SOCKADDR_SA_LEN*/
139
140
@@ -154,7 +155,7 @@ struct socket_id {
154
155
struct ip_addr __ip; \
155
156
sockaddr2ip_addr( &__ip, (struct sockaddr*)_su ); \
156
157
_ip_char = ip_addr2a(&__ip); \
157
- _port_no = su_getport( (union sockaddr_union *)(void *)_su); \
158
+ _port_no = su_getport( (struct sockaddr_union_struct *)(void *)_su); \
158
159
} while(0)
159
160
160
161
@@ -246,73 +247,73 @@ static inline void sockaddr2ip_addr(struct ip_addr* ip, struct sockaddr* sa)
246
247
247
248
248
249
/*! \brief compare 2 sockaddr_unions */
249
- static inline int su_cmp (union sockaddr_union * s1 , union sockaddr_union * s2 )
250
+ static inline int su_cmp (struct sockaddr_union_struct * s1 , struct sockaddr_union_struct * s2 )
250
251
{
251
- if (s1 -> s .sa_family != s2 -> s .sa_family ) return 0 ;
252
- switch (s1 -> s .sa_family ){
252
+ if (s1 -> u . s .sa_family != s2 -> u . s .sa_family ) return 0 ;
253
+ switch (s1 -> u . s .sa_family ){
253
254
case AF_INET :
254
- return (s1 -> sin .sin_port == s2 -> sin .sin_port )&&
255
- (memcmp (& s1 -> sin .sin_addr , & s2 -> sin .sin_addr , 4 )== 0 );
255
+ return (s1 -> u . sin .sin_port == s2 -> u . sin .sin_port )&&
256
+ (memcmp (& s1 -> u . sin .sin_addr , & s2 -> u . sin .sin_addr , 4 )== 0 );
256
257
case AF_INET6 :
257
- return (s1 -> sin6 .sin6_port == s2 -> sin6 .sin6_port )&&
258
- (memcmp (& s1 -> sin6 .sin6_addr , & s2 -> sin6 .sin6_addr , 16 )== 0 );
258
+ return (s1 -> u . sin6 .sin6_port == s2 -> u . sin6 .sin6_port )&&
259
+ (memcmp (& s1 -> u . sin6 .sin6_addr , & s2 -> u . sin6 .sin6_addr , 16 )== 0 );
259
260
default :
260
261
LM_CRIT ("unknown address family %d\n" ,
261
- s1 -> s .sa_family );
262
+ s1 -> u . s .sa_family );
262
263
return 0 ;
263
264
}
264
265
}
265
266
266
267
267
268
268
269
/*! \brief gets the port number (host byte order) */
269
- static inline unsigned short su_getport (union sockaddr_union * su )
270
+ static inline unsigned short su_getport (struct sockaddr_union_struct * su )
270
271
{
271
272
if (su == 0 )
272
273
return 0 ;
273
274
274
- switch (su -> s .sa_family ){
275
+ switch (su -> u . s .sa_family ){
275
276
case AF_INET :
276
- return ntohs (su -> sin .sin_port );
277
+ return ntohs (su -> u . sin .sin_port );
277
278
case AF_INET6 :
278
- return ntohs (su -> sin6 .sin6_port );
279
+ return ntohs (su -> u . sin6 .sin6_port );
279
280
default :
280
- LM_CRIT ("unknown address family %d\n" , su -> s .sa_family );
281
+ LM_CRIT ("unknown address family %d\n" , su -> u . s .sa_family );
281
282
return 0 ;
282
283
}
283
284
}
284
285
285
286
/*! \brief sets the port number (host byte order) */
286
- static inline void su_setport (union sockaddr_union * su , unsigned short port )
287
+ static inline void su_setport (struct sockaddr_union_struct * su , unsigned short port )
287
288
{
288
- switch (su -> s .sa_family ){
289
+ switch (su -> u . s .sa_family ){
289
290
case AF_INET :
290
- su -> sin .sin_port = htons (port );
291
+ su -> u . sin .sin_port = htons (port );
291
292
break ;
292
293
case AF_INET6 :
293
- su -> sin6 .sin6_port = htons (port );
294
+ su -> u . sin6 .sin6_port = htons (port );
294
295
break ;
295
296
default :
296
- LM_CRIT ("unknown address family %d\n" , su -> s .sa_family );
297
+ LM_CRIT ("unknown address family %d\n" , su -> u . s .sa_family );
297
298
}
298
299
}
299
300
300
301
/*! \brief inits an ip_addr pointer from a sockaddr_union ip address */
301
- static inline void su2ip_addr (struct ip_addr * ip , union sockaddr_union * su )
302
+ static inline void su2ip_addr (struct ip_addr * ip , struct sockaddr_union_struct * su )
302
303
{
303
- switch (su -> s .sa_family ){
304
+ switch (su -> u . s .sa_family ){
304
305
case AF_INET :
305
306
ip -> af = AF_INET ;
306
307
ip -> len = 4 ;
307
- memcpy (ip -> u .addr , & su -> sin .sin_addr , 4 );
308
+ memcpy (ip -> u .addr , & su -> u . sin .sin_addr , 4 );
308
309
break ;
309
310
case AF_INET6 :
310
311
ip -> af = AF_INET6 ;
311
312
ip -> len = 16 ;
312
- memcpy (ip -> u .addr , & su -> sin6 .sin6_addr , 16 );
313
+ memcpy (ip -> u .addr , & su -> u . sin6 .sin6_addr , 16 );
313
314
break ;
314
315
default :
315
- LM_CRIT ("Unknown address family %d\n" , su -> s .sa_family );
316
+ LM_CRIT ("Unknown address family %d\n" , su -> u . s .sa_family );
316
317
ip -> af = 0 ;
317
318
ip -> len = 0 ;
318
319
}
@@ -325,26 +326,26 @@ static inline void su2ip_addr(struct ip_addr* ip, union sockaddr_union* su)
325
326
/*! \brief inits a struct sockaddr_union from a struct ip_addr and a port no
326
327
* \return 0 if ok, -1 on error (unknown address family)
327
328
* \note the port number is in host byte order */
328
- static inline int init_su ( union sockaddr_union * su ,
329
+ static inline int init_su ( struct sockaddr_union_struct * su ,
329
330
struct ip_addr * ip ,
330
331
unsigned short port )
331
332
{
332
- memset (su , 0 , sizeof (union sockaddr_union ));/*needed on freebsd*/
333
- su -> s .sa_family = ip -> af ;
333
+ memset (su , 0 , sizeof (struct sockaddr_union_struct ));/*needed on freebsd*/
334
+ su -> u . s .sa_family = ip -> af ;
334
335
switch (ip -> af ){
335
336
case AF_INET6 :
336
- memcpy (& su -> sin6 .sin6_addr , ip -> u .addr , ip -> len );
337
+ memcpy (& su -> u . sin6 .sin6_addr , ip -> u .addr , ip -> len );
337
338
#ifdef HAVE_SOCKADDR_SA_LEN
338
- su -> sin6 .sin6_len = sizeof (struct sockaddr_in6 );
339
+ su -> u . sin6 .sin6_len = sizeof (struct sockaddr_in6 );
339
340
#endif
340
- su -> sin6 .sin6_port = htons (port );
341
+ su -> u . sin6 .sin6_port = htons (port );
341
342
break ;
342
343
case AF_INET :
343
- memcpy (& su -> sin .sin_addr , ip -> u .addr , ip -> len );
344
+ memcpy (& su -> u . sin .sin_addr , ip -> u .addr , ip -> len );
344
345
#ifdef HAVE_SOCKADDR_SA_LEN
345
- su -> sin .sin_len = sizeof (struct sockaddr_in );
346
+ su -> u . sin .sin_len = sizeof (struct sockaddr_in );
346
347
#endif
347
- su -> sin .sin_port = htons (port );
348
+ su -> u . sin .sin_port = htons (port );
348
349
break ;
349
350
default :
350
351
LM_CRIT ("unknown address family %d\n" , ip -> af );
@@ -359,27 +360,27 @@ static inline int init_su( union sockaddr_union* su,
359
360
* the hostent structure and a port no. (host byte order)
360
361
* WARNING: no index overflow checks!
361
362
* \return 0 if ok, -1 on error (unknown address family) */
362
- static inline int hostent2su ( union sockaddr_union * su ,
363
+ static inline int hostent2su ( struct sockaddr_union_struct * su ,
363
364
struct hostent * he ,
364
365
unsigned int idx ,
365
366
unsigned short port )
366
367
{
367
- memset (su , 0 , sizeof (union sockaddr_union )); /*needed on freebsd*/
368
- su -> s .sa_family = he -> h_addrtype ;
368
+ memset (su , 0 , sizeof (struct sockaddr_union_struct )); /*needed on freebsd*/
369
+ su -> u . s .sa_family = he -> h_addrtype ;
369
370
switch (he -> h_addrtype ){
370
371
case AF_INET6 :
371
- memcpy (& su -> sin6 .sin6_addr , he -> h_addr_list [idx ], he -> h_length );
372
+ memcpy (& su -> u . sin6 .sin6_addr , he -> h_addr_list [idx ], he -> h_length );
372
373
#ifdef HAVE_SOCKADDR_SA_LEN
373
- su -> sin6 .sin6_len = sizeof (struct sockaddr_in6 );
374
+ su -> u . sin6 .sin6_len = sizeof (struct sockaddr_in6 );
374
375
#endif
375
- su -> sin6 .sin6_port = htons (port );
376
+ su -> u . sin6 .sin6_port = htons (port );
376
377
break ;
377
378
case AF_INET :
378
- memcpy (& su -> sin .sin_addr , he -> h_addr_list [idx ], he -> h_length );
379
+ memcpy (& su -> u . sin .sin_addr , he -> h_addr_list [idx ], he -> h_length );
379
380
#ifdef HAVE_SOCKADDR_SA_LEN
380
- su -> sin .sin_len = sizeof (struct sockaddr_in );
381
+ su -> u . sin .sin_len = sizeof (struct sockaddr_in );
381
382
#endif
382
- su -> sin .sin_port = htons (port );
383
+ su -> u . sin .sin_port = htons (port );
383
384
break ;
384
385
default :
385
386
LM_CRIT ("unknown address family %d\n" , he -> h_addrtype );
0 commit comments