Daemon supports forward-DNS lookups for simple hostnames
[rsync/rsync.git] / clientserver.c
index 878254f..8b6b896 100644 (file)
@@ -164,7 +164,7 @@ static int exchange_protocols(int f_in, int f_out, char *buf, size_t bufsiz, int
        }
 
        /* This strips the \n. */
-       if (!read_line_old(f_in, buf, bufsiz)) {
+       if (!read_line_old(f_in, buf, bufsiz, 0)) {
                if (am_client)
                        rprintf(FERROR, "rsync: did not see server greeting\n");
                return -1;
@@ -265,7 +265,10 @@ int start_inband_exchange(int f_in, int f_out, const char *user, int argc, char
                if (strncmp(*argv, modname, modlen) == 0
                 && argv[0][modlen] == '\0')
                        sargs[sargc++] = modname; /* we send "modname/" */
-               else
+               else if (**argv == '-') {
+                       if (asprintf(sargs + sargc++, "./%s", *argv) < 0)
+                               out_of_memory("start_inband_exchange");
+               } else
                        sargs[sargc++] = *argv;
                argv++;
                argc--;
@@ -283,7 +286,7 @@ int start_inband_exchange(int f_in, int f_out, const char *user, int argc, char
        kluge_around_eof = list_only && protocol_version < 25 ? 1 : 0;
 
        while (1) {
-               if (!read_line_old(f_in, line, sizeof line)) {
+               if (!read_line_old(f_in, line, sizeof line, 0)) {
                        rprintf(FERROR, "rsync: didn't get server startup line\n");
                        return -1;
                }
@@ -512,7 +515,7 @@ static int rsync_module(int f_in, int f_out, int i, const char *addr, const char
        set_env_str("RSYNC_HOST_NAME", host);
        set_env_str("RSYNC_HOST_ADDR", addr);
 
-       if (!allow_access(addr, host, lp_hosts_allow(i), lp_hosts_deny(i))) {
+       if (!allow_access(addr, &host, i)) {
                rprintf(FLOG, "rsync denied on module %s from %s (%s)\n",
                        name, host, addr);
                if (!lp_list(i))
@@ -544,6 +547,7 @@ static int rsync_module(int f_in, int f_out, int i, const char *addr, const char
                return -1;
        }
 
+       read_only = lp_read_only(i); /* may also be overridden by auth_server() */
        auth_user = auth_server(f_in, f_out, i, host, addr, "@RSYNCD: AUTHREQD ");
 
        if (!auth_user) {
@@ -554,9 +558,6 @@ static int rsync_module(int f_in, int f_out, int i, const char *addr, const char
 
        module_id = i;
 
-       if (lp_read_only(i))
-               read_only = 1;
-
        if (lp_transfer_logging(i) && !logfile_format)
                logfile_format = lp_log_format(i);
        if (log_format_has(logfile_format, 'i'))
@@ -686,6 +687,9 @@ static int rsync_module(int f_in, int f_out, int i, const char *addr, const char
                                return -1;
                        }
                        if (pid) {
+                               close(f_in);
+                               if (f_out != f_in)
+                                       close(f_out);
                                set_env_num("RSYNC_PID", (long)pid);
                                if (wait_process(pid, &status, 0) < 0)
                                        status = -1;
@@ -1031,7 +1035,7 @@ int start_daemon(int f_in, int f_out)
                return -1;
 
        line[0] = 0;
-       if (!read_line_old(f_in, line, sizeof line))
+       if (!read_line_old(f_in, line, sizeof line, 0))
                return -1;
 
        if (!*line || strcmp(line, "#list") == 0) {