added the --safe-links option to disallow symlinks outside the
[rsync/rsync.git] / flist.c
diff --git a/flist.c b/flist.c
index 138894f..78b2c85 100644 (file)
--- a/flist.c
+++ b/flist.c
 
 #include "rsync.h"
 
+extern struct stats stats;
+
 extern int csum_length;
 
 extern int verbose;
 extern int am_server;
 extern int always_checksum;
-extern int64 total_size;
 
 extern int cvs_exclude;
 
@@ -210,7 +211,7 @@ static void receive_file_entry(struct file_struct **fptr,
 
   file = (struct file_struct *)malloc(sizeof(*file));
   if (!file) out_of_memory("receive_file_entry");
-  bzero((char *)file,sizeof(*file));
+  memset((char *)file, 0, sizeof(*file));
   (*fptr) = file;
 
   if (l2 >= MAXPATHLEN-l1) overflow("receive_file_entry");
@@ -324,7 +325,7 @@ static struct file_struct *make_file(char *fname)
        clean_fname(cleaned_name);
        fname = cleaned_name;
 
-       bzero(sum,SUM_LENGTH);
+       memset(sum,0,SUM_LENGTH);
 
        if (link_stat(fname,&st) != 0) {
                io_error = 1;
@@ -351,7 +352,7 @@ static struct file_struct *make_file(char *fname)
        
        file = (struct file_struct *)malloc(sizeof(*file));
        if (!file) out_of_memory("make_file");
-       bzero((char *)file,sizeof(*file));
+       memset((char *)file,0,sizeof(*file));
 
        if ((p = strrchr(fname,'/'))) {
                static char *lastdir;
@@ -421,7 +422,7 @@ static struct file_struct *make_file(char *fname)
        }
 
        if (!S_ISDIR(st.st_mode))
-               total_size += st.st_size;
+               stats.total_size += st.st_size;
 
        return file;
 }
@@ -525,12 +526,15 @@ struct file_list *send_file_list(int f,int argc,char *argv[])
        char *p,*dir;
        char lastpath[MAXPATHLEN]="";
        struct file_list *flist;
+       int64 start_write;
 
        if (verbose && recurse && !am_server && f != -1) {
                rprintf(FINFO,"building file list ... ");
                rflush(FINFO);
        }
 
+       start_write = stats.total_written;
+
        flist = (struct file_list *)malloc(sizeof(flist[0]));
        if (!flist) out_of_memory("send_file_list");
 
@@ -651,6 +655,8 @@ struct file_list *send_file_list(int f,int argc,char *argv[])
 
        if (f != -1) {
                io_end_buffering(f);
+               stats.flist_size = stats.total_written - start_write;
+               stats.num_files = flist->count;
        }
 
        if (verbose > 2)
@@ -664,12 +670,15 @@ struct file_list *recv_file_list(int f)
 {
   struct file_list *flist;
   unsigned char flags;
+  int64 start_read;
 
   if (verbose && recurse && !am_server) {
     rprintf(FINFO,"receiving file list ... ");
     rflush(FINFO);
   }
 
+  start_read = stats.total_read;
+
   flist = (struct file_list *)malloc(sizeof(flist[0]));
   if (!flist)
     goto oom;
@@ -700,7 +709,7 @@ struct file_list *recv_file_list(int f)
     receive_file_entry(&flist->files[i],flags,f);
 
     if (S_ISREG(flist->files[i]->mode))
-      total_size += flist->files[i]->length;
+           stats.total_size += flist->files[i]->length;
 
     flist->count++;
 
@@ -731,6 +740,9 @@ struct file_list *recv_file_list(int f)
   if (verbose > 2)
     rprintf(FINFO,"recv_file_list done\n");
 
+  stats.flist_size = stats.total_read - start_read;
+  stats.num_files = flist->count;
+
   return flist;
 
 oom:
@@ -745,8 +757,8 @@ int file_compare(struct file_struct **f1,struct file_struct **f2)
        if (!(*f1)->basename) return -1;
        if (!(*f2)->basename) return 1;
        if ((*f1)->dirname == (*f2)->dirname)
-               return strcmp((*f1)->basename, (*f2)->basename);
-       return strcmp(f_name(*f1),f_name(*f2));
+               return u_strcmp((*f1)->basename, (*f2)->basename);
+       return u_strcmp(f_name(*f1),f_name(*f2));
 }
 
 
@@ -782,7 +794,7 @@ static void free_file(struct file_struct *file)
        if (file->basename) free(file->basename);
        if (file->link) free(file->link);
        if (file->sum) free(file->sum);
-       bzero((char *)file, sizeof(*file));
+       memset((char *)file, 0, sizeof(*file));
 }
 
 
@@ -796,9 +808,9 @@ void flist_free(struct file_list *flist)
                free_file(flist->files[i]);
                free(flist->files[i]);
        }       
-       bzero((char *)flist->files, sizeof(flist->files[0])*flist->count);
+       memset((char *)flist->files, 0, sizeof(flist->files[0])*flist->count);
        free(flist->files);
-       bzero((char *)flist, sizeof(*flist));
+       memset((char *)flist, 0, sizeof(*flist));
        free(flist);
 }