Release 1.2.4.
[checkpath] / tmpdir.c
index 5d19e3a..0bf51d3 100644 (file)
--- a/tmpdir.c
+++ b/tmpdir.c
@@ -69,6 +69,17 @@ static struct passwd *pw;
  *             and @*f@ is set, then try to create the directory.
  */
 
+static void complain(const char *p, const char *msg, int err)
+{
+  dstr d = DSTR_INIT;
+
+  if (!cp.cp_verbose) return;
+  dstr_putf(&d, "Path: %s: %s", p, msg);
+  if (err) dstr_putf(&d, ": %s", strerror(err));
+  moan(d.buf);
+  dstr_destroy(&d);
+}
+
 static int ok(const char *p, int *f)
 {
   struct stat st;
@@ -79,9 +90,12 @@ static int ok(const char *p, int *f)
 
     /* --- Maybe create it if it doesn't exist --- */
 
-    if (errno != ENOENT || !f || !*f)
+    if (errno != ENOENT || !f || !*f) {
+      complain(p, "can't stat", errno);
       return (0);
+    }
     if (mkdir(p, 0700)) {
+      complain(p, "can't create", errno);
       *f = 0;
       return (0);
     }
@@ -92,8 +106,10 @@ static int ok(const char *p, int *f)
      * the @mkdir@.
      */
 
-    if (lstat(p, &st))
+    if (lstat(p, &st)) {
+      complain(p, "can't stat after creating", errno);
       return (0);
+    }
   }
 
   /* --- Make sure the directory is good --- *
@@ -102,7 +118,13 @@ static int ok(const char *p, int *f)
    * and writable only by its owner, and that owner must be me.
    */
 
-  if (S_ISDIR(st.st_mode) && (st.st_mode & 0777) == 0700 && st.st_uid == me)
+  if (!S_ISDIR(st.st_mode))
+    complain(p, "not a directory", 0);
+  else if (st.st_uid != me)
+    complain(p, "not owner", 0);
+  else if ((st.st_mode & 0777) != 0700)
+    complain(p, "non-owner access permitted", 0);
+  else
     return (1);
   return (0);
 }
@@ -300,7 +322,7 @@ int main(int argc, char *argv[])
   ego(argv[0]);
   me = cp.cp_uid = geteuid();
   cp.cp_what = (CP_WRWORLD | CP_WROTHGRP | CP_WROTHUSR |
-               CP_STICKYOK | CP_REPORT);
+               CP_STICKYOK | CP_REPORT | CP_ERROR);
   cp.cp_verbose = 0;
   cp.cp_report = report;
   cp.cp_gids = 0;                      /* ignore group membership */
@@ -313,7 +335,7 @@ int main(int argc, char *argv[])
   for (;;) {
     static struct option opts[] = {
       { "help",                0,              0,      'h' },
-      { "version",     0,              0,      'V' },
+      { "version",     0,              0,      'V' },
       { "usage",       0,              0,      'u' },
       { "bourne",      0,              0,      'b' },
       { "cshell",      0,              0,      'c' },
@@ -324,7 +346,7 @@ int main(int argc, char *argv[])
       { "group",       OPTF_ARGREQ,    0,      'g' },
       { 0,             0,              0,      0 }
     };
-    int i = mdwopt(argc, argv, "hVu" "bcvtg:c:", opts, 0, 0, 0);
+    int i = mdwopt(argc, argv, "hVu" "bcvtg:C:", opts, 0, 0, 0);
 
     if (i < 0)
       break;
@@ -386,7 +408,7 @@ int main(int argc, char *argv[])
     case sh_csh:
       printf("setenv TMPDIR \"%s\"\n", p);
        break;
-  }    
+  }
 
   return (0);
 }