- More ifdef INET and INET6.

- Use STDERR_FILENO + 1 instead of "3".
- Fix dprintf() in cvthname().
This commit is contained in:
hrs 2016-12-23 06:29:24 +00:00
parent adf70bc555
commit 3175084d4e

View File

@ -748,6 +748,7 @@ socklist_recv_sock(struct socklist *sl)
static void static void
unmapped(struct sockaddr *sa) unmapped(struct sockaddr *sa)
{ {
#if defined(INET) && defined(INET6)
struct sockaddr_in6 *sin6; struct sockaddr_in6 *sin6;
struct sockaddr_in sin; struct sockaddr_in sin;
@ -766,6 +767,10 @@ unmapped(struct sockaddr *sa)
memcpy(&sin.sin_addr, &sin6->sin6_addr.s6_addr[12], memcpy(&sin.sin_addr, &sin6->sin6_addr.s6_addr[12],
sizeof(sin.sin_addr)); sizeof(sin.sin_addr));
memcpy(sa, &sin, sizeof(sin)); memcpy(sa, &sin, sizeof(sin));
#else
if (sa == NULL)
return;
#endif
} }
static void static void
@ -1533,24 +1538,23 @@ cvthname(struct sockaddr *f)
sigset_t omask, nmask; sigset_t omask, nmask;
static char hname[NI_MAXHOST], ip[NI_MAXHOST]; static char hname[NI_MAXHOST], ip[NI_MAXHOST];
dprintf("cvthname(%d) len = %d, %zu\n", f->sa_family, f->sa_len, sizeof(struct sockaddr_in6)); dprintf("cvthname(%d) len = %d\n", f->sa_family, f->sa_len);
error = getnameinfo(f, f->sa_len, ip, sizeof(ip), NULL, 0, error = getnameinfo(f, f->sa_len, ip, sizeof(ip), NULL, 0,
NI_NUMERICHOST); NI_NUMERICHOST);
dprintf("cvthname(%s)\n", ip);
if (error) { if (error) {
dprintf("Malformed from address %s\n", gai_strerror(error)); dprintf("Malformed from address %s\n", gai_strerror(error));
return ("???"); return ("???");
} }
dprintf("cvthname(%s)\n", ip);
if (!resolve) if (!resolve)
return (ip); return (ip);
sigemptyset(&nmask); sigemptyset(&nmask);
sigaddset(&nmask, SIGHUP); sigaddset(&nmask, SIGHUP);
sigprocmask(SIG_BLOCK, &nmask, &omask); sigprocmask(SIG_BLOCK, &nmask, &omask);
error = getnameinfo((struct sockaddr *)f, error = getnameinfo(f, f->sa_len, hname, sizeof(hname),
((struct sockaddr *)f)->sa_len, NULL, 0, NI_NAMEREQD);
hname, sizeof hname, NULL, 0, NI_NAMEREQD);
sigprocmask(SIG_SETMASK, &omask, NULL); sigprocmask(SIG_SETMASK, &omask, NULL);
if (error) { if (error) {
dprintf("Host name for your address (%s) unknown\n", ip); dprintf("Host name for your address (%s) unknown\n", ip);
@ -2393,7 +2397,9 @@ allowaddr(char *s)
struct servent *se; struct servent *se;
int masklen = -1; int masklen = -1;
struct addrinfo hints, *res; struct addrinfo hints, *res;
#ifdef INET
in_addr_t *addrp, *maskp; in_addr_t *addrp, *maskp;
#endif
#ifdef INET6 #ifdef INET6
uint32_t *addr6p, *mask6p; uint32_t *addr6p, *mask6p;
#endif #endif
@ -2459,7 +2465,9 @@ allowaddr(char *s)
.ss_family = res->ai_family, .ss_family = res->ai_family,
.ss_len = res->ai_addrlen .ss_len = res->ai_addrlen
}; };
if (res->ai_family == AF_INET) { switch (res->ai_family) {
#ifdef INET
case AF_INET:
maskp = &sstosin(&ap->a_mask)->sin_addr.s_addr; maskp = &sstosin(&ap->a_mask)->sin_addr.s_addr;
addrp = &sstosin(&ap->a_addr)->sin_addr.s_addr; addrp = &sstosin(&ap->a_addr)->sin_addr.s_addr;
if (masklen < 0) { if (masklen < 0) {
@ -2481,9 +2489,14 @@ allowaddr(char *s)
} }
/* Lose any host bits in the network number. */ /* Lose any host bits in the network number. */
*addrp &= *maskp; *addrp &= *maskp;
} break;
#endif
#ifdef INET6 #ifdef INET6
else if (res->ai_family == AF_INET6 && masklen <= 128) { case AF_INET6:
if (masklen > 128) {
freeaddrinfo(res);
return (-1);
}
if (masklen < 0) if (masklen < 0)
masklen = 128; masklen = 128;
mask6p = (uint32_t *)&sstosin6(&ap->a_mask)->sin6_addr.s6_addr32[0]; mask6p = (uint32_t *)&sstosin6(&ap->a_mask)->sin6_addr.s6_addr32[0];
@ -2501,9 +2514,9 @@ allowaddr(char *s)
masklen -= 32; masklen -= 32;
} }
} }
} break;
#endif #endif
else { default:
freeaddrinfo(res); freeaddrinfo(res);
return (-1); return (-1);
} }
@ -2527,12 +2540,12 @@ allowaddr(char *s)
printf("allowaddr: rule "); printf("allowaddr: rule ");
if (ap->isnumeric) { if (ap->isnumeric) {
printf("numeric, "); printf("numeric, ");
getnameinfo((struct sockaddr *)&ap->a_addr, getnameinfo(sstosa(&ap->a_addr),
((struct sockaddr *)&ap->a_addr)->sa_len, (sstosa(&ap->a_addr))->sa_len,
ip, sizeof ip, NULL, 0, NI_NUMERICHOST); ip, sizeof ip, NULL, 0, NI_NUMERICHOST);
printf("addr = %s, ", ip); printf("addr = %s, ", ip);
getnameinfo((struct sockaddr *)&ap->a_mask, getnameinfo(sstosa(&ap->a_mask),
((struct sockaddr *)&ap->a_mask)->sa_len, (sstosa(&ap->a_mask))->sa_len,
ip, sizeof ip, NULL, 0, NI_NUMERICHOST); ip, sizeof ip, NULL, 0, NI_NUMERICHOST);
printf("mask = %s; ", ip); printf("mask = %s; ", ip);
} else { } else {
@ -2552,7 +2565,9 @@ validate(struct sockaddr *sa, const char *hname)
int i; int i;
char name[NI_MAXHOST], ip[NI_MAXHOST], port[NI_MAXSERV]; char name[NI_MAXHOST], ip[NI_MAXHOST], port[NI_MAXSERV];
struct allowedpeer *ap; struct allowedpeer *ap;
#ifdef INET
struct sockaddr_in *sin4, *a4p = NULL, *m4p = NULL; struct sockaddr_in *sin4, *a4p = NULL, *m4p = NULL;
#endif
#ifdef INET6 #ifdef INET6
struct sockaddr_in6 *sin6, *a6p = NULL, *m6p = NULL; struct sockaddr_in6 *sin6, *a6p = NULL, *m6p = NULL;
#endif #endif
@ -2602,7 +2617,8 @@ validate(struct sockaddr *sa, const char *hname)
dprintf("rejected in rule %d due to address family mismatch.\n", i); dprintf("rejected in rule %d due to address family mismatch.\n", i);
continue; continue;
} }
if (ap->a_addr.ss_family == AF_INET) { #ifdef INET
else if (ap->a_addr.ss_family == AF_INET) {
sin4 = satosin(sa); sin4 = satosin(sa);
a4p = satosin(&ap->a_addr); a4p = satosin(&ap->a_addr);
m4p = satosin(&ap->a_mask); m4p = satosin(&ap->a_mask);
@ -2612,6 +2628,7 @@ validate(struct sockaddr *sa, const char *hname)
continue; continue;
} }
} }
#endif
#ifdef INET6 #ifdef INET6
else if (ap->a_addr.ss_family == AF_INET6) { else if (ap->a_addr.ss_family == AF_INET6) {
sin6 = satosin6(sa); sin6 = satosin6(sa);
@ -2702,7 +2719,7 @@ p_open(const char *prog, pid_t *rpid)
dup2(pfd[0], STDIN_FILENO); dup2(pfd[0], STDIN_FILENO);
dup2(nulldesc, STDOUT_FILENO); dup2(nulldesc, STDOUT_FILENO);
dup2(nulldesc, STDERR_FILENO); dup2(nulldesc, STDERR_FILENO);
closefrom(3); closefrom(STDERR_FILENO + 1);
(void)execvp(_PATH_BSHELL, argv); (void)execvp(_PATH_BSHELL, argv);
_exit(255); _exit(255);