diff options
author | Rob Landley <rob@landley.net> | 2007-11-30 04:37:24 -0600 |
---|---|---|
committer | Rob Landley <rob@landley.net> | 2007-11-30 04:37:24 -0600 |
commit | 7abb976bac52e95820a629b2569e2c30aa8dd8d4 (patch) | |
tree | 8b738d58335788a6483359cf0b552c4529079d2d /toys | |
parent | ce6750ac69a7a80a18db7f0d7a217cbf37c7a04c (diff) | |
download | toybox-7abb976bac52e95820a629b2569e2c30aa8dd8d4.tar.gz |
Minor cleanups/tweaks to touch.
Diffstat (limited to 'toys')
-rw-r--r-- | toys/touch.c | 64 |
1 files changed, 31 insertions, 33 deletions
diff --git a/toys/touch.c b/toys/touch.c index 61eb18b9..013a388e 100644 --- a/toys/touch.c +++ b/toys/touch.c @@ -13,48 +13,48 @@ #include <time.h> #include "toys.h" -#define MTIME 0x01 -#define NO_CREATE 0x02 -#define ATIME 0x04 -#define REFERENCE 0x08 -#define TIME 0x10 -#define LENGTH 0x20 +#define OPT_MTIME 0x01 +#define OPT_NOCREATE 0x02 +#define OPT_ATIME 0x04 +#define OPT_REFERENCE 0x08 +#define OPT_TIME 0x10 +#define OPT_LENGTH 0x20 void touch_main(void) { char *arg; - int i, set_a, set_m, create; + int i, set_a, set_m; time_t curr_a, curr_m; - set_a = !!(toys.optflags & ATIME); - set_m = !!(toys.optflags & MTIME); - create = !(toys.optflags & NO_CREATE); + set_a = !!(toys.optflags & OPT_ATIME); + set_m = !!(toys.optflags & OPT_MTIME); - if (toys.optflags & REFERENCE) { + // Use timestamp on a file + if (toys.optflags & OPT_REFERENCE) { struct stat sb; - if (toys.optflags & TIME) - error_exit("Cannot specify times from more than one source"); + + if (toys.optflags & OPT_TIME) + error_exit("Redundant time source"); xstat(toy.touch.ref_file, &sb); curr_m = sb.st_mtime; curr_a = sb.st_atime; - } else if (toys.optflags & TIME) { + + // Use time specified on command line. + } else if (toys.optflags & OPT_TIME) { struct tm t; time_t curr; char *c; + curr = time(NULL); - if (!localtime_r(&curr, &t)) - goto time_error; - c = strptime(toy.touch.time, "%m%d%H%M", &t); - if (!c || *c) - goto time_error; - curr_a = curr_m = mktime(&t); - if (curr_a == -1) -time_error: - error_exit("Error converting time %s to internal format", - toy.touch.time); - } else { - curr_m = curr_a = time(NULL); - } + if (localtime_r(&curr, &t) + || !(c = strptime(toy.touch.time, "%m%d%H%M", &t)) + || *c || -1==(curr_a = curr_m = mktime(&t))) + { + error_exit("Unknown time %s", toy.touch.time); + } + + // use current time + } else curr_m = curr_a = time(NULL); for (i = 0; (arg = toys.optargs[i]); i++) { struct utimbuf buf; @@ -64,7 +64,7 @@ time_error: buf.actime = curr_a; if (stat(arg, &sb) == -1) { - if (create && errno == ENOENT) { + if (!(toys.optflags & OPT_NOCREATE) && errno == ENOENT) { if (creat(arg, 0644)) goto error; if (stat(arg, &sb)) @@ -74,13 +74,11 @@ time_error: if ((set_a+set_m) == 1) { /* We've been asked to only change one */ - if (set_a) - buf.modtime = sb.st_mtime; - else if (set_m) - buf.actime = sb.st_atime; + if (set_a) buf.modtime = sb.st_mtime; + else if (set_m) buf.actime = sb.st_atime; } - if (toys.optflags & LENGTH) + if (toys.optflags & OPT_LENGTH) if (truncate(arg, toy.touch.length)) goto error; if (utime(arg, &buf)) |