X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/215b444cae70637d0c1b48501dca358c7db43709..00b9618460c40131a8925047853f73ccbe9fc20b:/generator.c diff --git a/generator.c b/generator.c index c0613863..56065557 100644 --- a/generator.c +++ b/generator.c @@ -325,9 +325,10 @@ void itemize(struct file_struct *file, int ndx, int statret, STRUCT_STAT *st, if ((iflags & (ITEM_TRANSFER|ITEM_LOCAL_CHANGE) && !keep_time && (!(iflags & ITEM_XNAME_FOLLOWS) || *xname)) - || (keep_time && file->modtime != st->st_mtime)) + || (keep_time && cmp_modtime(file->modtime, st->st_mtime) != 0)) iflags |= ITEM_REPORT_TIME; - if (preserve_perms && file->mode != st->st_mode) + if (preserve_perms + && (file->mode & CHMOD_BITS) != (st->st_mode & CHMOD_BITS)) iflags |= ITEM_REPORT_PERMS; if (preserve_uid && am_root && file->uid != st->st_uid) iflags |= ITEM_REPORT_OWNER; @@ -529,7 +530,7 @@ static int find_fuzzy(struct file_struct *file, struct file_list *dirlist) name = fp->basename; if (fp->length == file->length - && fp->modtime == file->modtime) { + && cmp_modtime(fp->modtime, file->modtime) == 0) { if (verbose > 4) { rprintf(FINFO, "fuzzy size/modtime match for %s\n", @@ -704,10 +705,10 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx, itemize(file, ndx, statret, &st, statret ? ITEM_LOCAL_CHANGE : 0, 0, NULL); } - if (statret != 0 && do_mkdir(fname,file->mode) != 0 && errno != EEXIST) { + if (statret != 0 && do_mkdir(fname,file->mode) < 0 && errno != EEXIST) { if (!relative_paths || errno != ENOENT || create_directory_path(fname, orig_umask) < 0 - || do_mkdir(fname, file->mode) < 0) { + || (do_mkdir(fname, file->mode) < 0 && errno != EEXIST)) { rsyserr(FERROR, errno, "recv_generator: mkdir %s failed", full_fname(fname)); @@ -798,7 +799,7 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx, safe_fname(fname), (int)file->mode, (int)file->u.rdev); } - if (do_mknod(fname,file->mode,file->u.rdev) != 0) { + if (do_mknod(fname,file->mode,file->u.rdev) < 0) { rsyserr(FERROR, errno, "mknod %s failed", full_fname(fname)); } else { @@ -1207,17 +1208,19 @@ void generate_files(int f_out, struct file_list *flist, char *local_name) /* We need to ensure that any dirs we create have writeable * permissions during the time we are putting files within * them. This is then fixed after the transfer is done. */ +#ifdef HAVE_CHMOD if (!am_root && S_ISDIR(file->mode) && !(file->mode & S_IWUSR) && !list_only) { int mode = file->mode | S_IWUSR; /* user write */ char *fname = local_name ? local_name : fbuf; - if (do_chmod(fname, mode & CHMOD_BITS) < 0) { + if (do_chmod(fname, mode) < 0) { rsyserr(FERROR, errno, "failed to modify permissions on %s", full_fname(fname)); } need_retouch_dir_perms = 1; } +#endif if (preserve_hard_links) check_for_finished_hlinks(itemizing, code);