s6-sudo.c (2146B)
1 /* ISC license. */ 2 3 #include <skalibs/types.h> 4 #include <skalibs/sgetopt.h> 5 #include <skalibs/strerr.h> 6 #include <skalibs/exec.h> 7 8 #include <s6/config.h> 9 10 #define USAGE "s6-sudo [ -q | -Q | -v ] [ -p bindpath ] [ -l localname ] [ -e ] [ -t timeout ] [ -T timeoutrun ] path [ args... ]" 11 #define dieusage() strerr_dieusage(100, USAGE) 12 13 int main (int argc, char const *const *argv) 14 { 15 unsigned int verbosity = 1, t = 0, T = 0 ; 16 char const *bindpath = 0 ; 17 char const *localname = 0 ; 18 int nodoenv = 0 ; 19 PROG = "s6-sudo" ; 20 { 21 subgetopt l = SUBGETOPT_ZERO ; 22 for (;;) 23 { 24 int opt = subgetopt_r(argc, argv, "qQvp:l:et:T:", &l) ; 25 if (opt == -1) break ; 26 switch (opt) 27 { 28 case 'q' : if (verbosity) verbosity-- ; break ; 29 case 'Q' : verbosity = 1 ; break ; 30 case 'v' : verbosity++ ; break ; 31 case 'p' : bindpath = l.arg ; break ; 32 case 'l' : localname = l.arg ; break ; 33 case 'e' : nodoenv = 1 ; break ; 34 case 't' : if (!uint0_scan(l.arg, &t)) dieusage() ; break ; 35 case 'T' : if (!uint0_scan(l.arg, &T)) dieusage() ; break ; 36 default : dieusage() ; 37 } 38 } 39 argc -= l.ind ; argv += l.ind ; 40 } 41 if (!argc) dieusage() ; 42 if (verbosity > 4) verbosity = 4 ; 43 { 44 char const *eargv[9 + argc + ((verbosity < 2 ? 1 : verbosity-1)) + ((!!bindpath + !!localname) << 1) + nodoenv] ; 45 char fmt1[UINT_FMT] ; 46 char fmt2[UINT_FMT] ; 47 unsigned int n = 0 ; 48 eargv[n++] = S6_BINPREFIX "s6-ipcclient" ; 49 if (!verbosity) eargv[n++] = "-Q" ; 50 else while (--verbosity) eargv[n++] = "-v" ; 51 if (bindpath) { eargv[n++] = "-p" ; eargv[n++] = bindpath ; } 52 if (localname) { eargv[n++] = "-l" ; eargv[n++] = localname ; } 53 eargv[n++] = "--" ; 54 eargv[n++] = *argv++ ; argc-- ; 55 eargv[n++] = S6_BINPREFIX "s6-sudoc" ; 56 if (nodoenv) eargv[n++] = "-e" ; 57 eargv[n++] = "-t" ; 58 fmt1[uint_fmt(fmt1, t)] = 0 ; 59 eargv[n++] = fmt1 ; 60 eargv[n++] = "-T" ; 61 fmt2[uint_fmt(fmt2, T)] = 0 ; 62 eargv[n++] = fmt2 ; 63 eargv[n++] = "--" ; 64 while (argc--) eargv[n++] = *argv++ ; 65 eargv[n++] = 0 ; 66 xexec(eargv) ; 67 } 68 }