/* --- @usage@ --- */
static void usage(FILE *fp)
- { fprintf(fp, "Usage: %s [-pqstv] [-g NAME] [PATH...]\n", QUIS); }
+ { fprintf(fp, "Usage: %s [-Tpqstv] [-g NAME] [PATH...]\n", QUIS); }
/* --- @version@ --- */
-V, --version Display the program's version number.\n\
-u, --usage Show a terse usage summary.\n\
\n\
+-T, --private-group Accept paths writable by primary group if it has\n\
+ no other members.\n\
-g, --group NAME Consider members of group NAME trustworthy.\n\
-p, --print Write the secure path elements to standard output.\n\
-q, --quiet Be quiet about the search progress (cumulative).\n\
int i;
char *p, *q, *path;
struct checkpath cp;
+ gid_t gid;
int f = 0;
#define f_print 1u
{ "help", 0, 0, 'h' },
{ "version", 0, 0, 'V' },
{ "usage", 0, 0, 'u' },
+ { "private-group", 0, 0, 'T' },
{ "group", OPTF_ARGREQ, 0, 'g' },
{ "print", 0, 0, 'p' },
{ "quiet", 0, 0, 'q' },
{ 0, 0, 0, 0 }
};
- i = mdwopt(argc, argv, "hVu" "g:pqstv", opts, 0, 0, 0);
+ i = mdwopt(argc, argv, "hVu" "Tg:pqstv", opts, 0, 0, 0);
if (i < 0)
break;
switch (i) {
case 'u':
usage(stdout);
exit(0);
+ case 'T':
+ if (!private_group(&gid, cp.cp_verbose) &&
+ checkpath_addgid(&cp, gid))
+ die(1, "too many groups");
+ break;
case 'g':
allowgroup(&cp, optarg);
break;