X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~mdw/git/tripe/blobdiff_plain/dd1cec9bf4dea5f6a68bcf5d3c47016f779558ea..2f20abf22453c3a3a5abb90921e3d0c75bf79ec6:/server/tripe.c diff --git a/server/tripe.c b/server/tripe.c index 522fe7f1..2dc03434 100644 --- a/server/tripe.c +++ b/server/tripe.c @@ -72,7 +72,7 @@ static void interval(struct timeval *tv, void *v) static void usage(FILE *fp) { - pquis(fp, "Usage: $ [-D] [-d DIR] [-b ADDR] [-p PORT] [-n TUNNEL]\n\ + pquis(fp, "Usage: $ [-DF] [-d DIR] [-b ADDR] [-p PORT] [-n TUNNEL]\n\ [-U USER] [-G GROUP] [-a SOCKET] [-T TRACE-OPTS]\n\ [-k PRIV-KEYRING] [-K PUB-KEYRING] [-t KEY-TAG]\n"); } @@ -93,6 +93,7 @@ Options:\n\ --tunnels Display IP tunnel drivers and exit.\n\ \n\ -D, --daemon Run in the background.\n\ +-F, --foreground Quit when stdin reports end-of-file.\n\ -d, --directory=DIR Switch to directory DIR [default " CONFIGDIR "].\n\ -b, --bind-address=ADDR Bind UDP socket to this IP ADDR.\n\ -p, --port=PORT Select UDP port to listen to " @@ -113,7 +114,7 @@ Options:\n\ int main(int argc, char *argv[]) { const char *kr_priv = "keyring", *kr_pub = "keyring.pub"; - const char *tag_priv = "tripe-dh"; + const char *tag_priv = 0; const char *csock = SOCKETDIR "/tripesock"; const char *dir = CONFIGDIR; const char *p; @@ -122,12 +123,14 @@ int main(int argc, char *argv[]) unsigned f = 0; int i; int selerr = 0; + unsigned af; struct timeval tv; uid_t u = -1; gid_t g = -1; #define f_bogus 1u #define f_daemon 2u +#define f_foreground 4u ego(argv[0]); T( trace_on(stderr, 0); ) @@ -146,6 +149,7 @@ int main(int argc, char *argv[]) { "tunnels", 0, 0, '0' }, { "daemon", 0, 0, 'D' }, + { "foreground", 0, 0, 'F' }, { "uid", OPTF_ARGREQ, 0, 'U' }, { "setuid", OPTF_ARGREQ, 0, 'U' }, { "gid", OPTF_ARGREQ, 0, 'G' }, @@ -165,7 +169,7 @@ int main(int argc, char *argv[]) { 0, 0, 0, 0 } }; - i = mdwopt(argc, argv, "hvuDU:G:b:n:p:d:k:K:t:a:" T("T:"), + i = mdwopt(argc, argv, "hvuDFU:G:b:n:p:d:k:K:t:a:" T("T:"), opts, 0, 0, 0); if (i < 0) break; @@ -189,6 +193,9 @@ int main(int argc, char *argv[]) case 'G': g = u_getgroup(optarg); break; + case 'F': + f |= f_foreground; + break; case 'b': { struct hostent *h = gethostbyname(optarg); @@ -256,6 +263,8 @@ int main(int argc, char *argv[]) usage(stderr); exit(EXIT_FAILURE); } + if (!(~f & (f_daemon | f_foreground))) + die(EXIT_FAILURE, "foreground operation for a daemon is silly"); if (chdir(dir)) { die(EXIT_FAILURE, "can't set current directory to `%s': %s", @@ -271,15 +280,18 @@ int main(int argc, char *argv[]) tunnels[i]->init(); p_init(baddr, port); if (!(f & f_daemon)) { + af = AF_WARN; #ifndef NTRACE - a_create(STDIN_FILENO, STDOUT_FILENO, AF_TRACE | AF_WARN); -#else - a_create(STDIN_FILENO, STDOUT_FILENO, AF_WARN); + af |= AF_TRACE; #endif + if (f & f_foreground) + af |= AF_FOREGROUND; + a_create(STDIN_FILENO, STDOUT_FILENO, af); } + ps_split(f & f_daemon); + a_init(csock, u, g); u_setugid(u, g); km_init(kr_priv, kr_pub, tag_priv); - a_init(csock); if (f & f_daemon) { if (daemonize()) die(EXIT_FAILURE, "couldn't become a daemon: %s", strerror(errno));