From 2169ec99a975371ae2126d094ac94eb429c73d8a Mon Sep 17 00:00:00 2001 From: Andy Valencia Date: Sat, 23 Jul 2016 12:43:30 -0700 Subject: [PATCH] Display actual errno message on failure; use error message style of Linux's "touch". --- Applications/util/touch.c | 36 +++++++++++++++++++++++++++++------- 1 file changed, 29 insertions(+), 7 deletions(-) diff --git a/Applications/util/touch.c b/Applications/util/touch.c index 9aa8c5e3..f8a0e7d0 100644 --- a/Applications/util/touch.c +++ b/Applications/util/touch.c @@ -1,30 +1,52 @@ #include #include #include +#include +#include static time_t settime; int main(int argc, const char *argv[]) { - int er = 0, i, ncreate = 0; + int er = 0, res, i, ncreate = 0, fd; struct stat sbuf; struct utimbuf tbuf; - if ((argv[1][0] == '-') && (argv[1][1] == 'c')) + if ((argv[1][0] == '-') && (argv[1][1] == 'c')) { ncreate = 1; + } for (i = ncreate + 1; i < argc; i++) { if (argv[i][0] != '-') { - if (stat(argv[i], &sbuf)) { - if (!ncreate) - er = close(creat(argv[i], 0666)); + if (stat(argv[i], &sbuf) < 0) { + if (!ncreate) { + fd = creat(argv[i], 0666); + if (fd < 0) { + res = -1; + } else { + close(fd); + res = 0; + } + } else { + /* -c: Quietly ignore missing files */ + res = 0; + } } else { settime = time(NULL); tbuf.actime = settime; tbuf.modtime = settime; - er |= utime(argv[i], &tbuf); + res = utime(argv[i], &tbuf); + } + + /* Complain on each failed touch */ + if (res) { + fprintf(stderr, "%s: cannot touch '%s': %s\n", + argv[0], argv[i], strerror(errno)); } + + /* Accumulate errors */ + er |= res; } } - return er; + return (er ? 1 : 0); } -- 2.34.1