Skip to content
This repository was archived by the owner on Dec 21, 2022. It is now read-only.

Commit a8a7791

Browse files
committed
Fix compilation with recent gcc and glibc
1 parent 8e99f4c commit a8a7791

File tree

1 file changed

+32
-34
lines changed

1 file changed

+32
-34
lines changed

skd.c

+32-34
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
#define _GNU_SOURCE
2+
13
#include <sys/types.h>
24
#include <sys/socket.h>
35
#include <sys/stat.h>
@@ -291,7 +293,12 @@ void acceptloop(int sock, char **cmdv, int verbose, int maxchildren,
291293
char host[64], port[6];
292294
int nc;
293295
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;
295302
socklen_t addrsize;
296303

297304
sigemptyset(&mask_child);
@@ -302,28 +309,24 @@ void acceptloop(int sock, char **cmdv, int verbose, int maxchildren,
302309
sigsuspend(&mask_restore);
303310
sigprocmask(SIG_SETMASK, &mask_restore, NULL);
304311
addrsize = sizeof(fromaddr);
305-
nc = accept(sock, (struct sockaddr *) &fromaddr, &addrsize);
312+
nc = accept(sock, (struct sockaddr *) &fromaddr.ss, &addrsize);
306313
if (nc >= 0) {
307-
switch (((struct sockaddr *) &fromaddr)->sa_family) {
314+
switch (fromaddr.s.sa_family) {
308315
case AF_INET:
309316
setenv("PROTO", "TCP", 1);
310317
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));
316321
setenv("TCPLOCALIP", host, 1);
317322
setenv("TCPLOCALPORT", port, 1);
318323
} else {
319324
unsetenv("TCPLOCALIP");
320325
unsetenv("TCPLOCALPORT");
321326
}
322327
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));
327330
setenv("TCPREMOTEIP", host, 1);
328331
setenv("TCPREMOTEPORT", port, 1);
329332
if (verbose)
@@ -333,22 +336,18 @@ void acceptloop(int sock, char **cmdv, int verbose, int maxchildren,
333336
case AF_INET6:
334337
setenv("PROTO", "TCP", 1);
335338
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));
341342
setenv("TCPLOCALIP", host, 1);
342343
setenv("TCPLOCALPORT", port, 1);
343344
} else {
344345
unsetenv("TCPLOCALIP");
345346
unsetenv("TCPLOCALPORT");
346347
}
347348
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));
352351
setenv("TCPREMOTEIP", host, 1);
353352
setenv("TCPREMOTEPORT", port, 1);
354353
if (verbose)
@@ -422,7 +421,12 @@ void recvloop(int sock, char **cmdv, int verbose) {
422421
char host[64];
423422
int flags;
424423
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;
426430
socklen_t addrsize;
427431

428432
sigemptyset(&mask_child);
@@ -435,28 +439,22 @@ void recvloop(int sock, char **cmdv, int verbose) {
435439
addrsize = sizeof(fromaddr);
436440
flags = fcntl(sock, F_GETFL, 0);
437441
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) {
443444
case AF_INET:
444445
setenv("PROTO", "UDP", 1);
445446
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));
448448
fprintf(stderr, "Received initial datagram from [%s]:%d\n", host,
449-
ntohs(((struct sockaddr_in *) &fromaddr)->sin_port));
449+
ntohs(fromaddr.s4.sin_port));
450450
}
451451
break;
452452
case AF_INET6:
453453
setenv("PROTO", "UDP", 1);
454454
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));
458456
fprintf(stderr, "Received initial datagram from [%s]:%d\n", host,
459-
ntohs(((struct sockaddr_in6 *) &fromaddr)->sin6_port));
457+
ntohs(fromaddr.s6.sin6_port));
460458
}
461459
break;
462460
default:

0 commit comments

Comments
 (0)