1
+ #define _GNU_SOURCE
2
+
1
3
#include <sys/types.h>
2
4
#include <sys/socket.h>
3
5
#include <sys/stat.h>
@@ -291,7 +293,12 @@ void acceptloop(int sock, char **cmdv, int verbose, int maxchildren,
291
293
char host [64 ], port [6 ];
292
294
int nc ;
293
295
sigset_t mask_child , mask_restore ;
294
- struct sockaddr_storage fromaddr , myaddr ;
296
+ union {
297
+ struct sockaddr s ;
298
+ struct sockaddr_in s4 ;
299
+ struct sockaddr_in6 s6 ;
300
+ struct sockaddr_storage ss ;
301
+ } fromaddr , myaddr ;
295
302
socklen_t addrsize ;
296
303
297
304
sigemptyset (& mask_child );
@@ -302,28 +309,24 @@ void acceptloop(int sock, char **cmdv, int verbose, int maxchildren,
302
309
sigsuspend (& mask_restore );
303
310
sigprocmask (SIG_SETMASK , & mask_restore , NULL );
304
311
addrsize = sizeof (fromaddr );
305
- nc = accept (sock , (struct sockaddr * ) & fromaddr , & addrsize );
312
+ nc = accept (sock , (struct sockaddr * ) & fromaddr . ss , & addrsize );
306
313
if (nc >= 0 ) {
307
- switch ((( struct sockaddr * ) & fromaddr ) -> sa_family ) {
314
+ switch (fromaddr . s . sa_family ) {
308
315
case AF_INET :
309
316
setenv ("PROTO" , "TCP" , 1 );
310
317
addrsize = sizeof (myaddr );
311
- if (getsockname (nc , (struct sockaddr * ) & myaddr , & addrsize ) == 0 ) {
312
- inet_ntop (AF_INET , & ((struct sockaddr_in * ) & myaddr )-> sin_addr ,
313
- host , sizeof (host ));
314
- snprintf (port , sizeof (port ), "%d" ,
315
- ntohs (((struct sockaddr_in * ) & myaddr )-> sin_port ));
318
+ if (getsockname (nc , & myaddr .s , & addrsize ) == 0 ) {
319
+ inet_ntop (AF_INET , & myaddr .s4 .sin_addr , host , sizeof (host ));
320
+ snprintf (port , sizeof (port ), "%d" , ntohs (myaddr .s4 .sin_port ));
316
321
setenv ("TCPLOCALIP" , host , 1 );
317
322
setenv ("TCPLOCALPORT" , port , 1 );
318
323
} else {
319
324
unsetenv ("TCPLOCALIP" );
320
325
unsetenv ("TCPLOCALPORT" );
321
326
}
322
327
addrsize = sizeof (fromaddr );
323
- inet_ntop (AF_INET , & ((struct sockaddr_in * ) & fromaddr )-> sin_addr ,
324
- host , sizeof (host ));
325
- snprintf (port , sizeof (port ), "%d" ,
326
- ntohs (((struct sockaddr_in * ) & fromaddr )-> sin_port ));
328
+ inet_ntop (AF_INET , & fromaddr .s4 .sin_addr , host , sizeof (host ));
329
+ snprintf (port , sizeof (port ), "%d" , ntohs (fromaddr .s4 .sin_port ));
327
330
setenv ("TCPREMOTEIP" , host , 1 );
328
331
setenv ("TCPREMOTEPORT" , port , 1 );
329
332
if (verbose )
@@ -333,22 +336,18 @@ void acceptloop(int sock, char **cmdv, int verbose, int maxchildren,
333
336
case AF_INET6 :
334
337
setenv ("PROTO" , "TCP" , 1 );
335
338
addrsize = sizeof (myaddr );
336
- if (getsockname (nc , (struct sockaddr * ) & myaddr , & addrsize ) == 0 ) {
337
- inet_ntop (AF_INET6 , & ((struct sockaddr_in6 * ) & myaddr )-> sin6_addr ,
338
- host , sizeof (host ));
339
- snprintf (port , sizeof (port ), "%d" ,
340
- ntohs (((struct sockaddr_in6 * ) & myaddr )-> sin6_port ));
339
+ if (getsockname (nc , & myaddr .s , & addrsize ) == 0 ) {
340
+ inet_ntop (AF_INET6 , & myaddr .s6 .sin6_addr , host , sizeof (host ));
341
+ snprintf (port , sizeof (port ), "%d" , ntohs (myaddr .s6 .sin6_port ));
341
342
setenv ("TCPLOCALIP" , host , 1 );
342
343
setenv ("TCPLOCALPORT" , port , 1 );
343
344
} else {
344
345
unsetenv ("TCPLOCALIP" );
345
346
unsetenv ("TCPLOCALPORT" );
346
347
}
347
348
addrsize = sizeof (fromaddr );
348
- inet_ntop (AF_INET6 , & ((struct sockaddr_in6 * ) & fromaddr )-> sin6_addr ,
349
- host , sizeof (host ));
350
- snprintf (port , sizeof (port ), "%d" ,
351
- ntohs (((struct sockaddr_in6 * ) & fromaddr )-> sin6_port ));
349
+ inet_ntop (AF_INET6 , & fromaddr .s6 .sin6_addr , host , sizeof (host ));
350
+ snprintf (port , sizeof (port ), "%d" , ntohs (fromaddr .s6 .sin6_port ));
352
351
setenv ("TCPREMOTEIP" , host , 1 );
353
352
setenv ("TCPREMOTEPORT" , port , 1 );
354
353
if (verbose )
@@ -422,7 +421,12 @@ void recvloop(int sock, char **cmdv, int verbose) {
422
421
char host [64 ];
423
422
int flags ;
424
423
sigset_t mask_child , mask_restore ;
425
- struct sockaddr_storage fromaddr ;
424
+ union {
425
+ struct sockaddr s ;
426
+ struct sockaddr_in s4 ;
427
+ struct sockaddr_in6 s6 ;
428
+ struct sockaddr_storage ss ;
429
+ } fromaddr ;
426
430
socklen_t addrsize ;
427
431
428
432
sigemptyset (& mask_child );
@@ -435,28 +439,22 @@ void recvloop(int sock, char **cmdv, int verbose) {
435
439
addrsize = sizeof (fromaddr );
436
440
flags = fcntl (sock , F_GETFL , 0 );
437
441
fcntl (sock , F_SETFL , flags & ~O_NONBLOCK );
438
- if (recvfrom (sock , NULL , 0 , MSG_PEEK , (struct sockaddr * ) & fromaddr ,
439
- & addrsize ) >= 0 ) {
440
-
441
-
442
- switch (((struct sockaddr * ) & fromaddr )-> sa_family ) {
442
+ if (recvfrom (sock , NULL , 0 , MSG_PEEK , & fromaddr .s , & addrsize ) >= 0 ) {
443
+ switch (fromaddr .s .sa_family ) {
443
444
case AF_INET :
444
445
setenv ("PROTO" , "UDP" , 1 );
445
446
if (verbose ) {
446
- inet_ntop (AF_INET , & ((struct sockaddr_in * ) & fromaddr )-> sin_addr ,
447
- host , sizeof (host ));
447
+ inet_ntop (AF_INET , & fromaddr .s4 .sin_addr , host , sizeof (host ));
448
448
fprintf (stderr , "Received initial datagram from [%s]:%d\n" , host ,
449
- ntohs ((( struct sockaddr_in * ) & fromaddr ) -> sin_port ));
449
+ ntohs (fromaddr . s4 . sin_port ));
450
450
}
451
451
break ;
452
452
case AF_INET6 :
453
453
setenv ("PROTO" , "UDP" , 1 );
454
454
if (verbose ) {
455
- inet_ntop (AF_INET6 ,
456
- & ((struct sockaddr_in6 * ) & fromaddr )-> sin6_addr ,
457
- host , sizeof (host ));
455
+ inet_ntop (AF_INET6 , & fromaddr .s6 .sin6_addr , host , sizeof (host ));
458
456
fprintf (stderr , "Received initial datagram from [%s]:%d\n" , host ,
459
- ntohs ((( struct sockaddr_in6 * ) & fromaddr ) -> sin6_port ));
457
+ ntohs (fromaddr . s6 . sin6_port ));
460
458
}
461
459
break ;
462
460
default :
0 commit comments