X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/78d146e866d0135e85a9a7c3a8942bb84ff9b407..e71c1c26df8c6ca29b0c26f82d4770a8685eb509:/flist.c diff --git a/flist.c b/flist.c index 3e757db3..32e51a7b 100644 --- a/flist.c +++ b/flist.c @@ -1,34 +1,29 @@ /* - Copyright (C) Andrew Tridgell 1996 - Copyright (C) Paul Mackerras 1996 - Copyright (C) 2001, 2002 by Martin Pool - - 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 - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -*/ - -/** @file flist.c - * Generate and receive file lists + * Generate and receive file lists. * - * @sa http://lists.samba.org/pipermail/rsync/2000-June/002351.html + * Copyright (C) 1996 Andrew Tridgell + * Copyright (C) 1996 Paul Mackerras + * Copyright (C) 2001, 2002 Martin Pool + * Copyright (C) 2002, 2003, 2004, 2005, 2006 Wayne Davison * - **/ + * 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 + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ #include "rsync.h" extern int verbose; -extern int dry_run; extern int list_only; extern int am_root; extern int am_server; @@ -43,10 +38,10 @@ extern int recurse; extern int xfer_dirs; extern int filesfrom_fd; extern int one_file_system; +extern int copy_dirlinks; extern int keep_dirlinks; extern int preserve_links; extern int preserve_hard_links; -extern int preserve_perms; extern int preserve_devices; extern int preserve_specials; extern int preserve_uid; @@ -58,7 +53,6 @@ extern int copy_links; extern int copy_unsafe_links; extern int protocol_version; extern int sanitize_paths; -extern int orig_umask; extern struct stats stats; extern struct file_list *the_file_list; @@ -174,7 +168,7 @@ static int readlink_stat(const char *path, STRUCT_STAT *buffer, char *linkbuf) #ifdef SUPPORT_LINKS if (copy_links) return do_stat(path, buffer); - if (link_stat(path, buffer, 0) < 0) + if (link_stat(path, buffer, copy_dirlinks) < 0) return -1; if (S_ISLNK(buffer->st_mode)) { int l = readlink((char *)path, linkbuf, MAXPATHLEN - 1); @@ -335,8 +329,6 @@ static void send_file_entry(struct file_struct *file, int f) return; } - io_write_phase = "send_file_entry"; - f_name(file, fname); flags = file->flags & XMIT_TOP_DIR; @@ -488,8 +480,6 @@ static void send_file_entry(struct file_struct *file, int f) } strlcpy(lastname, fname, MAXPATHLEN); - - io_write_phase = "unknown"; } static struct file_struct *receive_file_entry(struct file_list *flist, @@ -673,8 +663,6 @@ static struct file_struct *receive_file_entry(struct file_list *flist, if (linkname_len) { file->u.link = bp; read_sbuf(f, bp, linkname_len - 1); - if (sanitize_paths) - sanitize_path(bp, bp, "", lastdir_depth); bp += linkname_len; } #endif @@ -713,12 +701,6 @@ static struct file_struct *receive_file_entry(struct file_list *flist, read_buf(f, sum, checksum_len); } - if (!preserve_perms) { - /* set an appropriate set of permissions based on original - * permissions and umask. This emulates what GNU cp does */ - file->mode &= ~orig_umask; - } - return file; } @@ -1147,7 +1129,7 @@ struct file_list *send_file_list(int f, int argc, char *argv[]) && (len == 1 || fbuf[len-2] == '/'); } - if (link_stat(fbuf, &st, keep_dirlinks) != 0) { + if (link_stat(fbuf, &st, copy_dirlinks) != 0) { io_error |= IOERR_GENERAL; rsyserr(FERROR, errno, "link_stat %s failed", full_fname(fbuf)); @@ -1262,7 +1244,7 @@ struct file_list *send_file_list(int f, int argc, char *argv[]) if (fn != p || (*lp && *lp != '/')) { int save_copy_links = copy_links; int save_xfer_dirs = xfer_dirs; - copy_links = copy_unsafe_links; + copy_links |= copy_unsafe_links; xfer_dirs = 1; while ((slash = strchr(slash+1, '/')) != 0) { *slash = '\0'; @@ -1372,7 +1354,7 @@ struct file_list *recv_file_list(int f) flags |= read_byte(f) << 8; file = receive_file_entry(flist, flags, f); - if (S_ISREG(file->mode)) + if (S_ISREG(file->mode) || S_ISLNK(file->mode)) stats.total_size += file->length; flist->files[flist->count++] = file; @@ -1493,8 +1475,8 @@ void clear_file(struct file_struct *file, struct file_list *flist) memset(file, 0, file_struct_len); /* In an empty entry, dir.depth is an offset to the next non-empty * entry. Likewise for length in the opposite direction. We assume - * that we're alone for now since flist_find() will collate adjacent - * items for any entries that are encountered during the find. */ + * that we're alone for now since flist_find() will adjust the counts + * it runs into that aren't up-to-date. */ file->length = file->dir.depth = 1; } @@ -1916,6 +1898,7 @@ struct file_list *get_dirlist(char *dirname, int dlen, struct file_list *dirlist; char dirbuf[MAXPATHLEN]; int save_recurse = recurse; + int save_xfer_dirs = xfer_dirs; if (dlen < 0) { dlen = strlcpy(dirbuf, dirname, MAXPATHLEN); @@ -1927,7 +1910,9 @@ struct file_list *get_dirlist(char *dirname, int dlen, dirlist = flist_new(WITHOUT_HLINK, "get_dirlist"); recurse = 0; + xfer_dirs = 1; send_directory(ignore_filter_rules ? -2 : -1, dirlist, dirname, dlen); + xfer_dirs = save_xfer_dirs; recurse = save_recurse; if (do_progress) flist_count_offset += dirlist->count;