tmpdir: Fix usage message.
[checkpath] / tmpdir.c
index fde2e74..5d19e3a 100644 (file)
--- a/tmpdir.c
+++ b/tmpdir.c
@@ -1,7 +1,5 @@
 /* -*-c-*-
  *
- * $Id: tmpdir.c,v 1.5 2004/04/08 01:36:22 mdw Exp $
- *
  * Choose and check temporary directories
  *
  * (c) 1999 Mark Wooding
 
 /*----- Header files ------------------------------------------------------*/
 
+#include "config.h"
+
 #include <errno.h>
+#include <ctype.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #include <sys/stat.h>
 #include <unistd.h>
 #include <pwd.h>
+#include <grp.h>
 
 #include <mLib/alloc.h>
 #include <mLib/dstr.h>
+#include <mLib/macros.h>
 #include <mLib/mdwopt.h>
 #include <mLib/quis.h>
 #include <mLib/report.h>
 
 #include "checkpath.h"
+#include "utils.h"
 
 /*----- Static variables --------------------------------------------------*/
 
@@ -220,10 +224,17 @@ static char *goodtmp(void)
   return (0);
 }
 
+/* --- @report@ --- */
+
+static void report(unsigned what, int verbose,
+                  const char *p, const char *msg,
+                  void *arg)
+  { moan("%s", msg); }
+
 /* --- @usage@ --- */
 
 static void usage(FILE *fp)
-  { fprintf(fp, "Usage: %s [-bc] [-v PATH]\n", QUIS); }
+  { fprintf(fp, "Usage: %s [-bcv] [-g NAME] [-C PATH]\n", QUIS); }
 
 /* --- @version@ --- */
 
@@ -252,7 +263,9 @@ Options supported:\n\
 \n\
 -b, --bourne           Output a `TMPDIR' setting for Bourne shell users.\n\
 -c, --cshell           Output a `TMPDIR' setting for C shell users.\n\
--v, --verify PATH      Check whether PATH is good, setting exit status.\n\
+-v, --verbose          Report problems to standard error.\n\
+-g, --group NAME       Trust group NAME to be honest and true.\n\
+-C, --check PATH       Check whether PATH is good, setting exit status.\n\
 \n\
 The default action is to examine the caller's shell and output a suitable\n\
 setting for that shell type.\n\
@@ -274,6 +287,7 @@ int main(int argc, char *argv[])
 {
   int shell = 0;
   int duff = 0;
+  char *p;
 
   enum {
     sh_unknown,
@@ -284,11 +298,12 @@ int main(int argc, char *argv[])
   /* --- Initialize variables --- */
 
   ego(argv[0]);
-  me = geteuid();
-  cp.cp_what = CP_WRWORLD | CP_WRGRP | CP_WROTHUSR | CP_STICKYOK;
+  me = cp.cp_uid = geteuid();
+  cp.cp_what = (CP_WRWORLD | CP_WROTHGRP | CP_WROTHUSR |
+               CP_STICKYOK | CP_REPORT);
   cp.cp_verbose = 0;
-  cp.cp_report = 0;
-  checkpath_setids(&cp);
+  cp.cp_report = report;
+  cp.cp_gids = 0;                      /* ignore group membership */
   pw = getpwuid(me);
   if (!pw)
     die(1, "you don't exist");
@@ -302,10 +317,14 @@ int main(int argc, char *argv[])
       { "usage",       0,              0,      'u' },
       { "bourne",      0,              0,      'b' },
       { "cshell",      0,              0,      'c' },
-      { "verify",      OPTF_ARGREQ,    0,      'v' },
+      { "check",       OPTF_ARGREQ,    0,      'C' },
+      { "verify",      OPTF_ARGREQ,    0,      'C' },
+      { "verbose",     0,              0,      'v' },
+      { "trust-groups",        0,              0,      't' },
+      { "group",       OPTF_ARGREQ,    0,      'g' },
       { 0,             0,              0,      0 }
     };
-    int i = mdwopt(argc, argv, "hVu" "bcv:", opts, 0, 0, 0);
+    int i = mdwopt(argc, argv, "hVu" "bcvtg:c:", opts, 0, 0, 0);
 
     if (i < 0)
       break;
@@ -325,9 +344,15 @@ int main(int argc, char *argv[])
       case 'c':
        shell = sh_csh;
        break;
-      case 'v':
+      case 'C':
        return (!fullcheck(optarg));
        break;
+      case 'g':
+       allowgroup(&cp, optarg);
+       break;
+      case 'v':
+       cp.cp_verbose++;
+       break;
       default:
        duff = 1;
        break;
@@ -342,7 +367,6 @@ int main(int argc, char *argv[])
   /* --- Choose a shell --- */
 
   if (!shell) {
-    char *p;
     if (!(p = getenv("SHELL")))
       p = pw->pw_shell;
     if (strstr(p, "csh"))
@@ -353,19 +377,16 @@ int main(int argc, char *argv[])
 
   /* --- Start the checking --- */
 
-  {
-    char *p = goodtmp();
-    if (!p)
-      die(1, "no good tmp directory");
-    switch (shell) {
-      case sh_bourne:
-       printf("TMPDIR=\"%s\"; export TMPDIR\n", p);
-       break;
-      case sh_csh:
-       printf("setenv TMPDIR \"%s\"\n", p);
+  if ((p = goodtmp()) == 0)
+    die(1, "no good tmp directory");
+  switch (shell) {
+    case sh_bourne:
+      printf("TMPDIR=\"%s\"; export TMPDIR\n", p);
+      break;
+    case sh_csh:
+      printf("setenv TMPDIR \"%s\"\n", p);
        break;
-    }
-  }
+  }    
 
   return (0);
 }