tmpdir.c: Explain why we reject candidates, if we do.
authorMark Wooding <mdw@distorted.org.uk>
Mon, 22 Dec 2014 20:32:58 +0000 (20:32 +0000)
committerMark Wooding <mdw@distorted.org.uk>
Tue, 31 Mar 2015 10:57:49 +0000 (11:57 +0100)
tmpdir.c

index b14f6d6..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);
 }