added --stats option for verbose stats on the file transfer
[rsync/rsync.git] / main.c
diff --git a/main.c b/main.c
index fa4fe0f..6fd96a7 100644 (file)
--- a/main.c
+++ b/main.c
@@ -20,7 +20,8 @@
 #include "rsync.h"
 
 time_t starttime = 0;
-int64 total_size = 0;
+
+struct stats stats;
 
 extern int csum_length;
 
@@ -28,16 +29,17 @@ extern int verbose;
 
 static void report(int f)
 {
-       int64 in,out,tsize;
        time_t t = time(NULL);
        extern int am_server;
        extern int am_sender;
        extern int am_daemon;
+       extern int do_stats;
 
        if (am_daemon) {
                syslog(LOG_INFO,"wrote %.0f bytes  read %.0f bytes  total size %.0f\n",
-                      (double)write_total(),(double)read_total(),
-                      (double)total_size);
+                      (double)stats.total_written,
+                      (double)stats.total_read,
+                      (double)stats.total_size);
                if (f == -1 || !am_sender) return;
        }
 
@@ -46,26 +48,46 @@ static void report(int f)
        if (am_server && !am_sender) return;
 
        if (am_server && am_sender) {
-               write_longint(f,read_total());
-               write_longint(f,write_total());
-               write_longint(f,total_size);
+               write_longint(f,stats.total_read);
+               write_longint(f,stats.total_written);
+               write_longint(f,stats.total_size);
                return;
        }
     
-       if (am_sender) {
-               in = read_total();
-               out = write_total();
-               tsize = total_size;
-       } else {
-               out = read_longint(f);
-               in = read_longint(f);
-               tsize = read_longint(f);
+       if (!am_sender) {
+               int64 r;
+               stats.total_written = read_longint(f);
+               r = read_longint(f);
+               stats.total_size = read_longint(f);
+               stats.total_read = r;
+       }
+
+       if (do_stats) {
+               printf("\nNumber of files: %d\n", stats.num_files);
+               printf("Number of files transferred: %d\n", 
+                      stats.num_transferred_files);
+               printf("Total file size: %.0f bytes\n", 
+                      (double)stats.total_size);
+               printf("Total transferred file size: %.0f bytes\n", 
+                      (double)stats.total_transferred_size);
+               printf("Literal data: %.0f bytes\n", 
+                      (double)stats.literal_data);
+               printf("Matched data: %.0f bytes\n", 
+                      (double)stats.matched_data);
+               printf("File list size: %d\n", stats.flist_size);
+               printf("Total bytes written: %.0f\n", 
+                      (double)stats.total_written);
+               printf("Total bytes read: %.0f\n\n", 
+                      (double)stats.total_read);
        }
        
        printf("wrote %.0f bytes  read %.0f bytes  %.2f bytes/sec\n",
-              (double)out,(double)in,(in+out)/(0.5 + (t-starttime)));
+              (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",
-              (double)tsize,(1.0*tsize)/(in+out));
+              (double)stats.total_size,
+              (1.0*stats.total_size)/(stats.total_written+stats.total_read));
 }
 
 
@@ -498,6 +520,8 @@ int main(int argc,char *argv[])
        starttime = time(NULL);
        am_root = (getuid() == 0);
 
+       memset(&stats, 0, sizeof(stats));
+
        if (argc < 2) {
                usage(FERROR);
                exit_cleanup(1);