Split code to generate "rwx-----" strings into lib/permstring.c so it
[rsync/rsync.git] / flist.c
diff --git a/flist.c b/flist.c
index 13d5048..d9b0da7 100644 (file)
--- a/flist.c
+++ b/flist.c
@@ -1,6 +1,7 @@
 /* 
    Copyright (C) Andrew Tridgell 1996
    Copyright (C) Paul Mackerras 1996
+   Copyright (C) 2001 by Martin Pool <mbp@samba.org>
    
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -111,24 +112,14 @@ static char *string_area_strdup(struct string_area **ap, const char *src)
 
 static void list_file_entry(struct file_struct *f)
 {
-       char perms[11] = "----------";
-       char *perm_map = "rwxrwxrwx";
-       int i;
+       char perms[11];
 
        if (!f->basename)
                /* this can happen if duplicate names were removed */
                return;
 
-       for (i=0;i<9;i++) {
-               if (f->mode & (1<<i)) perms[9-i] = perm_map[8-i];
-       }
-       if (S_ISLNK(f->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';
-       
+       permstring(perms, f->mode);
+
        if (preserve_links && S_ISLNK(f->mode)) {
                rprintf(FINFO,"%s %11.0f %s %s -> %s\n", 
                        perms, 
@@ -185,12 +176,18 @@ int link_stat(const char *Path, STRUCT_STAT *Buffer)
   This function is used to check if a file should be included/excluded
   from the list of files based on its name and type etc
  */
-static int match_file_name(char *fname,STRUCT_STAT *st)
+static int check_exclude_file(int f,char *fname,STRUCT_STAT *st)
 {
-  if (check_exclude(fname,local_exclude_list,st)) {
-    return 0;
-  }
-  return 1;
+       extern int delete_excluded;
+
+       /* f is set to -1 when calculating deletion file list */
+       if ((f == -1) && delete_excluded) {
+               return 0;
+       }
+       if (check_exclude(fname,local_exclude_list,st)) {
+               return 1;
+       }
+       return 0;
 }
 
 /* used by the one_file_system code */
@@ -479,7 +476,6 @@ struct file_struct *make_file(int f, char *fname, struct string_area **ap,
        char *p;
        char cleaned_name[MAXPATHLEN];
        char linkbuf[MAXPATHLEN];
-       extern int delete_excluded;
        extern int module_id;
 
        strlcpy(cleaned_name, fname, MAXPATHLEN);
@@ -490,17 +486,21 @@ struct file_struct *make_file(int f, char *fname, struct string_area **ap,
        }
        fname = cleaned_name;
 
-       /* f is set to -1 when calculating deletion file list */
-       if (((f != -1) || !delete_excluded) && !noexcludes && !match_file_name(fname,&st))
-               return NULL;
-
-
        memset(sum,0,SUM_LENGTH);
 
        if (readlink_stat(fname,&st,linkbuf) != 0) {
+               int save_errno = errno;
+               if ((errno == ENOENT) && copy_links && !noexcludes) {
+                       /* symlink pointing nowhere, see if excluded */
+                       memset((char *)&st, 0, sizeof(st));
+                       if (check_exclude_file(f,fname,&st)) {
+                               /* file is excluded anyway, ignore silently */
+                               return NULL;
+                       }
+               }
                io_error = 1;
                rprintf(FERROR,"readlink %s: %s\n",
-                       fname,strerror(errno));
+                       fname,strerror(save_errno));
                return NULL;
        }
 
@@ -517,6 +517,9 @@ struct file_struct *make_file(int f, char *fname, struct string_area **ap,
                        return NULL;
        }
        
+       if (check_exclude_file(f,fname,&st))
+               return NULL;
+
 
        if (lp_ignore_nonreadable(module_id) && access(fname, R_OK) != 0) 
                return NULL;