added --backup-dir option from Bob Edwards
[rsync/rsync.git] / clientserver.c
index ace360b..8c55807 100644 (file)
@@ -25,6 +25,7 @@ extern int read_only;
 extern int verbose;
 extern int rsync_port;
 char *auth_user;
+int sanitize_paths = 0;
 
 int start_socket_client(char *host, char *path, int argc, char *argv[])
 {
@@ -35,6 +36,7 @@ int start_socket_client(char *host, char *path, int argc, char *argv[])
        char *p, *user=NULL;
        extern int remote_version;
        extern int am_sender;
+       extern struct in_addr socket_address;
 
        if (*path == '/') {
                rprintf(FERROR,"ERROR: The remote path must start with a module name\n");
@@ -51,7 +53,7 @@ int start_socket_client(char *host, char *path, int argc, char *argv[])
        if (!user) user = getenv("USER");
        if (!user) user = getenv("LOGNAME");
 
-       fd = open_socket_out(host, rsync_port);
+       fd = open_socket_out(host, rsync_port, &socket_address);
        if (fd == -1) {
                exit_cleanup(RERR_SOCKETIO);
        }
@@ -99,7 +101,7 @@ int start_socket_client(char *host, char *path, int argc, char *argv[])
        }
        io_printf(fd,"\n");
 
-       if (remote_version > 17 && !am_sender)
+       if (remote_version >= 22 || (remote_version > 17 && !am_sender))
                io_start_multiplex_in(fd);
 
        return client_run(fd, fd, -1, argc, argv);
@@ -221,6 +223,7 @@ static int rsync_module(int fd, int i)
                        io_printf(fd,"@ERROR: chdir failed\n");
                        return -1;
                }
+               sanitize_paths = 1;
        }
 
        if (am_root) {
@@ -262,7 +265,7 @@ static int rsync_module(int fd, int i)
                                request = strdup(p);
                                start_glob++;
                        }
-                       glob_expand(name, argv, &argc, MAX_ARGS, !use_chroot);
+                       glob_expand(name, argv, &argc, MAX_ARGS);
                } else {
                        argc++;
                }
@@ -276,7 +279,7 @@ static int rsync_module(int fd, int i)
                }
        }
 
-       if (!use_chroot) {
+       if (sanitize_paths) {
                /*
                 * Note that this is applied to all parameters, whether or not
                 *    they are filenames, but no other legal parameters contain
@@ -285,7 +288,7 @@ static int rsync_module(int fd, int i)
                 *    and which aren't.
                 */
                for (i = 1; i < argc; i++) {
-                       sanitize_path(argv[i]);
+                       sanitize_path(argv[i], NULL);
                }
        }
 
@@ -313,9 +316,17 @@ static int rsync_module(int fd, int i)
        argp = argv + optind;
        optind = 0;
 
-       if (remote_version > 17 && am_sender)
+       if (remote_version >= 22 || (remote_version > 17 && am_sender))
                io_start_multiplex_out(fd);
 
+       if (read_only) {
+               extern int am_sender;
+               if (!am_sender) {
+                       rprintf(FERROR,"ERROR: module is read only\n");
+                       return -1;
+               }
+       }
+
        if (!ret) {
                option_error();
        }
@@ -431,8 +442,6 @@ int daemon_main(void)
                        open("/dev/null", O_RDWR);
                }
 
-               set_nonblocking(STDIN_FILENO);
-
                return start_daemon(STDIN_FILENO);
        }