if no local destination is provided for the transfer then provide
[rsync/rsync.git] / main.c
diff --git a/main.c b/main.c
index 1717c53..0e379aa 100644 (file)
--- a/main.c
+++ b/main.c
@@ -36,10 +36,7 @@ static void report(int f)
        extern int do_stats;
 
        if (am_daemon) {
-               syslog(LOG_INFO,"wrote %.0f bytes  read %.0f bytes  total size %.0f\n",
-                      (double)stats.total_written,
-                      (double)stats.total_read,
-                      (double)stats.total_size);
+               log_exit(0);
                if (f == -1 || !am_sender) return;
        }
 
@@ -250,15 +247,15 @@ static void do_server_sender(int f_in, int f_out, int argc,char *argv[])
                argv[0] = ".";
        }
        
+       set_nonblocking(f_out);
+       if (f_in != f_out)
+               set_nonblocking(f_in);
+               
        flist = send_file_list(f_out,argc,argv);
        if (!flist || flist->count == 0) {
                exit_cleanup(0);
        }
 
-       set_nonblocking(f_out);
-       if (f_in != f_out)
-               set_nonblocking(f_in);
-               
        send_files(flist,f_out,f_in);
        report(f_out);
        io_flush();
@@ -288,6 +285,7 @@ static int do_recv(int f_in,int f_out,struct file_list *flist,char *local_name)
                if (f_in != f_out) close(f_out);
 
                set_nonblocking(f_in);
+               set_nonblocking(recv_pipe[1]);
 
                recv_files(f_in,flist,local_name,recv_pipe[1]);
                report(f_in);
@@ -301,6 +299,7 @@ static int do_recv(int f_in,int f_out,struct file_list *flist,char *local_name)
        if (f_in != f_out) close(f_in);
 
        set_nonblocking(f_out);
+       set_nonblocking(recv_pipe[0]);
 
        io_start_buffering(f_out);
 
@@ -362,8 +361,12 @@ void start_server(int f_in, int f_out, int argc, char *argv[])
        extern int cvs_exclude;
        extern int am_sender;
 
+       set_nonblocking(f_out);
+       if (f_in != f_out)
+               set_nonblocking(f_in);
+                       
        setup_protocol(f_out, f_in);
-       
+
        if (am_sender) {
                recv_exclude_list(f_in);
                if (cvs_exclude)
@@ -381,6 +384,7 @@ int client_run(int f_in, int f_out, int pid, int argc, char *argv[])
        int status = 0, status2 = 0;
        char *local_name = NULL;
        extern int am_sender;
+       extern int list_only;
 
        setup_protocol(f_out,f_in);
        
@@ -409,6 +413,8 @@ int client_run(int f_in, int f_out, int pid, int argc, char *argv[])
                report(-1);
                exit_cleanup(status);
        }
+
+       if (argc == 0) list_only = 1;
        
        send_exclude_list(f_out);
        
@@ -432,6 +438,20 @@ int client_run(int f_in, int f_out, int pid, int argc, char *argv[])
        return status | status2;
 }
 
+static char *find_colon(char *s)
+{
+       char *p, *p2;
+
+       p = strchr(s,':');
+       if (!p) return NULL;
+       
+       /* now check to see if there is a / in the string before the : - if there is then
+          discard the colon on the assumption that the : is part of a filename */
+       p2 = strchr(s,'/');
+       if (p2 && p2 < p) return NULL;
+
+       return p;
+}
 
 static int start_client(int argc, char *argv[])
 {
@@ -445,7 +465,21 @@ static int start_client(int argc, char *argv[])
        extern int am_sender;
        extern char *shell_cmd;
 
-       p = strchr(argv[0],':');
+       if (strncasecmp(URL_PREFIX, argv[0], strlen(URL_PREFIX)) == 0) {
+               char *host, *path;
+
+               host = argv[0] + strlen(URL_PREFIX);
+               p = strchr(host,'/');
+               if (p) {
+                       *p = 0;
+                       path = p+1;
+               } else {
+                       path="";
+               }
+               return start_socket_client(host, path, argc-1, argv+1);
+       }
+
+       p = find_colon(argv[0]);
 
        if (p) {
                if (p[1] == ':') {
@@ -453,7 +487,7 @@ static int start_client(int argc, char *argv[])
                        return start_socket_client(argv[0], p+2, argc-1, argv+1);
                }
 
-               if (argc < 2) {
+               if (argc < 1) {
                        usage(FERROR);
                        exit_cleanup(1);
                }
@@ -467,7 +501,7 @@ static int start_client(int argc, char *argv[])
        } else {
                am_sender = 1;
 
-               p = strchr(argv[argc-1],':');
+               p = find_colon(argv[argc-1]);
                if (!p) {
                        local_server = 1;
                } else if (p[1] == ':') {
@@ -508,7 +542,7 @@ static int start_client(int argc, char *argv[])
                        shell_path?shell_path:"");
        }
        
-       if (!am_sender && argc != 1) {
+       if (!am_sender && argc > 1) {
                usage(FERROR);
                exit_cleanup(1);
        }
@@ -524,7 +558,7 @@ static int start_client(int argc, char *argv[])
 }
 
 
-RETSIGTYPE sigusr1_handler(int val) {
+static RETSIGTYPE sigusr1_handler(int val) {
        exit_cleanup(1);
 }
 
@@ -552,7 +586,9 @@ int main(int argc,char *argv[])
           carried across */
        orig_umask = (int)umask(0);
 
-       parse_arguments(argc, argv);
+       if (!parse_arguments(argc, argv)) {
+               exit_cleanup(1);
+       }
 
        argc -= optind;
        argv += optind;
@@ -562,6 +598,7 @@ int main(int argc,char *argv[])
        signal(SIGINT,SIGNAL_CAST sig_int);
        signal(SIGPIPE,SIGNAL_CAST sig_int);
        signal(SIGHUP,SIGNAL_CAST sig_int);
+       signal(SIGTERM,SIGNAL_CAST sig_int);
 
        if (am_daemon) {
                return daemon_main();