Display actual errno message on failure; use error message
authorAndy Valencia <ajv-899-334-8894@vsta.org>
Sat, 23 Jul 2016 19:43:30 +0000 (12:43 -0700)
committerAndy Valencia <ajv-899-334-8894@vsta.org>
Sat, 23 Jul 2016 21:49:03 +0000 (14:49 -0700)
 style of Linux's "touch".

Applications/util/touch.c

index 9aa8c5e..f8a0e7d 100644 (file)
@@ -1,30 +1,52 @@
 #include <stdio.h>
 #include <unistd.h>
 #include <utime.h>
+#include <errno.h>
+#include <sys/stat.h>
 
 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);
 }