X-Git-Url: https://git.distorted.org.uk/~mdw/tripe/blobdiff_plain/3785235941bd2ca64d5730223e52da33f0f7871c..0e588014f23cca308747a70dfc1387aaaadf5ddd:/tripe.c diff --git a/tripe.c b/tripe.c index 2f423f84..9e225659 100644 --- a/tripe.c +++ b/tripe.c @@ -1,6 +1,6 @@ /* -*-c-*- * - * $Id: tripe.c,v 1.4 2001/02/16 21:41:31 mdw Exp $ + * $Id: tripe.c,v 1.9 2003/04/15 14:11:09 mdw Exp $ * * Main program * @@ -29,6 +29,21 @@ /*----- Revision history --------------------------------------------------* * * $Log: tripe.c,v $ + * Revision 1.9 2003/04/15 14:11:09 mdw + * Rationalize the behaviour of the `-G' and `-U' options. + * + * Revision 1.8 2002/01/13 17:28:29 mdw + * Don't turn tracing on if tracing is turned off (!). + * + * Revision 1.7 2002/01/13 17:14:05 mdw + * Don't include the tracing option in the help if not compiled in. + * + * Revision 1.6 2001/06/19 22:08:37 mdw + * Moved buffers to peer.c. + * + * Revision 1.5 2001/02/16 21:43:12 mdw + * Provide a more helpful usage message. + * * Revision 1.4 2001/02/16 21:41:31 mdw * Add a new buffer. * @@ -50,7 +65,6 @@ /*----- Global variables --------------------------------------------------*/ sel_state sel; -octet buf_i[PKBUFSZ], buf_o[PKBUFSZ], buf_t[PKBUFSZ]; /*----- Static variables --------------------------------------------------*/ @@ -92,7 +106,9 @@ void interval(struct timeval *tv, void *v) static void usage(FILE *fp) { - pquis(fp, "Usage: $ [-options]\n"); + pquis(fp, "Usage: $ [-D] [-d dir] [-p port] [-U user] [-G group]\n\ + [-k priv-keyring] [-K pub-keyring] [-t key-tag]\n\ + [-a socket] [-T trace-opts]\n"); } static void version(FILE *fp) @@ -115,11 +131,15 @@ Options:\n\ -D, --daemon Run in the background.\n\ -d, --directory=DIR Switch to directory DIR (default $TRIPEDIR).\n\ -p, --port=PORT Select UDP port to listen to.\n\ +-u, --setuid=USER Set uid to USER after initialization.\n\ +-g, --setgid=GROUP Set gid to GROUP after initialization.\n\ -k, --priv-keyring=FILE Get private key from FILE.\n\ -K, --pub-keyring=FILE Get public keys from FILE.\n\ -t, --tag=KEYTAG Use private key labelled TAG.\n\ -a, --admin-socket=FILE Use FILE as the adminstration socket.\n\ +" T( "\ -T, --trace=OPTIONS Turn on tracing options.\n\ +" ) "\ ", fp); } @@ -139,7 +159,7 @@ int main(int argc, char *argv[]) #define f_daemon 2u ego(argv[0]); - trace_on(stderr, 0); + T( trace_on(stderr, 0); ) if ((p = getenv("TRIPEDIR")) != 0) dir = p; @@ -187,28 +207,30 @@ int main(int argc, char *argv[]) f |= f_daemon; break; case 'U': { + struct passwd *pw; char *p; unsigned long i = strtoul(optarg, &p, 0); if (!*p) - u = i; - else { - struct passwd *pw; - if ((pw = getpwnam(optarg)) == 0) - die(EXIT_FAILURE, "user name `%s' not found", optarg); - u = pw->pw_uid; - } + pw = getpwuid(i); + else + pw = getpwnam(optarg); + if (!pw) + die(EXIT_FAILURE, "user `%s' not found", optarg); + u = pw->pw_uid; + if (g == -1) + g = pw->pw_gid; } break; case 'G': { + struct group *gr; char *p; unsigned long i = strtoul(optarg, &p, 0); if (!*p) - g = i; - else { - struct group *gr; - if ((gr = getgrnam(optarg)) == 0) - die(EXIT_FAILURE, "group name `%s' not found", optarg); - g = gr->gr_gid; - } + gr = getgrgid(i); + else + gr = getgrnam(optarg); + if (!gr) + die(EXIT_FAILURE, "group `%s' not found", optarg); + g = gr->gr_gid; } break; case 'p': { @@ -270,13 +292,13 @@ int main(int argc, char *argv[]) p_init(port); if (!(f & f_daemon)) a_create(STDIN_FILENO, STDOUT_FILENO); - if (g != -1) { - if (setgid(g)) { + if (g != (gid_t)-1) { + if (setgid(g) || (getuid() == 0 && setgroups(1, &g))) { die(EXIT_FAILURE, "couldn't setgid to %u: %s", (unsigned)g, strerror(errno)); } } - if (u != -1) { + if (u != (uid_t)-1) { if (setuid(u)) { die(EXIT_FAILURE, "couldn't setuid to %u: %s", (unsigned)u, strerror(errno));