sbase

suckless unix tools
git clone git://git.2f30.org/sbase.git
Log | Files | Refs | README | LICENSE

commit 44133fb56058cfd73d5c49636802cdc9966030fc
parent cc27d5deb7dd135783f81dc6e945d69cd1c1ff7c
Author: Michael Forney <mforney@mforney.org>
Date:   Fri Jul  8 10:24:13 -0700

touch: Use special UTIME_NOW and UTIME_OMIT values

This allows users to touch files they have write access to, but aren't the
owner.

Also, remove utime.h include (not necessary since
4132561c1729df9440a6ae2566a0cccadcccf860), and make sure to check the return
value of localtime (potentially preventing a NULL pointer derefence).

Diffstat:
touch.c | 24++++++++++++++----------
1 file changed, 14 insertions(+), 10 deletions(-)
diff --git a/touch.c b/touch.c @@ -7,14 +7,13 @@ #include <string.h> #include <time.h> #include <unistd.h> -#include <utime.h> #include "util.h" static int aflag; static int cflag; static int mflag; -static struct timespec times[2]; +static struct timespec times[2] = {{.tv_nsec = UTIME_NOW}}; static void touch(const char *file) @@ -28,10 +27,6 @@ touch(const char *file) if (cflag) return; } else { - if (!aflag) - times[0] = st.st_atim; - if (!mflag) - times[1] = st.st_mtim; if (utimensat(AT_FDCWD, file, times, 0) < 0) eprintf("utimensat %s:", file); return; @@ -45,14 +40,18 @@ touch(const char *file) } static time_t -parsetime(char *str, time_t current) +parsetime(char *str) { + time_t now; struct tm *cur, t = { 0 }; int zulu = 0; char *format; size_t len = strlen(str); - cur = localtime(&current); + if ((now = time(NULL)) == -1) + eprintf("time:"); + if (!(cur = localtime(&now))) + eprintf("localtime:"); t.tm_isdst = -1; switch (len) { @@ -116,7 +115,6 @@ main(int argc, char *argv[]) { struct stat st; char *ref = NULL; - clock_gettime(CLOCK_REALTIME, &times[0]); ARGBEGIN { case 'a': @@ -127,7 +125,8 @@ main(int argc, char *argv[]) break; case 'd': case 't': - times[0].tv_sec = parsetime(EARGF(usage()), times[0].tv_sec); + times[0].tv_sec = parsetime(EARGF(usage())); + times[0].tv_nsec = 0; break; case 'm': mflag = 1; @@ -141,6 +140,7 @@ main(int argc, char *argv[]) break; case 'T': times[0].tv_sec = estrtonum(EARGF(usage()), 0, LLONG_MAX); + times[0].tv_nsec = 0; break; default: usage(); @@ -152,6 +152,10 @@ main(int argc, char *argv[]) aflag = mflag = 1; if (!ref) times[1] = times[0]; + if (!aflag) + times[0].tv_nsec = UTIME_OMIT; + if (!mflag) + times[1].tv_nsec = UTIME_OMIT; for (; *argv; argc--, argv++) touch(*argv);