Date: Sun, 15 May 2016 13:17:06 +0000 (UTC) From: Jilles Tjoelker <jilles@FreeBSD.org> To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r299850 - in head/usr.bin/xinstall: . tests Message-ID: <201605151317.u4FDH6Ma038967@repo.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: jilles Date: Sun May 15 13:17:05 2016 New Revision: 299850 URL: https://svnweb.freebsd.org/changeset/base/299850 Log: install: When preserving timestamps, also copy the nanoseconds part. Modified: head/usr.bin/xinstall/tests/install_test.sh head/usr.bin/xinstall/xinstall.c Modified: head/usr.bin/xinstall/tests/install_test.sh ============================================================================== --- head/usr.bin/xinstall/tests/install_test.sh Sun May 15 08:36:12 2016 (r299849) +++ head/usr.bin/xinstall/tests/install_test.sh Sun May 15 13:17:05 2016 (r299850) @@ -64,6 +64,12 @@ copy_to_nonexistent_backup_safe_body() { copy_to_nonexistent_with_opts -b -B.bak -S } +atf_test_case copy_to_nonexistent_preserving +copy_to_nonexistent_preserving_body() { + copy_to_nonexistent_with_opts -p + [ ! testf -ot copyf ] || atf_fail "bad timestamp 2" +} + copy_self_with_opts() { printf 'test\n123\r456\r\n789\0z' >testf printf 'test\n123\r456\r\n789\0z' >testf2 @@ -307,6 +313,7 @@ atf_init_test_cases() { atf_add_test_case copy_to_nonexistent_safe_comparing atf_add_test_case copy_to_nonexistent_backup atf_add_test_case copy_to_nonexistent_backup_safe + atf_add_test_case copy_to_nonexistent_preserving atf_add_test_case copy_self atf_add_test_case copy_self_safe atf_add_test_case copy_self_comparing Modified: head/usr.bin/xinstall/xinstall.c ============================================================================== --- head/usr.bin/xinstall/xinstall.c Sun May 15 08:36:12 2016 (r299849) +++ head/usr.bin/xinstall/xinstall.c Sun May 15 13:17:05 2016 (r299850) @@ -131,7 +131,7 @@ static void do_symlink(const char *, con static void makelink(const char *, const char *, const struct stat *); static void install(const char *, const char *, u_long, u_int); static void install_dir(char *); -static void metadata_log(const char *, const char *, struct timeval *, +static void metadata_log(const char *, const char *, struct timespec *, const char *, const char *, off_t); static int parseid(const char *, id_t *); static void strip(const char *); @@ -722,7 +722,7 @@ static void install(const char *from_name, const char *to_name, u_long fset, u_int flags) { struct stat from_sb, temp_sb, to_sb; - struct timeval tvb[2]; + struct timespec tsb[2]; int devnull, files_match, from_fd, serrno, target; int tempcopy, temp_fd, to_fd; char backup[MAXPATHLEN], *p, pathbuf[MAXPATHLEN], tempfile[MAXPATHLEN]; @@ -857,11 +857,9 @@ install(const char *from_name, const cha * Need to preserve target file times, though. */ if (to_sb.st_nlink != 1) { - tvb[0].tv_sec = to_sb.st_atime; - tvb[0].tv_usec = 0; - tvb[1].tv_sec = to_sb.st_mtime; - tvb[1].tv_usec = 0; - (void)utimes(tempfile, tvb); + tsb[0] = to_sb.st_atim; + tsb[1] = to_sb.st_mtim; + (void)utimensat(AT_FDCWD, tempfile, tsb, 0); } else { files_match = 1; (void)unlink(tempfile); @@ -916,11 +914,9 @@ install(const char *from_name, const cha * Preserve the timestamp of the source file if necessary. */ if (dopreserve && !files_match && !devnull) { - tvb[0].tv_sec = from_sb.st_atime; - tvb[0].tv_usec = 0; - tvb[1].tv_sec = from_sb.st_mtime; - tvb[1].tv_usec = 0; - (void)utimes(to_name, tvb); + tsb[0] = from_sb.st_atim; + tsb[1] = from_sb.st_mtim; + (void)utimensat(AT_FDCWD, to_name, tsb, 0); } if (fstat(to_fd, &to_sb) == -1) { @@ -989,7 +985,7 @@ install(const char *from_name, const cha if (!devnull) (void)close(from_fd); - metadata_log(to_name, "file", tvb, NULL, digestresult, to_sb.st_size); + metadata_log(to_name, "file", tsb, NULL, digestresult, to_sb.st_size); free(digestresult); } @@ -1301,7 +1297,7 @@ again: * or to allow integrity checks to be performed. */ static void -metadata_log(const char *path, const char *type, struct timeval *tv, +metadata_log(const char *path, const char *type, struct timespec *ts, const char *slink, const char *digestresult, off_t size) { static const char extra[] = { ' ', '\t', '\n', '\\', '#', '\0' }; @@ -1355,9 +1351,9 @@ metadata_log(const char *path, const cha } if (*type == 'f') /* type=file */ fprintf(metafp, " size=%lld", (long long)size); - if (tv != NULL && dopreserve) - fprintf(metafp, " time=%lld.%ld", - (long long)tv[1].tv_sec, (long)tv[1].tv_usec); + if (ts != NULL && dopreserve) + fprintf(metafp, " time=%lld.%09ld", + (long long)ts[1].tv_sec, ts[1].tv_nsec); if (digestresult && digest) fprintf(metafp, " %s=%s", digest, digestresult); if (fflags)
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201605151317.u4FDH6Ma038967>