X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/34aa616d41ad3a1b099d094a98b82b3505c735ed..0b52f94da727c4881b58c1cd6f2cf2a824e02b30:/flist.c diff --git a/flist.c b/flist.c index 81fa2de6..20350459 100644 --- a/flist.c +++ b/flist.c @@ -1037,9 +1037,15 @@ struct file_struct *make_file(const char *fname, struct file_list *flist, } if (save_errno == ENOENT) { #ifdef SUPPORT_LINKS - /* Avoid "vanished" error if symlink points nowhere. */ - if (copy_links && x_lstat(thisname, &st, NULL) == 0 - && S_ISLNK(st.st_mode)) { + /* When our options tell us to follow a symlink that + * points nowhere, tell the user about the symlink + * instead of giving a "vanished" message. We only + * dereference a symlink if one of the --copy*links + * options was specified, so there's no need for the + * extra lstat() if one of these options isn't on. */ + if ((copy_links || copy_unsafe_links || copy_dirlinks) + && x_lstat(thisname, &st, NULL) == 0 + && S_ISLNK(st.st_mode)) { io_error |= IOERR_GENERAL; rprintf(FERROR_XFER, "symlink has no referent: %s\n", full_fname(thisname)); @@ -1525,8 +1531,10 @@ static void send_implied_dirs(int f, struct file_list *flist, char *fname, relnamecache **rnpp; char *slash; int len, need_new_dir; + struct filter_list_struct save_filter_list = filter_list; flags = (flags | FLAG_IMPLIED_DIR) & ~(FLAG_TOP_DIR | FLAG_CONTENT_DIR); + filter_list.head = filter_list.tail = NULL; /* Don't filter implied dirs. */ if (inc_recurse) { if (lastpath_struct && F_PATHNAME(lastpath_struct) == pathname @@ -1568,11 +1576,11 @@ static void send_implied_dirs(int f, struct file_list *flist, char *fname, xfer_dirs = save_xfer_dirs; if (!inc_recurse) - return; + goto done; } if (!lastpath_struct) - return; /* dir must have vanished */ + goto done; /* dir must have vanished */ len = strlen(limit+1); memcpy(&relname_list, F_DIR_RELNAMES_P(lastpath_struct), sizeof relname_list); @@ -1586,6 +1594,9 @@ static void send_implied_dirs(int f, struct file_list *flist, char *fname, out_of_memory("send_implied_dirs"); (*rnpp)->name_type = name_type; strlcpy((*rnpp)->fname, limit+1, len + 1); + +done: + filter_list = save_filter_list; } static void send1extra(int f, struct file_struct *file, struct file_list *flist) @@ -2026,7 +2037,7 @@ struct file_list *send_file_list(int f, int argc, char *argv[]) flist_sort_and_clean(flist, 0); file_total += flist->used; - if (!numeric_ids && !inc_recurse) + if (numeric_ids <= 0 && !inc_recurse) send_id_list(f); /* send the io_error flag */