Date: Sun, 15 Mar 2015 21:29:21 +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: r280117 - head/usr.bin/unzip Message-ID: <201503152129.t2FLTLhI091452@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: jilles Date: Sun Mar 15 21:29:20 2015 New Revision: 280117 URL: https://svnweb.freebsd.org/changeset/base/280117 Log: unzip: Don't subvert vfs.timestamp_precision when setting atime to now. Also, preserve nanoseconds from libarchive, even though the zip file format does not currently support nanoseconds in timestamps. Modified: head/usr.bin/unzip/unzip.c Modified: head/usr.bin/unzip/unzip.c ============================================================================== --- head/usr.bin/unzip/unzip.c Sun Mar 15 21:29:18 2015 (r280116) +++ head/usr.bin/unzip/unzip.c Sun Mar 15 21:29:20 2015 (r280117) @@ -67,9 +67,6 @@ static int u_opt; /* update */ static int v_opt; /* verbose/list */ static int Z1_opt; /* zipinfo mode list files only */ -/* time when unzip started */ -static time_t now; - /* debug flag */ static int unzip_debug; @@ -470,9 +467,9 @@ static void extract_file(struct archive *a, struct archive_entry *e, char **path) { int mode; - time_t mtime; + struct timespec mtime; struct stat sb; - struct timeval tv[2]; + struct timespec ts[2]; int cr, fd, text, warn, check; ssize_t len; unsigned char *p, *q, *end; @@ -480,14 +477,18 @@ extract_file(struct archive *a, struct a mode = archive_entry_mode(e) & 0777; if (mode == 0) mode = 0644; - mtime = archive_entry_mtime(e); + mtime.tv_sec = archive_entry_mtime(e); + mtime.tv_nsec = archive_entry_mtime_nsec(e); /* look for existing file of same name */ recheck: if (lstat(*path, &sb) == 0) { if (u_opt || f_opt) { /* check if up-to-date */ - if (S_ISREG(sb.st_mode) && sb.st_mtime >= mtime) + if (S_ISREG(sb.st_mode) && + (sb.st_mtim.tv_sec > mtime.tv_sec || + (sb.st_mtim.tv_sec == mtime.tv_sec && + sb.st_mtim.tv_nsec >= mtime.tv_nsec))) return; (void)unlink(*path); } else if (o_opt) { @@ -593,12 +594,11 @@ recheck: info("\n"); /* set access and modification time */ - tv[0].tv_sec = now; - tv[0].tv_usec = 0; - tv[1].tv_sec = mtime; - tv[1].tv_usec = 0; - if (futimes(fd, tv) != 0) - error("utimes('%s')", *path); + ts[0].tv_sec = 0; + ts[0].tv_nsec = UTIME_NOW; + ts[1] = mtime; + if (futimens(fd, ts) != 0) + error("futimens('%s')", *path); if (close(fd) != 0) error("close('%s')", *path); } @@ -1065,8 +1065,6 @@ main(int argc, char *argv[]) if (n_opt + o_opt + u_opt > 1) errorx("-n, -o and -u are contradictory"); - time(&now); - unzip(zipfile); exit(0);
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201503152129.t2FLTLhI091452>