From dd53735797b51a9305d1f590853fe31c212fc953 Mon Sep 17 00:00:00 2001 From: Jilles Tjoelker Date: Mon, 16 May 2016 12:56:28 +0000 Subject: [PATCH] install: Revert utimensat usage (r299850). This should fix the build on older stable/10, since install is a bootstrap tool. Pending a decision how to fix this properly, revert utimensat usage. Copies with the -p option will again appear older than the original almost always, but -p is not commonly used. --- usr.bin/xinstall/tests/install_test.sh | 7 ------ usr.bin/xinstall/xinstall.c | 30 +++++++++++++++----------- 2 files changed, 17 insertions(+), 20 deletions(-) diff --git a/usr.bin/xinstall/tests/install_test.sh b/usr.bin/xinstall/tests/install_test.sh index 9a9c69fd6992..24a8a4d45521 100755 --- a/usr.bin/xinstall/tests/install_test.sh +++ b/usr.bin/xinstall/tests/install_test.sh @@ -64,12 +64,6 @@ 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 @@ -313,7 +307,6 @@ 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 diff --git a/usr.bin/xinstall/xinstall.c b/usr.bin/xinstall/xinstall.c index 5e05ba841163..1121cffe78ac 100644 --- a/usr.bin/xinstall/xinstall.c +++ b/usr.bin/xinstall/xinstall.c @@ -131,7 +131,7 @@ static void do_symlink(const char *, const char *, const struct stat *); 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 timespec *, +static void metadata_log(const char *, const char *, struct timeval *, 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 timespec tsb[2]; + struct timeval tvb[2]; int devnull, files_match, from_fd, serrno, target; int tempcopy, temp_fd, to_fd; char backup[MAXPATHLEN], *p, pathbuf[MAXPATHLEN], tempfile[MAXPATHLEN]; @@ -857,9 +857,11 @@ install(const char *from_name, const char *to_name, u_long fset, u_int flags) * Need to preserve target file times, though. */ if (to_sb.st_nlink != 1) { - tsb[0] = to_sb.st_atim; - tsb[1] = to_sb.st_mtim; - (void)utimensat(AT_FDCWD, tempfile, tsb, 0); + 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); } else { files_match = 1; (void)unlink(tempfile); @@ -914,9 +916,11 @@ install(const char *from_name, const char *to_name, u_long fset, u_int flags) * Preserve the timestamp of the source file if necessary. */ if (dopreserve && !files_match && !devnull) { - tsb[0] = from_sb.st_atim; - tsb[1] = from_sb.st_mtim; - (void)utimensat(AT_FDCWD, to_name, tsb, 0); + 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); } if (fstat(to_fd, &to_sb) == -1) { @@ -985,7 +989,7 @@ install(const char *from_name, const char *to_name, u_long fset, u_int flags) if (!devnull) (void)close(from_fd); - metadata_log(to_name, "file", tsb, NULL, digestresult, to_sb.st_size); + metadata_log(to_name, "file", tvb, NULL, digestresult, to_sb.st_size); free(digestresult); } @@ -1297,7 +1301,7 @@ install_dir(char *path) * or to allow integrity checks to be performed. */ static void -metadata_log(const char *path, const char *type, struct timespec *ts, +metadata_log(const char *path, const char *type, struct timeval *tv, const char *slink, const char *digestresult, off_t size) { static const char extra[] = { ' ', '\t', '\n', '\\', '#', '\0' }; @@ -1351,9 +1355,9 @@ metadata_log(const char *path, const char *type, struct timespec *ts, } if (*type == 'f') /* type=file */ fprintf(metafp, " size=%lld", (long long)size); - if (ts != NULL && dopreserve) - fprintf(metafp, " time=%lld.%09ld", - (long long)ts[1].tv_sec, ts[1].tv_nsec); + if (tv != NULL && dopreserve) + fprintf(metafp, " time=%lld.%ld", + (long long)tv[1].tv_sec, (long)tv[1].tv_usec); if (digestresult && digest) fprintf(metafp, " %s=%s", digest, digestresult); if (fflags)