X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/9a5a86734fdebb816d81b3276a82b8befc65a740..5d2640376e3b5b21f6049161b55baf6f4e2acce8:/socket.c diff --git a/socket.c b/socket.c index 137d4800..88228046 100644 --- a/socket.c +++ b/socket.c @@ -33,6 +33,8 @@ #include "rsync.h" +static const char default_name[] = "UNKNOWN"; + static int lookup_name(const struct sockaddr_storage *ss, socklen_t ss_len, char *name_buf, size_t name_buf_len, @@ -40,7 +42,7 @@ static int lookup_name(const struct sockaddr_storage *ss, static int check_name(const struct sockaddr_storage *ss, socklen_t ss_len, - const char *name_buf, + char *name_buf, const char *port_buf); /* Establish a proxy connection on an open socket to a web roxy by @@ -610,6 +612,10 @@ static int get_sockaddr_family(const struct sockaddr_storage *ss) * * The name is statically cached so that repeated lookups are quick, * so there is a limit of one lookup per customer. + * + * If anything goes wrong, including the name->addr->name check, then + * we just use "UNKNOWN", so you can use that value in hosts allow + * lines. **/ char *client_name(int fd) { @@ -621,6 +627,7 @@ char *client_name(int fd) if (initialised) return name_buf; + strcpy(name_buf, default_name); initialised = 1; if (getpeername(fd, (struct sockaddr *)&ss, &ss_len)) { @@ -646,7 +653,6 @@ static int lookup_name(const struct sockaddr_storage *ss, char *port_buf, size_t port_buf_len) { int name_err; - const char *def = "UNKNOWN"; #ifdef INET6 if (get_sockaddr_family(ss) == AF_INET6 && @@ -678,12 +684,13 @@ static int lookup_name(const struct sockaddr_storage *ss, #endif /* reverse lookup */ - if (!(name_err = getnameinfo((struct sockaddr *) ss, ss_len, - name_buf, name_buf_len, - port_buf, port_buf_len, - NI_NAMEREQD | NI_NUMERICSERV))) { - strcpy(name_buf, def); - rprintf(FERROR, RSYNC_NAME ": reverse name lookup failed: %s\n", + name_err = getnameinfo((struct sockaddr *) ss, ss_len, + name_buf, name_buf_len, + port_buf, port_buf_len, + NI_NAMEREQD | NI_NUMERICSERV); + if (name_err != 0) { + strcpy(name_buf, default_name); + rprintf(FERROR, RSYNC_NAME ": name lookup failed: %s\n", gai_strerror(name_err)); return name_err; } @@ -698,7 +705,7 @@ static int lookup_name(const struct sockaddr_storage *ss, * we don't abort the connection but just emit a warning. */ static int check_name(const struct sockaddr_storage *ss, socklen_t ss_len, - const char *name_buf, + char *name_buf, const char *port_buf) { struct addrinfo hints, *res, *res0; @@ -710,8 +717,7 @@ static int check_name(const struct sockaddr_storage *ss, hints.ai_socktype = SOCK_STREAM; error = getaddrinfo(name_buf, port_buf, &hints, &res0); if (error) { - /* We still use the name found by the reverse lookup, - * but emit a warning. */ + strcpy(name_buf, default_name); rprintf(FERROR, RSYNC_NAME ": forward name lookup for %s:%s failed: %s\n", name_buf, port_buf, @@ -731,6 +737,7 @@ static int check_name(const struct sockaddr_storage *ss, } if (res == NULL) { + strcpy(name_buf, default_name); /* We hit the end of the list without finding an * address that was the same as ss. */ rprintf(FERROR, RSYNC_NAME @@ -810,16 +817,26 @@ static int socketpair_tcp(int fd[2]) } -/******************************************************************* -run a program on a local tcp socket, this is used to launch smbd -when regression testing -the return value is a socket which is attached to a subprocess -running "prog". stdin and stdout are attached. stderr is left -attached to the original stderr - ******************************************************************/ + +/** + * Run a program on a local tcp socket, so that we can talk to it's + * stdin and stdout. This is used to launch ssh and similar + * connection helper programs for rsync. + * + * @return a socket which is attached to a subprocess running + * "prog". stdin and stdout are attached. stderr is left attached to + * the original stderr + **/ int sock_exec(const char *prog) { int fd[2]; + + if (verbose > 0) { + rprintf(FINFO, RSYNC_NAME + ": open connection using \"%s\"\n", + prog); + } + if (socketpair_tcp(fd) != 0) { rprintf (FERROR, RSYNC_NAME ": socketpair_tcp failed (%s)\n", @@ -832,10 +849,12 @@ int sock_exec(const char *prog) close(1); dup(fd[1]); dup(fd[1]); - if (verbose > 3) + if (verbose > 3) { + /* Can't use rprintf because we've forked. */ fprintf (stderr, RSYNC_NAME ": execute socket program \"%s\"\n", prog); + } exit (system (prog)); } close (fd[1]);