X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/b280a1f47ef8d22b40db3d2737d4cb10de988ad6..1e8ae5ede66ba337ba6abbb4afad2b3319c1db74:/flist.c diff --git a/flist.c b/flist.c index 86bf4aa0..caca010f 100644 --- a/flist.c +++ b/flist.c @@ -51,6 +51,36 @@ static struct exclude_struct **local_exclude_list; static void clean_flist(struct file_list *flist, int strip_root); + +static void list_file_entry(struct file_struct *f) +{ + char perms[11] = "----------"; + char *perm_map = "rwxrwxrwx"; + int i; + + for (i=0;i<9;i++) { + if (f->mode & (1<mode)) perms[0] = 'l'; + if (S_ISDIR(f->mode)) perms[0] = 'd'; + if (S_ISBLK(f->mode)) perms[0] = 'b'; + if (S_ISCHR(f->mode)) perms[0] = 'c'; + if (S_ISSOCK(f->mode)) perms[0] = 's'; + if (S_ISFIFO(f->mode)) perms[0] = 'p'; + + if (preserve_links && S_ISLNK(f->mode)) { + rprintf(FINFO,"%s %11.0f %s %s -> %s\n", + perms, + (double)f->length, timestring(f->modtime), + f_name(f), f->link); + } else { + rprintf(FINFO,"%s %11.0f %s %s\n", + perms, + (double)f->length, timestring(f->modtime), f_name(f)); + } +} + + int link_stat(const char *Path, STRUCT_STAT *Buffer) { #if SUPPORT_LINKS @@ -200,7 +230,7 @@ static void send_file_entry(struct file_struct *file,int f,unsigned base_flags) last_gid = file->gid; last_time = file->modtime; - strlcpy(lastname,fname,MAXPATHLEN-1); + strlcpy(lastname,fname,MAXPATHLEN); lastname[MAXPATHLEN-1] = 0; } @@ -235,11 +265,11 @@ static void receive_file_entry(struct file_struct **fptr, if (l2 >= MAXPATHLEN-l1) overflow("receive_file_entry"); - strlcpy(thisname,lastname,l1); + strlcpy(thisname,lastname,l1+1); read_sbuf(f,&thisname[l1],l2); thisname[l1+l2] = 0; - strlcpy(lastname,thisname,MAXPATHLEN-1); + strlcpy(lastname,thisname,MAXPATHLEN); lastname[MAXPATHLEN-1] = 0; clean_fname(thisname); @@ -340,7 +370,7 @@ static struct file_struct *make_file(char *fname) char *p; char cleaned_name[MAXPATHLEN]; - strlcpy(cleaned_name, fname, MAXPATHLEN-1); + strlcpy(cleaned_name, fname, MAXPATHLEN); cleaned_name[MAXPATHLEN-1] = 0; clean_fname(cleaned_name); fname = cleaned_name; @@ -501,7 +531,7 @@ static void send_directory(int f,struct file_list *flist,char *dir) return; } - strlcpy(fname,dir,MAXPATHLEN-1); + strlcpy(fname,dir,MAXPATHLEN); l = strlen(fname); if (fname[l-1] != '/') { if (l == MAXPATHLEN-1) { @@ -510,7 +540,7 @@ static void send_directory(int f,struct file_list *flist,char *dir) closedir(d); return; } - strlcat(fname,"/", MAXPATHLEN-1); + strlcat(fname,"/", MAXPATHLEN); l++; } p = fname + strlen(fname); @@ -532,7 +562,7 @@ static void send_directory(int f,struct file_list *flist,char *dir) if (strcmp(dname,".")==0 || strcmp(dname,"..")==0) continue; - strlcpy(p,dname,MAXPATHLEN-(l+1)); + strlcpy(p,dname,MAXPATHLEN-l); send_file_name(f,flist,fname,recurse,0); } @@ -578,11 +608,11 @@ struct file_list *send_file_list(int f,int argc,char *argv[]) char fname2[MAXPATHLEN]; char *fname = fname2; - strlcpy(fname,argv[i],MAXPATHLEN-1); + strlcpy(fname,argv[i],MAXPATHLEN); l = strlen(fname); if (l != 1 && fname[l-1] == '/') { - strlcat(fname,".",MAXPATHLEN-1); + strlcat(fname,".",MAXPATHLEN); } if (link_stat(fname,&st) != 0) { @@ -614,7 +644,7 @@ struct file_list *send_file_list(int f,int argc,char *argv[]) thus getting their permissions right */ *p = 0; if (strcmp(lastpath,fname)) { - strlcpy(lastpath, fname, sizeof(lastpath)-1); + strlcpy(lastpath, fname, sizeof(lastpath)); *p = '/'; for (p=fname+1; (p=strchr(p,'/')); p++) { int copy_links_saved = copy_links; @@ -656,7 +686,7 @@ struct file_list *send_file_list(int f,int argc,char *argv[]) if (pop_dir(olddir) != 0) { rprintf(FERROR,"pop_dir %s : %s\n", dir,strerror(errno)); - exit_cleanup(1); + exit_cleanup(RERR_FILESELECT); } } } @@ -699,6 +729,7 @@ struct file_list *recv_file_list(int f) struct file_list *flist; unsigned char flags; int64 start_read; + extern int list_only; if (verbose && recurse && !am_server) { rprintf(FINFO,"receiving file list ... "); @@ -765,6 +796,14 @@ struct file_list *recv_file_list(int f) io_error |= read_int(f); } + if (list_only) { + int i; + for (i=0;icount;i++) { + list_file_entry(flist->files[i]); + } + } + + if (verbose > 2) rprintf(FINFO,"recv_file_list done\n"); @@ -895,10 +934,10 @@ static void clean_flist(struct file_list *flist, int strip_root) for (i=0;icount;i++) { rprintf(FINFO,"[%d] i=%d %s %s mode=0%o len=%d\n", getpid(), i, - flist->files[i]->dirname, - flist->files[i]->basename, + NS(flist->files[i]->dirname), + NS(flist->files[i]->basename), flist->files[i]->mode, - flist->files[i]->length); + (int)flist->files[i]->length); } } @@ -917,9 +956,11 @@ char *f_name(struct file_struct *f) n = (n+1)%10; if (f->dirname) { - slprintf(p, MAXPATHLEN-1, "%s/%s", f->dirname, f->basename); + strlcpy(p, f->dirname, MAXPATHLEN); + strlcat(p, "/", MAXPATHLEN); + strlcat(p, f->basename, MAXPATHLEN); } else { - strlcpy(p, f->basename, MAXPATHLEN-1); + strlcpy(p, f->basename, MAXPATHLEN); } return p;