chiark
/
gitweb
/
~mdw
/
tripe
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
client: New options for setting user and group identities.
[tripe]
/
client
/
tripectl.c
diff --git
a/client/tripectl.c
b/client/tripectl.c
index 133170475f5a9dd5095fc8767a7f21e54f8eed25..6a2f82ab265f5c0f4c29a7ef692d3b7e2dbc10fe 100644
(file)
--- a/
client/tripectl.c
+++ b/
client/tripectl.c
@@
-318,6
+318,8
@@
Options in full:\n\
\n\
-D, --daemon Become a background task after connecting.\n\
-d, --directory=DIR Select current directory [default " CONFIGDIR "].\n\
\n\
-D, --daemon Become a background task after connecting.\n\
-d, --directory=DIR Select current directory [default " CONFIGDIR "].\n\
+-U, --setuid=USER Set uid to USER after initialization.\n\
+-G, --setgid=GROUP Set gid to GROUP after initialization.\n\
-a, --admin-socket=FILE Select socket to connect to\n\
[default " SOCKETDIR "/tripesock].\n\
-P, --pidfile=FILE Write process-id to FILE.\n\
-a, --admin-socket=FILE Select socket to connect to\n\
[default " SOCKETDIR "/tripesock].\n\
-P, --pidfile=FILE Write process-id to FILE.\n\
@@
-340,6
+342,8
@@
int main(int argc, char *argv[])
string_v spawnopts = DA_INIT;
char *p;
FILE *pidfp = 0;
string_v spawnopts = DA_INIT;
char *p;
FILE *pidfp = 0;
+ uid_t u = -1;
+ gid_t g = -1;
ego(argv[0]);
ego(argv[0]);
@@
-356,6
+360,10
@@
int main(int argc, char *argv[])
{ "version", 0, 0, 'v' },
{ "usage", 0, 0, 'u' },
{ "daemon", 0, 0, 'D' },
{ "version", 0, 0, 'v' },
{ "usage", 0, 0, 'u' },
{ "daemon", 0, 0, 'D' },
+ { "uid", OPTF_ARGREQ, 0, 'U' },
+ { "setuid", OPTF_ARGREQ, 0, 'U' },
+ { "gid", OPTF_ARGREQ, 0, 'G' },
+ { "setgid", OPTF_ARGREQ, 0, 'G' },
{ "directory", OPTF_ARGREQ, 0, 'd' },
{ "admin-socket", OPTF_ARGREQ, 0, 'a' },
{ "spawn", 0, 0, 's' },
{ "directory", OPTF_ARGREQ, 0, 'd' },
{ "admin-socket", OPTF_ARGREQ, 0, 'a' },
{ "spawn", 0, 0, 's' },
@@
-368,7
+376,7
@@
int main(int argc, char *argv[])
{ 0, 0, 0, 0 }
};
{ 0, 0, 0, 0 }
};
- int i = mdwopt(argc, argv, "+hvuDd:a:sp:S:lwf:nP:", opts, 0, 0, 0);
+ int i = mdwopt(argc, argv, "+hvuD
U:G:
d:a:sp:S:lwf:nP:", opts, 0, 0, 0);
if (i < 0)
break;
switch (i) {
if (i < 0)
break;
switch (i) {
@@
-384,6
+392,12
@@
int main(int argc, char *argv[])
case 'D':
f |= f_daemon | f_noinput;
break;
case 'D':
f |= f_daemon | f_noinput;
break;
+ case 'U':
+ u = u_getuser(optarg, &g);
+ break;
+ case 'G':
+ g = u_getgroup(optarg);
+ break;
case 'd':
dir = optarg;
break;
case 'd':
dir = optarg;
break;
@@
-461,6
+475,8
@@
int main(int argc, char *argv[])
sigaction(SIGCHLD, &sa, 0);
DA_PUSH(&spawnopts, 0);
sigaction(SIGCHLD, &sa, 0);
DA_PUSH(&spawnopts, 0);
+ if (g != (gid_t)-1) putarg(&spawnopts, "-G%lu", (unsigned long)g);
+ if (u != (uid_t)-1) putarg(&spawnopts, "-U%lu", (unsigned long)u);
putarg(&spawnopts, "-a%s", sock);
putarg(&spawnopts, "-d.");
putarg(&spawnopts, "-F");
putarg(&spawnopts, "-a%s", sock);
putarg(&spawnopts, "-d.");
putarg(&spawnopts, "-F");
@@
-504,6
+520,7
@@
int main(int argc, char *argv[])
}
}
}
}
+ u_setugid(u, g);
if (f & f_daemon) {
if (daemonize())
die(EXIT_FAILURE, "error becoming daemon: %s", strerror(errno));
if (f & f_daemon) {
if (daemonize())
die(EXIT_FAILURE, "error becoming daemon: %s", strerror(errno));