X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/5e58e3f9cf3db5c3958fe6505eb59a2f814887fb..b5c6a6aeeb7d526e023454ea681b7381945bced8:/generator.c diff --git a/generator.c b/generator.c index 0a63f00d..b7aa8cfa 100644 --- a/generator.c +++ b/generator.c @@ -38,6 +38,7 @@ extern int relative_paths; extern int keep_dirlinks; extern int preserve_links; extern int preserve_devices; +extern int preserve_specials; extern int preserve_hard_links; extern int preserve_perms; extern int preserve_uid; @@ -325,10 +326,10 @@ int unchanged_attrs(struct file_struct *file, STRUCT_STAT *st) && (st->st_mode & CHMOD_BITS) != (file->mode & CHMOD_BITS)) return 0; - if (am_root && preserve_uid && st->st_uid != file->ids->uid) + if (am_root && preserve_uid && st->st_uid != file->uid) return 0; - if (preserve_gid && file->ids->gid != GID_NONE && st->st_gid != file->ids->gid) + if (preserve_gid && file->gid != GID_NONE && st->st_gid != file->gid) return 0; return 1; @@ -351,10 +352,10 @@ void itemize(struct file_struct *file, int ndx, int statret, STRUCT_STAT *st, if (preserve_perms && (file->mode & CHMOD_BITS) != (st->st_mode & CHMOD_BITS)) iflags |= ITEM_REPORT_PERMS; - if (preserve_uid && am_root && file->ids->uid != st->st_uid) + if (preserve_uid && am_root && file->uid != st->st_uid) iflags |= ITEM_REPORT_OWNER; - if (preserve_gid && file->ids->gid != GID_NONE - && st->st_gid != file->ids->gid) + if (preserve_gid && file->gid != GID_NONE + && st->st_gid != file->gid) iflags |= ITEM_REPORT_GROUP; } else iflags |= ITEM_IS_NEW; @@ -986,7 +987,8 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx, return; } - if (am_root && preserve_devices && IS_DEVICE(file->mode)) { + if ((am_root && preserve_devices && IS_DEVICE(file->mode)) + || (preserve_specials && IS_SPECIAL(file->mode))) { if (statret != 0 && (basis_dir[0] != NULL && can_link_devices)) { if (try_dests_non(file, fname, ndx, itemizing, @@ -1007,7 +1009,8 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx, && hard_link_check(file, ndx, fname, -1, &st, itemizing, code, HL_SKIP)) return; - if (!IS_DEVICE(st.st_mode)) + if ((IS_DEVICE(file->mode) && !IS_DEVICE(st.st_mode)) + || (IS_SPECIAL(file->mode) && !IS_SPECIAL(st.st_mode))) statret = -1; if (verbose > 2) { rprintf(FINFO,"mknod(%s,0%o,0x%x)\n",