summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/daemontools-extras/s6-setuidgid.c34
1 files changed, 26 insertions, 8 deletions
diff --git a/src/daemontools-extras/s6-setuidgid.c b/src/daemontools-extras/s6-setuidgid.c
index cc7f21a..30cce8c 100644
--- a/src/daemontools-extras/s6-setuidgid.c
+++ b/src/daemontools-extras/s6-setuidgid.c
@@ -1,5 +1,6 @@
/* ISC license. */
+#include <skalibs/bytestr.h>
#include <skalibs/strerr2.h>
#include <skalibs/djbunix.h>
#include <s6/config.h>
@@ -7,18 +8,35 @@
#define USAGE "s6-setuidgid username prog..."
#define dieusage() strerr_dieusage(100, USAGE)
-int main (int argc, char const *const *argv, char const *const *envp)
+int main (int argc, char *const *argv, char const *const *envp)
{
- char const *newargv[argc + 4] ;
- unsigned int m = 5 ;
+ char const *newargv[argc + 7] ;
+ unsigned int m = 0 ;
+ unsigned int pos ;
PROG = "s6-setuidgid" ;
if (argc < 3) dieusage() ;
argv++ ;
- newargv[0] = S6_BINPREFIX "s6-envuidgid" ;
- newargv[1] = *argv++ ;
- newargv[2] = S6_BINPREFIX "s6-applyuidgid" ;
- newargv[3] = "-Uz" ;
- newargv[4] = "--" ;
+ pos = str_chr(argv[0], ':') ;
+ if (argv[0][pos])
+ {
+ argv[0][pos] = 0 ;
+ newargv[m++] = S6_BINPREFIX "s6-applyuidgid" ;
+ newargv[m++] = "-u" ;
+ newargv[m++] = argv[0] ;
+ newargv[m++] = "-g" ;
+ newargv[m++] = argv[0] + pos + 1 ;
+ newargv[m++] = "-G" ;
+ newargv[m++] = "" ;
+ argv++ ;
+ }
+ else
+ {
+ newargv[m++] = S6_BINPREFIX "s6-envuidgid" ;
+ newargv[m++] = *argv++ ;
+ newargv[m++] = S6_BINPREFIX "s6-applyuidgid" ;
+ newargv[m++] = "-Uz" ;
+ }
+ newargv[m++] = "--" ;
while (*argv) newargv[m++] = *argv++ ;
newargv[m++] = 0 ;
pathexec_run(newargv[0], newargv, envp) ;