check whether there is a / before a : in the rsync command line. If
[rsync/rsync.git] / main.c
diff --git a/main.c b/main.c
index 3c4d99c..2d1b35e 100644 (file)
--- a/main.c
+++ b/main.c
@@ -63,29 +63,29 @@ static void report(int f)
        }
 
        if (do_stats) {
-               printf("\nNumber of files: %d\n", stats.num_files);
-               printf("Number of files transferred: %d\n", 
+               rprintf(FINFO,"\nNumber of files: %d\n", stats.num_files);
+               rprintf(FINFO,"Number of files transferred: %d\n", 
                       stats.num_transferred_files);
-               printf("Total file size: %.0f bytes\n", 
+               rprintf(FINFO,"Total file size: %.0f bytes\n", 
                       (double)stats.total_size);
-               printf("Total transferred file size: %.0f bytes\n", 
+               rprintf(FINFO,"Total transferred file size: %.0f bytes\n", 
                       (double)stats.total_transferred_size);
-               printf("Literal data: %.0f bytes\n", 
+               rprintf(FINFO,"Literal data: %.0f bytes\n", 
                       (double)stats.literal_data);
-               printf("Matched data: %.0f bytes\n", 
+               rprintf(FINFO,"Matched data: %.0f bytes\n", 
                       (double)stats.matched_data);
-               printf("File list size: %d\n", stats.flist_size);
-               printf("Total bytes written: %.0f\n", 
+               rprintf(FINFO,"File list size: %d\n", stats.flist_size);
+               rprintf(FINFO,"Total bytes written: %.0f\n", 
                       (double)stats.total_written);
-               printf("Total bytes read: %.0f\n\n", 
+               rprintf(FINFO,"Total bytes read: %.0f\n\n", 
                       (double)stats.total_read);
        }
        
-       printf("wrote %.0f bytes  read %.0f bytes  %.2f bytes/sec\n",
+       rprintf(FINFO,"wrote %.0f bytes  read %.0f bytes  %.2f bytes/sec\n",
               (double)stats.total_written,
               (double)stats.total_read,
               (stats.total_written+stats.total_read)/(0.5 + (t-starttime)));
-       printf("total size is %.0f  speedup is %.2f\n",
+       rprintf(FINFO,"total size is %.0f  speedup is %.2f\n",
               (double)stats.total_size,
               (1.0*stats.total_size)/(stats.total_written+stats.total_read));
 
@@ -172,6 +172,10 @@ static char *get_local_name(struct file_list *flist,char *name)
        STRUCT_STAT st;
        extern int orig_umask;
 
+       if (verbose > 2)
+               rprintf(FINFO,"get_local_name count=%d %s\n", 
+                       flist->count, name);
+
        if (do_stat(name,&st) == 0) {
                if (S_ISDIR(st.st_mode)) {
                        if (!push_dir(name, 0)) {
@@ -198,7 +202,8 @@ static char *get_local_name(struct file_list *flist,char *name)
                rprintf(FERROR,"mkdir %s : %s (1)\n",name,strerror(errno));
                exit_cleanup(1);
        } else {
-               rprintf(FINFO,"created directory %s\n",name);
+               if (verbose > 0)
+                       rprintf(FINFO,"created directory %s\n",name);
        }
 
        if (!push_dir(name, 0)) {
@@ -287,9 +292,6 @@ static int do_recv(int f_in,int f_out,struct file_list *flist,char *local_name)
                recv_files(f_in,flist,local_name,recv_pipe[1]);
                report(f_in);
 
-               if (verbose > 3)
-                       rprintf(FINFO,"do_recv waiting on %d\n",pid);
-
                io_flush();
                _exit(0);
        }
@@ -300,6 +302,8 @@ static int do_recv(int f_in,int f_out,struct file_list *flist,char *local_name)
 
        set_nonblocking(f_out);
 
+       io_start_buffering(f_out);
+
        generate_files(f_out,flist,local_name,recv_pipe[0]);
 
        io_flush();
@@ -428,6 +432,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[])
 {
@@ -441,7 +459,7 @@ static int start_client(int argc, char *argv[])
        extern int am_sender;
        extern char *shell_cmd;
 
-       p = strchr(argv[0],':');
+       p = find_colon(argv[0]);
 
        if (p) {
                if (p[1] == ':') {
@@ -463,7 +481,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] == ':') {
@@ -511,11 +529,6 @@ static int start_client(int argc, char *argv[])
        
        pid = do_cmd(shell_cmd,shell_machine,shell_user,shell_path,&f_in,&f_out);
        
-#if HAVE_SETLINEBUF
-       setlinebuf(stdout);
-       setlinebuf(stderr);
-#endif
-
        ret = client_run(f_in, f_out, pid, argc, argv);
 
        fflush(stdout);