X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/3d38277706a5155d57563d1221e7233d8159470a..c48b22c8583f6d6c55c6a6f6001cf4fdcc20aed1:/flist.c diff --git a/flist.c b/flist.c index e102076e..4ad30964 100644 --- a/flist.c +++ b/flist.c @@ -55,7 +55,7 @@ static struct file_struct null_file; static void clean_flist(struct file_list *flist, int strip_root); -struct string_area *string_area_new(int size) +static struct string_area *string_area_new(int size) { struct string_area *a; @@ -65,12 +65,12 @@ struct string_area *string_area_new(int size) a->current = a->base = malloc(size); if (!a->current) out_of_memory("string_area_new buffer"); a->end = a->base + size; - a->next = 0; + a->next = NULL; return a; } -void string_area_free(struct string_area *a) +static void string_area_free(struct string_area *a) { struct string_area *next; @@ -80,7 +80,7 @@ void string_area_free(struct string_area *a) } } -char *string_area_malloc(struct string_area **ap, int size) +static char *string_area_malloc(struct string_area **ap, int size) { char *p; struct string_area *a; @@ -100,7 +100,7 @@ char *string_area_malloc(struct string_area **ap, int size) return p; } -char *string_area_strdup(struct string_area **ap, const char *src) +static char *string_area_strdup(struct string_area **ap, const char *src) { char* dest = string_area_malloc(ap, strlen(src) + 1); return strcpy(dest, src); @@ -469,7 +469,8 @@ static int skip_filesystem(char *fname, STRUCT_STAT *st) #define MALLOC(ap, i) (ap ? string_area_malloc(ap, i) : malloc(i)) /* create a file_struct for a named file */ -struct file_struct *make_file(int f, char *fname, struct string_area **ap) +struct file_struct *make_file(int f, char *fname, struct string_area **ap, + int noexcludes) { struct file_struct *file; STRUCT_STAT st; @@ -478,6 +479,7 @@ struct file_struct *make_file(int f, char *fname, struct string_area **ap) char cleaned_name[MAXPATHLEN]; char linkbuf[MAXPATHLEN]; extern int delete_excluded; + extern int module_id; strlcpy(cleaned_name, fname, MAXPATHLEN); cleaned_name[MAXPATHLEN-1] = 0; @@ -496,6 +498,9 @@ struct file_struct *make_file(int f, char *fname, struct string_area **ap) return NULL; } + /* we use noexcludes from backup.c */ + if (noexcludes) goto skip_excludes; + if (S_ISDIR(st.st_mode) && !recurse) { rprintf(FINFO,"skipping directory %s\n",fname); return NULL; @@ -509,7 +514,13 @@ struct file_struct *make_file(int f, char *fname, struct string_area **ap) /* f is set to -1 when calculating deletion file list */ if (((f != -1) || !delete_excluded) && !match_file_name(fname,&st)) return NULL; - + + + if (lp_ignore_nonreadable(module_id) && access(fname, R_OK) != 0) + return NULL; + + skip_excludes: + if (verbose > 2) rprintf(FINFO,"make_file(%d,%s)\n",f,fname); @@ -523,7 +534,7 @@ struct file_struct *make_file(int f, char *fname, struct string_area **ap) if (lastdir && strcmp(fname, lastdir)==0) { file->dirname = lastdir; } else { - file->dirname = STRDUP(ap, fname); + file->dirname = strdup(fname); lastdir = file->dirname; } file->basename = STRDUP(ap, p+1); @@ -568,7 +579,7 @@ struct file_struct *make_file(int f, char *fname, struct string_area **ap) if (lastdir && strcmp(lastdir, flist_dir)==0) { file->basedir = lastdir; } else { - file->basedir = STRDUP(ap, flist_dir); + file->basedir = strdup(flist_dir); lastdir = file->basedir; } } else { @@ -588,7 +599,7 @@ void send_file_name(int f,struct file_list *flist,char *fname, { struct file_struct *file; - file = make_file(f,fname, &flist->string_area); + file = make_file(f,fname, &flist->string_area, 0); if (!file) return; @@ -1004,7 +1015,7 @@ struct file_list *flist_new() #if ARENA_SIZE > 0 flist->string_area = string_area_new(0); #else - flist->string_area = 0; + flist->string_area = NULL; #endif return flist; }