If there is no lchown(), don't try to set the user & group of a symlink.
[rsync/rsync.git] / exclude.c
index d02c462..5c8c7f4 100644 (file)
--- a/exclude.c
+++ b/exclude.c
@@ -115,10 +115,13 @@ void clear_exclude_list(struct exclude_list_struct *listp)
 static int check_one_exclude(char *name, struct exclude_struct *ex,
                              int name_is_dir)
 {
-       char *p;
+       char *p, full_name[MAXPATHLEN];
        int match_start = 0;
        char *pattern = ex->pattern;
 
+       if (!*name)
+               return 0;
+
        /* If the pattern does not have any slashes AND it does not have
         * a "**" (which could match a slash), then we just match the
         * name portion of the path. */
@@ -126,15 +129,12 @@ static int check_one_exclude(char *name, struct exclude_struct *ex,
                if ((p = strrchr(name,'/')) != NULL)
                        name = p+1;
        }
-       else if (ex->match_flags & MATCHFLG_ABS_PATH && *name != '/') {
-               static char full_name[MAXPATHLEN];
-               int plus = curr_dir[1] == '\0'? 1 : 0;
-               pathjoin(full_name, sizeof full_name, curr_dir+plus, name);
+       else if (ex->match_flags & MATCHFLG_ABS_PATH && *name != '/'
+           && curr_dir[1]) {
+               pathjoin(full_name, sizeof full_name, curr_dir + 1, name);
                name = full_name;
        }
 
-       if (!name[0]) return 0;
-
        if (ex->match_flags & MATCHFLG_DIRECTORY && !name_is_dir)
                return 0;
 
@@ -235,8 +235,9 @@ int check_exclude(struct exclude_list_struct *listp, char *name, int name_is_dir
 /* Get the next include/exclude arg from the string.  The token will not
  * be '\0' terminated, so use the returned length to limit the string.
  * Also, be sure to add this length to the returned pointer before passing
- * it back to ask for the next token.  This routine parses the +/- prefixes
- * and the "!" token unless xflags contains XFLG_WORDS_ONLY.  The *flag_ptr
+ * it back to ask for the next token.  This routine parses the "!" (list-
+ * clearing) token and (if xflags does NOT contain XFLG_WORDS_ONLY) the
+ * +/- prefixes for overriding the include/exclude mode.  The *flag_ptr
  * value will also be set to the MATCHFLG_* bits for the current token.
  */
 static const char *get_exclude_tok(const char *p, unsigned int *len_ptr,
@@ -261,6 +262,8 @@ static const char *get_exclude_tok(const char *p, unsigned int *len_ptr,
                s += 2;
        } else if (xflags & XFLG_DEF_INCLUDE)
                mflags |= MATCHFLG_INCLUDE;
+       if (xflags & XFLG_DIRECTORY)
+               mflags |= MATCHFLG_DIRECTORY;
 
        if (xflags & XFLG_WORD_SPLIT) {
                const unsigned char *cp = s;
@@ -271,7 +274,7 @@ static const char *get_exclude_tok(const char *p, unsigned int *len_ptr,
        } else
                len = strlen(s);
 
-       if (*p == '!' && len == 1 && !(xflags & XFLG_WORDS_ONLY))
+       if (*p == '!' && len == 1)
                mflags |= MATCHFLG_CLEAR_LIST;
 
        *len_ptr = len;