From 649d65edf3ce535d151681b5900554432b5deeb0 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Wed, 25 Mar 1998 03:34:52 +0000 Subject: [PATCH] - fixed a bug wth the handling of duplicate names with the new fist structures - send intermediate directories when using --relative to ensure the permissions are set correctly --- flist.c | 212 +++++++++++++++++++++++++++++++------------------------- 1 file changed, 116 insertions(+), 96 deletions(-) diff --git a/flist.c b/flist.c index 94935f4b..a4ae248c 100644 --- a/flist.c +++ b/flist.c @@ -423,7 +423,8 @@ static struct file_struct *make_file(char *fname) -static void send_file_name(int f,struct file_list *flist,char *fname) +static void send_file_name(int f,struct file_list *flist,char *fname, + int recursive) { struct file_struct *file; @@ -448,7 +449,7 @@ static void send_file_name(int f,struct file_list *flist,char *fname) send_file_entry(file,f); } - if (S_ISDIR(file->mode) && recurse) { + if (S_ISDIR(file->mode) && recursive) { char **last_exclude_list = local_exclude_list; send_directory(f,flist,f_name(file)); local_exclude_list = last_exclude_list; @@ -501,7 +502,7 @@ static void send_directory(int f,struct file_list *flist,char *dir) strcmp(di->d_name,"..")==0) continue; strncpy(p,di->d_name,MAXPATHLEN-(l+1)); - send_file_name(f,flist,fname); + send_file_name(f,flist,fname,recurse); } closedir(d); @@ -511,107 +512,126 @@ static void send_directory(int f,struct file_list *flist,char *dir) struct file_list *send_file_list(int f,int argc,char *argv[]) { - int i,l; - struct stat st; - char *p,*dir; - char dbuf[MAXPATHLEN]; - struct file_list *flist; - - if (verbose && recurse && !am_server && f != -1) { - fprintf(FINFO,"building file list ... "); - fflush(FINFO); - } - - flist = (struct file_list *)malloc(sizeof(flist[0])); - if (!flist) out_of_memory("send_file_list"); - - flist->count=0; - flist->malloced = 1000; - flist->files = (struct file_struct **)malloc(sizeof(flist->files[0])* - flist->malloced); - if (!flist->files) out_of_memory("send_file_list"); - - for (i=0;icount=0; + flist->malloced = 1000; + flist->files = (struct file_struct **)malloc(sizeof(flist->files[0])* + flist->malloced); + if (!flist->files) out_of_memory("send_file_list"); - if (link_stat(fname,&st) != 0) { - fprintf(FERROR,"%s : %s\n",fname,strerror(errno)); - continue; - } + for (i=0;i= 15) { - send_uid_list(f); - } + if (verbose && recurse && !am_server && f != -1) + fprintf(FINFO,"done\n"); + + clean_flist(flist); + + /* now send the uid/gid list. This was introduced in protocol + version 15 */ + if (f != -1 && remote_version >= 15) { + send_uid_list(f); + } - return flist; + return flist; } @@ -730,7 +750,6 @@ static void free_file(struct file_struct *file) if (file->link) free(file->link); if (file->sum) free(file->sum); bzero((char *)file, sizeof(*file)); - free(file); } @@ -742,6 +761,7 @@ void flist_free(struct file_list *flist) int i; for (i=1;icount;i++) { free_file(flist->files[i]); + free(flist->files[i]); } bzero((char *)flist->files, sizeof(flist->files[0])*flist->count); free(flist->files); @@ -767,13 +787,13 @@ void clean_flist(struct file_list *flist) for (i=1;icount;i++) { if (flist->files[i]->basename && + flist->files[i-1]->basename && strcmp(f_name(flist->files[i]), f_name(flist->files[i-1])) == 0) { if (verbose > 1 && !am_server) fprintf(FERROR,"removing duplicate name %s from file list %d\n", f_name(flist->files[i-1]),i-1); free_file(flist->files[i]); - flist->files[i] = NULL; } } } @@ -788,7 +808,7 @@ char *f_name(struct file_struct *f) static int n; char *p = names[n]; - if (!f) return NULL; + if (!f || !f->basename) return NULL; n = (n+1)%10; -- 2.34.1