Doc.
[rsync/rsync.git] / socket.c
index 137d480..84d17f5 100644 (file)
--- 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,20 @@ 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 fake a connection to a daemon
+ * for testing -- not for the normal case of running SSH.
+ *
+ * @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 (socketpair_tcp(fd) != 0) {
                rprintf (FERROR, RSYNC_NAME
                         ": socketpair_tcp failed (%s)\n",
@@ -832,10 +843,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]);