If an error occurs, print an explanatory string rather
[rsync/rsync.git] / clientserver.c
index 459e222..41b8dfa 100644 (file)
@@ -1,5 +1,6 @@
-/* 
-   Copyright (C) Andrew Tridgell 1998
+/* -*- c-file-style: "linux"; -*-
+   
+   Copyright (C) 1998-2000 by Andrew Tridgell
    
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -16,7 +17,7 @@
    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 */
 
-/* the socket based protocol for setting up a connection wit rsyncd */
+/* the socket based protocol for setting up a connection with rsyncd */
 
 #include "rsync.h"
 
@@ -27,6 +28,11 @@ extern int rsync_port;
 char *auth_user;
 int sanitize_paths = 0;
 
+
+/*
+ * Run a client connected to an rsyncd.  The alternative to this
+ * function for remote-shell connections is do_cmd.
+ */
 int start_socket_client(char *host, char *path, int argc, char *argv[])
 {
        int fd, i;
@@ -37,8 +43,25 @@ int start_socket_client(char *host, char *path, int argc, char *argv[])
        extern int remote_version;
        extern int am_sender;
        extern struct in_addr socket_address;
-       extern int blocking_io;
+       extern char *shell_cmd;
 
+       if (argc == 0 && !am_sender) {
+               extern int list_only;
+               list_only = 1;
+       }
+
+        /* This is just a friendliness enhancement: if the connection
+         * is to an rsyncd then there is no point specifying the -e option.
+         * Note that this is only set if the -e was explicitly specified,
+         * not if the environment variable just happens to be set.
+         * See http://lists.samba.org/pipermail/rsync/2000-September/002744.html
+         */
+        if (shell_cmd) {
+                rprintf(FERROR, "WARNING: --rsh or -e option ignored when "
+                        "connecting to rsync daemon\n");
+                /* continue */
+        }
+        
        if (*path == '/') {
                rprintf(FERROR,"ERROR: The remote path must start with a module name\n");
                return -1;
@@ -54,8 +77,6 @@ int start_socket_client(char *host, char *path, int argc, char *argv[])
        if (!user) user = getenv("USER");
        if (!user) user = getenv("LOGNAME");
 
-       blocking_io = 1;
-
        fd = open_socket_out(host, rsync_port, &socket_address);
        if (fd == -1) {
                exit_cleanup(RERR_SOCKETIO);
@@ -204,24 +225,24 @@ static int rsync_module(int fd, int i)
        p = lp_exclude(i);
        add_exclude_line(p);
 
-       log_open();
+       log_init();
 
        if (use_chroot) {
                if (chroot(lp_path(i))) {
-                       rprintf(FERROR,"chroot %s failed\n", lp_path(i));
+                       rsyserr(FERROR, errno, "chroot %s failed", lp_path(i));
                        io_printf(fd,"@ERROR: chroot failed\n");
                        return -1;
                }
 
                if (!push_dir("/", 0)) {
-                       rprintf(FERROR,"chdir %s failed\n", lp_path(i));
+                        rsyserr(FERROR, errno, "chdir %s failed\n", lp_path(i));
                        io_printf(fd,"@ERROR: chdir failed\n");
                        return -1;
                }
 
        } else {
                if (!push_dir(lp_path(i), 0)) {
-                       rprintf(FERROR,"chdir %s failed\n", lp_path(i));
+                       rsyserr(FERROR, errno, "chdir %s failed\n", lp_path(i));
                        io_printf(fd,"@ERROR: chdir failed\n");
                        return -1;
                }
@@ -230,13 +251,13 @@ static int rsync_module(int fd, int i)
 
        if (am_root) {
                if (setgid(gid)) {
-                       rprintf(FERROR,"setgid %d failed\n", gid);
+                       rsyserr(FERROR, errno, "setgid %d failed", gid);
                        io_printf(fd,"@ERROR: setgid failed\n");
                        return -1;
                }
 
                if (setuid(uid)) {
-                       rprintf(FERROR,"setuid %d failed\n", uid);
+                       rsyserr(FERROR, errno, "setuid %d failed", uid);
                        io_printf(fd,"@ERROR: setuid failed\n");
                        return -1;
                }
@@ -447,7 +468,7 @@ int daemon_main(void)
                exit_cleanup(RERR_SYNTAX);
        }
 
-       log_open();
+       log_init();
 
        rprintf(FINFO,"rsyncd version %s starting\n",VERSION);
 
@@ -459,7 +480,7 @@ int daemon_main(void)
                if ((fd = do_open(lp_pid_file(), O_WRONLY|O_CREAT|O_TRUNC,
                                        0666 & ~orig_umask)) == -1) {
                    cleanup_set_pid(0);
-                   rprintf(FLOG,"failed to create pid file %s\n", pid_file);
+                   rsyserr(FLOG, errno, "failed to create pid file %s", pid_file);
                    exit_cleanup(RERR_FILEIO);
                }
                slprintf(pidbuf, sizeof(pidbuf), "%d\n", pid);