The branch, master has been updated via 296352ec Tweak atime/crtime code a bit more. via 11a9b623 Avoid spurious warning about "code" var not being initialized. via 452ef785 Unify on "path" vs "fname" arg naming. via 0d1b4889 Change do_lchmod() back to a swtich with some better ENOTSUP & ENOSYS logic. via ec8a05f6 Some packaging improvements. from 78b5bc66 Enable --atimes on macOS.
https://git.samba.org/?p=rsync.git;a=shortlog;h=master - Log ----------------------------------------------------------------- commit 296352ecb0175fa3c37de550dd57aeff39632095 Author: Wayne Davison <wa...@opencoder.net> Date: Sun Oct 10 11:45:14 2021 -0700 Tweak atime/crtime code a bit more. commit 11a9b623226ef2324985958c3416d2bae5a3b7f3 Author: Wayne Davison <wa...@opencoder.net> Date: Sun Oct 10 10:04:54 2021 -0700 Avoid spurious warning about "code" var not being initialized. commit 452ef785179a9bcdee7f6f96c72e34f5ad24384c Author: Wayne Davison <wa...@opencoder.net> Date: Sun Oct 10 09:53:35 2021 -0700 Unify on "path" vs "fname" arg naming. commit 0d1b48893ab764f2c632abf0c94ef8d39312dfd0 Author: Wayne Davison <wa...@opencoder.net> Date: Sun Oct 10 09:20:13 2021 -0700 Change do_lchmod() back to a swtich with some better ENOTSUP & ENOSYS logic. commit ec8a05f65356c04a1f70cd58f1f80ed1e0b2d887 Author: Wayne Davison <wa...@opencoder.net> Date: Sun Oct 3 12:02:58 2021 -0700 Some packaging improvements. ----------------------------------------------------------------------- Summary of changes: NEWS.md | 2 +- generator.c | 1 - ifuncs.h | 1 + md2man | 14 ++++++- packaging/pre-push | 17 +++++++- packaging/release-rsync | 14 +++++++ rsync.1.md | 8 ++-- rsync.c | 48 +++++++++++++--------- rsyncd.conf.5.md | 4 +- syscall.c | 106 ++++++++++++++++++++++++++++-------------------- 10 files changed, 139 insertions(+), 76 deletions(-) Changeset truncated at 500 lines: diff --git a/NEWS.md b/NEWS.md index 74c3edfc..a35d6ee5 100644 --- a/NEWS.md +++ b/NEWS.md @@ -51,7 +51,7 @@ - Reduced memory usage for an incremental transfer that has a bunch of small diretories. - - Add support for `--atimes` on macOS. + - Added support for `--atimes` on macOS and fix using using it without -t. - Rsync can now update the xattrs on a read-only file when your user can temporarily add user-write permission to the file. (It always worked for a diff --git a/generator.c b/generator.c index 3287ae31..9c9751dc 100644 --- a/generator.c +++ b/generator.c @@ -1269,7 +1269,6 @@ static void recv_generator(char *fname, struct file_struct *file, int ndx, return; } } - sx.crtime = 0; if (dry_run > 1 || (dry_missing_dir && is_below(file, dry_missing_dir))) { int i; diff --git a/ifuncs.h b/ifuncs.h index 4037639b..491f0807 100644 --- a/ifuncs.h +++ b/ifuncs.h @@ -75,6 +75,7 @@ d_name(struct dirent *di) static inline void init_stat_x(stat_x *sx_p) { + sx_p->crtime = 0; #ifdef SUPPORT_ACLS sx_p->acc_acl = sx_p->def_acl = NULL; #endif diff --git a/md2man b/md2man index 7f783c56..fa1d2e82 100755 --- a/md2man +++ b/md2man @@ -11,6 +11,13 @@ # The html.parser is used as a state machine that both tweaks the html and # outputs the nroff data based on the html tags. # +# We normally grab the prefix from the generated Makefile, which is then used +# in the various other grabbed values (see the Makefile for its ${prefix} +# paths). However, the maintainer can choose to override this prefix by +# exporting RSYNC_OVERRIDE_PREFIX=/usr. This allows the man pages to refer to +# /usr paths (and are thus compatible with the release-rsync script) while +# still having the built rsync get installed into /usr/local for local testing. +# # Copyright (C) 2020 Wayne Davison # # This program is freely redistributable. @@ -58,6 +65,7 @@ HTML_END = """\ MAN_START = r""" .TH "%s" "%s" "%s" "%s" "User Commands" +.\" prefix=%s """.lstrip() MAN_END = """\ @@ -91,7 +99,8 @@ def main(): if args.test: env_subs['VERSION'] = '1.0.0' - env_subs['libdir'] = '/usr' + env_subs['bindir'] = '/usr/bin' + env_subs['libdir'] = '/usr/lib/rsync' else: for fn in (fi.srcdir + 'version.h', 'Makefile'): try: @@ -124,13 +133,14 @@ def main(): txt = fh.read() txt = re.sub(r'@VERSION@', env_subs['VERSION'], txt) + txt = re.sub(r'@BINDIR@', env_subs['bindir'], txt) txt = re.sub(r'@LIBDIR@', env_subs['libdir'], txt) fi.html_in = md_parser(txt) txt = None fi.date = time.strftime('%d %b %Y', time.localtime(fi.mtime)) - fi.man_headings = (fi.prog, fi.sect, fi.date, fi.prog + ' ' + env_subs['VERSION']) + fi.man_headings = (fi.prog, fi.sect, fi.date, fi.prog + ' ' + env_subs['VERSION'], env_subs['prefix']) HtmlToManPage(fi) diff --git a/packaging/pre-push b/packaging/pre-push index 04b0d20b..8a713695 100755 --- a/packaging/pre-push +++ b/packaging/pre-push @@ -1,3 +1,16 @@ -#!/bin/sh +#!/bin/bash -e + cat >/dev/null # Just discard stdin data -make gensend + +if [[ -f /proc/$PPID/cmdline ]]; then + while read -d $'\0' arg ; do + if [[ "$arg" == '--tags' ]] ; then + exit 0 + fi + done </proc/$PPID/cmdline +fi + +branch=`git rev-parse --abbrev-ref HEAD` +if [[ "$branch" = master && "$*" == *github* ]]; then + make gensend +fi diff --git a/packaging/release-rsync b/packaging/release-rsync index 02cc2f08..f7cfcfe5 100755 --- a/packaging/release-rsync +++ b/packaging/release-rsync @@ -18,6 +18,9 @@ dest = os.environ['HOME'] + '/samba-rsync-ftp' ORIGINAL_PATH = os.environ['PATH'] def main(): + if not os.path.isfile('packaging/release-rsync'): + die('You must run this script from the top of your rsync checkout.') + now = datetime.now() cl_today = now.strftime('* %a %b %d %Y') year = now.strftime('%Y') @@ -44,6 +47,17 @@ def main(): {dash_line} """) + with open('build/rsync.1') as fh: + for line in fh: + if line.startswith(r'.\" prefix='): + doc_prefix = line.split('=')[1].strip() + if doc_prefix != '/usr': + warn(f"*** The documentation was built with prefix {doc_prefix} instead of /usr ***") + warn("*** Read the md2man script for a way to override this. ***\n") + break + if line.startswith('.P'): + die("Failed to find the prefix comment at the start of the rsync.1 manpage.") + if not os.path.isdir(dest): die(dest, "dest does not exist") if not os.path.isdir('.git'): diff --git a/rsync.1.md b/rsync.1.md index 9bfda865..3de57b72 100644 --- a/rsync.1.md +++ b/rsync.1.md @@ -1391,8 +1391,8 @@ your home directory (remove the '=' for that). 0. `--omit-dir-times`, `-O` - This tells rsync to omit directories when it is preserving modification - times (see `--times`). If NFS is sharing the directories on the receiving + This tells rsync to omit directories when it is preserving modification, + access, and create times. If NFS is sharing the directories on the receiving side, it is a good idea to use `-O`. This option is inferred if you use `--backup` without `--backup-dir`. @@ -1409,8 +1409,8 @@ your home directory (remove the '=' for that). 0. `--omit-link-times`, `-J` - This tells rsync to omit symlinks when it is preserving modification times - (see `--times`). + This tells rsync to omit symlinks when it is preserving modification, + access, and create times. 0. `--super` diff --git a/rsync.c b/rsync.c index bcecac63..ff9489be 100644 --- a/rsync.c +++ b/rsync.c @@ -63,8 +63,7 @@ extern char *iconv_opt; #define UPDATED_ATIME (1<<3) #define UPDATED_ACLS (1<<4) #define UPDATED_MODE (1<<5) - -#define UPDATED_TIMES (UPDATED_MTIME|UPDATED_ATIME) +#define UPDATED_CRTIME (1<<6) #ifdef ICONV_CONST iconv_t ic_chck = (iconv_t)-1; @@ -576,10 +575,11 @@ int set_file_attrs(const char *fname, struct file_struct *file, stat_x *sxp, set_xattr(fname, file, fnamecmp, sxp); #endif - if (!preserve_times - || (!(preserve_times & PRESERVE_DIR_TIMES) && S_ISDIR(sxp->st.st_mode)) - || (!(preserve_times & PRESERVE_LINK_TIMES) && S_ISLNK(sxp->st.st_mode))) - flags |= ATTRS_SKIP_MTIME | ATTRS_SKIP_ATIME; + if (!preserve_times) + flags |= ATTRS_SKIP_MTIME | (atimes_ndx ? 0 : ATTRS_SKIP_ATIME) | (crtimes_ndx ? 0 : ATTRS_SKIP_CRTIME); + else if ((!(preserve_times & PRESERVE_DIR_TIMES) && S_ISDIR(sxp->st.st_mode)) + || (!(preserve_times & PRESERVE_LINK_TIMES) && S_ISLNK(sxp->st.st_mode))) + flags |= ATTRS_SKIP_MTIME | ATTRS_SKIP_ATIME | ATTRS_SKIP_CRTIME; else if (sxp != &sx2) memcpy(&sx2.st, &sxp->st, sizeof (sx2.st)); if (!atimes_ndx || S_ISDIR(sxp->st.st_mode)) @@ -604,28 +604,36 @@ int set_file_attrs(const char *fname, struct file_struct *file, stat_x *sxp, updated |= UPDATED_ATIME; } } - if (updated & UPDATED_TIMES) { +#ifdef SUPPORT_CRTIMES + if (crtimes_ndx && !(flags & ATTRS_SKIP_CRTIME)) { + time_t file_crtime = F_CRTIME(file); + if (sxp->crtime == 0) + sxp->crtime = get_create_time(fname, &sxp->st); + if (!same_time(sxp->crtime, 0L, file_crtime, 0L)) { + if ( +#ifdef HAVE_GETATTRLIST + do_setattrlist_crtime(fname, file_crtime) == 0 +#elif defined __CYGWIN__ + do_SetFileTime(fname, file_crtime) == 0 +#else +#error Unknown crtimes implementation +#endif + ) + updated |= UPDATED_CRTIME; + } + } +#endif + if (updated & (UPDATED_MTIME|UPDATED_ATIME)) { int ret = set_times(fname, &sx2.st); if (ret < 0) { - rsyserr(FERROR_XFER, errno, "failed to set times on %s", - full_fname(fname)); + rsyserr(FERROR_XFER, errno, "failed to set times on %s", full_fname(fname)); goto cleanup; } if (ret > 0) { /* ret == 1 if symlink could not be set */ - updated &= ~UPDATED_TIMES; + updated &= ~(UPDATED_MTIME|UPDATED_ATIME); file->flags |= FLAG_TIME_FAILED; } } -#ifdef SUPPORT_CRTIMES - if (crtimes_ndx && !(flags & ATTRS_SKIP_CRTIME)) { - time_t file_crtime = F_CRTIME(file); - if (sxp->crtime == 0) - sxp->crtime = get_create_time(fname, &sxp->st); - if (!same_time(sxp->crtime, 0L, file_crtime, 0L) - && set_create_time(fname, file_crtime) == 0) - updated = 1; - } -#endif #ifdef SUPPORT_ACLS /* It's OK to call set_acl() now, even for a dir, as the generator diff --git a/rsyncd.conf.5.md b/rsyncd.conf.5.md index b70532b1..730ef71e 100644 --- a/rsyncd.conf.5.md +++ b/rsyncd.conf.5.md @@ -60,9 +60,9 @@ When run via inetd you should add a line like this to /etc/services: and a single line something like this to /etc/inetd.conf: -> rsync stream tcp nowait root /usr/bin/rsync rsyncd --daemon +> rsync stream tcp nowait root @BINDIR@/rsync rsyncd --daemon -Replace "/usr/bin/rsync" with the path to where you have rsync installed on +Replace "@BINDIR@/rsync" with the path to where you have rsync installed on your system. You will then need to send inetd a HUP signal to tell it to reread its config file. diff --git a/syscall.c b/syscall.c index abb00575..56948a83 100644 --- a/syscall.c +++ b/syscall.c @@ -77,15 +77,15 @@ struct create_time { #define RETURN_ERROR_IF_RO_OR_LO RETURN_ERROR_IF(read_only || list_only, EROFS) -int do_unlink(const char *fname) +int do_unlink(const char *path) { if (dry_run) return 0; RETURN_ERROR_IF_RO_OR_LO; - return unlink(fname); + return unlink(path); } #ifdef SUPPORT_LINKS -int do_symlink(const char *lnk, const char *fname) +int do_symlink(const char *lnk, const char *path) { if (dry_run) return 0; RETURN_ERROR_IF_RO_OR_LO; @@ -95,7 +95,7 @@ int do_symlink(const char *lnk, const char *fname) * and write the lnk into it. */ if (am_root < 0) { int ok, len = strlen(lnk); - int fd = open(fname, O_WRONLY|O_CREAT|O_TRUNC, S_IWUSR|S_IRUSR); + int fd = open(path, O_WRONLY|O_CREAT|O_TRUNC, S_IWUSR|S_IRUSR); if (fd < 0) return -1; ok = write(fd, lnk, len) == len; @@ -105,7 +105,7 @@ int do_symlink(const char *lnk, const char *fname) } #endif - return symlink(lnk, fname); + return symlink(lnk, path); } #if defined NO_SYMLINK_XATTRS || defined NO_SYMLINK_USER_XATTRS @@ -231,13 +231,24 @@ int do_open(const char *pathname, int flags, mode_t mode) #ifdef HAVE_CHMOD int do_chmod(const char *path, mode_t mode) { + static int switch_step = 0; int code; + if (dry_run) return 0; RETURN_ERROR_IF_RO_OR_LO; + + switch (switch_step) { #ifdef HAVE_LCHMOD - if ((code = lchmod(path, mode & CHMOD_BITS)) < 0 && errno == ENOTSUP) + case 0: + if ((code = lchmod(path, mode & CHMOD_BITS)) == 0) + break; + if (errno == ENOSYS) + switch_step++; + else if (errno != ENOTSUP) + break; #endif - { + + default: if (S_ISLNK(mode)) { # if defined HAVE_SETATTRLIST struct attrlist attrList; @@ -252,6 +263,7 @@ int do_chmod(const char *path, mode_t mode) # endif } else code = chmod(path, mode & CHMOD_BITS); /* DISCOURAGED FUNCTION */ + break; } if (code != 0 && (preserve_perms || preserve_executability)) return code; @@ -300,12 +312,12 @@ void trim_trailing_slashes(char *name) } } -int do_mkdir(char *fname, mode_t mode) +int do_mkdir(char *path, mode_t mode) { if (dry_run) return 0; RETURN_ERROR_IF_RO_OR_LO; - trim_trailing_slashes(fname); - return mkdir(fname, mode); + trim_trailing_slashes(path); + return mkdir(path, mode); } /* like mkstemp but forces permissions */ @@ -339,25 +351,25 @@ int do_mkstemp(char *template, mode_t perms) #endif } -int do_stat(const char *fname, STRUCT_STAT *st) +int do_stat(const char *path, STRUCT_STAT *st) { #ifdef USE_STAT64_FUNCS - return stat64(fname, st); + return stat64(path, st); #else - return stat(fname, st); + return stat(path, st); #endif } -int do_lstat(const char *fname, STRUCT_STAT *st) +int do_lstat(const char *path, STRUCT_STAT *st) { #ifdef SUPPORT_LINKS # ifdef USE_STAT64_FUNCS - return lstat64(fname, st); + return lstat64(path, st); # else - return lstat(fname, st); + return lstat(path, st); # endif #else - return do_stat(fname, st); + return do_stat(path, st); #endif } @@ -385,7 +397,7 @@ OFF_T do_lseek(int fd, OFF_T offset, int whence) } #ifdef HAVE_SETATTRLIST -int do_setattrlist_times(const char *fname, STRUCT_STAT *stp) +int do_setattrlist_times(const char *path, STRUCT_STAT *stp) { struct attrlist attrList; struct timespec ts[2]; @@ -403,9 +415,28 @@ int do_setattrlist_times(const char *fname, STRUCT_STAT *stp) memset(&attrList, 0, sizeof attrList); attrList.bitmapcount = ATTR_BIT_MAP_COUNT; attrList.commonattr = ATTR_CMN_MODTIME | ATTR_CMN_ACCTIME; - return setattrlist(fname, &attrList, ts, sizeof ts, FSOPT_NOFOLLOW); + return setattrlist(path, &attrList, ts, sizeof ts, FSOPT_NOFOLLOW); +} + +#ifdef SUPPORT_CRTIMES +int do_setattrlist_crtime(const char *path, time_t crtime) +{ + struct attrlist attrList; + struct timespec ts; + + if (dry_run) return 0; + RETURN_ERROR_IF_RO_OR_LO; + + ts.tv_sec = crtime; + ts.tv_nsec = 0; + + memset(&attrList, 0, sizeof attrList); + attrList.bitmapcount = ATTR_BIT_MAP_COUNT; + attrList.commonattr = ATTR_CMN_CRTIME; + return setattrlist(path, &attrList, &ts, sizeof ts, FSOPT_NOFOLLOW); } #endif +#endif /* HAVE_SETATTRLIST */ #ifdef SUPPORT_CRTIMES time_t get_create_time(const char *path, STRUCT_STAT *stp) @@ -429,24 +460,12 @@ time_t get_create_time(const char *path, STRUCT_STAT *stp) #endif } -int set_create_time(const char *path, time_t crtime) +#if defined __CYGWIN__ +int do_SetFileTime(const char *path, time_t crtime) { if (dry_run) return 0; RETURN_ERROR_IF_RO_OR_LO; - { -#ifdef HAVE_GETATTRLIST - struct attrlist attrList; - struct timespec ts; - - ts.tv_sec = crtime; - ts.tv_nsec = 0; - - memset(&attrList, 0, sizeof attrList); - attrList.bitmapcount = ATTR_BIT_MAP_COUNT; - attrList.commonattr = ATTR_CMN_CRTIME; - return setattrlist(path, &attrList, &ts, sizeof ts, FSOPT_NOFOLLOW); -#elif defined __CYGWIN__ int cnt = MultiByteToWideChar(CP_UTF8, 0, path, -1, NULL, 0); if (cnt == 0) return -1; @@ -466,13 +485,12 @@ int set_create_time(const char *path, time_t crtime) int ok = SetFileTime(handle, &birth_time, NULL, NULL); CloseHandle(handle); return ok ? 0 : -1; -#endif - } } +#endif #endif /* SUPPORT_CRTIMES */ #ifdef HAVE_UTIMENSAT -int do_utimensat(const char *fname, STRUCT_STAT *stp) +int do_utimensat(const char *path, STRUCT_STAT *stp) { struct timespec t[2]; @@ -491,12 +509,12 @@ int do_utimensat(const char *fname, STRUCT_STAT *stp) #else t[1].tv_nsec = 0; #endif - return utimensat(AT_FDCWD, fname, t, AT_SYMLINK_NOFOLLOW); + return utimensat(AT_FDCWD, path, t, AT_SYMLINK_NOFOLLOW); } #endif #ifdef HAVE_LUTIMES -int do_lutimes(const char *fname, STRUCT_STAT *stp) +int do_lutimes(const char *path, STRUCT_STAT *stp) { struct timeval t[2]; @@ -515,12 +533,12 @@ int do_lutimes(const char *fname, STRUCT_STAT *stp) #else t[1].tv_usec = 0; #endif - return lutimes(fname, t); + return lutimes(path, t); } #endif #ifdef HAVE_UTIMES -int do_utimes(const char *fname, STRUCT_STAT *stp) -- The rsync repository. _______________________________________________ rsync-cvs mailing list rsync-cvs@lists.samba.org https://lists.samba.org/mailman/listinfo/rsync-cvs