Report incoming connections from the process that accept() the connection instead of the handling process. This enables "Connection from"-reporting on Windows, where getpeername(0, ...) consistently fails. Signed-off-by: Erik Faye-Lund <kusmabite@xxxxxxxxx> --- daemon.c | 70 +++++++++++++++++++++++++++++++++++-------------------------- 1 files changed, 40 insertions(+), 30 deletions(-) diff --git a/daemon.c b/daemon.c index 82ba5c7..54bbec2 100644 --- a/daemon.c +++ b/daemon.c @@ -521,33 +521,6 @@ static int execute(struct sockaddr *addr) static char line[1000]; int pktlen, len, i; - if (addr) { - char addrbuf[256] = ""; - int port = -1; - - if (addr->sa_family == AF_INET) { - struct sockaddr_in *sin_addr = (void *) addr; - inet_ntop(addr->sa_family, &sin_addr->sin_addr, addrbuf, sizeof(addrbuf)); - port = ntohs(sin_addr->sin_port); -#ifndef NO_IPV6 - } else if (addr && addr->sa_family == AF_INET6) { - struct sockaddr_in6 *sin6_addr = (void *) addr; - - char *buf = addrbuf; - *buf++ = '['; *buf = '\0'; /* stpcpy() is cool */ - inet_ntop(AF_INET6, &sin6_addr->sin6_addr, buf, sizeof(addrbuf) - 1); - strcat(buf, "]"); - - port = ntohs(sin6_addr->sin6_port); -#endif - } - loginfo("Connection from %s:%d", addrbuf, port); - setenv("REMOTE_ADDR", addrbuf, 1); - } - else { - unsetenv("REMOTE_ADDR"); - } - alarm(init_timeout ? init_timeout : timeout); pktlen = packet_read_line(0, line, sizeof(line)); alarm(0); @@ -676,10 +649,35 @@ static void check_dead_children(void) cradle = &blanket->next; } +static char *get_addrstr(int *port, struct sockaddr *addr) +{ + static char addrbuf[256] = ""; + if (addr->sa_family == AF_INET) { + struct sockaddr_in *sin_addr = (void *) addr; + inet_ntop(addr->sa_family, &sin_addr->sin_addr, addrbuf, sizeof(addrbuf)); + *port = ntohs(sin_addr->sin_port); +#ifndef NO_IPV6 + } else if (addr && addr->sa_family == AF_INET6) { + struct sockaddr_in6 *sin6_addr = (void *) addr; + + char *buf = addrbuf; + *buf++ = '['; *buf = '\0'; /* stpcpy() is cool */ + inet_ntop(AF_INET6, &sin6_addr->sin6_addr, buf, sizeof(addrbuf) - 1); + strcat(buf, "]"); + + *port = ntohs(sin6_addr->sin6_port); +#endif + } + return addrbuf; +} + char **cld_argv; static void handle(int incoming, struct sockaddr *addr, int addrlen) { struct child_process cld = { 0 }; + char *addrstr, envbuf[300] = "REMOTE_ADDR="; + char *env[] = { envbuf, NULL }; + int port = -1; if (max_connections && live_children >= max_connections) { kill_some_child(); @@ -692,14 +690,21 @@ static void handle(int incoming, struct sockaddr *addr, int addrlen) } } + addrstr = get_addrstr(&port, addr); + strcat(envbuf, addrstr); + + cld.env = (const char **)env; cld.argv = (const char **)cld_argv; cld.in = incoming; cld.out = dup(incoming); if (start_command(&cld)) logerror("unable to fork"); - else + else { + loginfo("[%"PRIuMAX"] Connection from %s:%d", + (uintmax_t)cld.pid, addrstr, port); add_child(&cld, addr, addrlen); + } close(incoming); } @@ -1164,8 +1169,13 @@ int main(int argc, char **argv) if (inetd_mode && !freopen("/dev/null", "w", stderr)) die_errno("failed to redirect stderr to /dev/null"); - if (getpeername(0, peer, &slen)) - peer = NULL; + if (!getpeername(0, peer, &slen)) { + int port = -1; + char *addrstr = get_addrstr(&port, peer); + setenv("REMOTE_ADDR", addrstr, 1); + loginfo("[%"PRIuMAX"] Connection from %s:%d", + (uintmax_t)getpid(), addrstr, port); + } return execute(peer); } -- 1.7.3.1.51.ge462f.dirty -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html