X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~mdw/git/tripe/blobdiff_plain/c511e1f925da3e735fb494d522ae3ae0f17ab9ce..12475f48a222535b290dd68d4f606b62bd8152f3:/server/tripe.c diff --git a/server/tripe.c b/server/tripe.c index dd385fbd..ebd8efc7 100644 --- a/server/tripe.c +++ b/server/tripe.c @@ -1,13 +1,11 @@ /* -*-c-*- - * - * $Id$ * * Main program * * (c) 2001 Straylight/Edgeware */ -/*----- Licensing notice --------------------------------------------------* +/*----- Licensing notice --------------------------------------------------* * * This file is part of Trivial IP Encryption (TrIPE). * @@ -15,12 +13,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. - * + * * TrIPE is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * * You should have received a copy of the GNU General Public License * along with TrIPE; if not, write to the Free Software Foundation, * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. @@ -62,23 +60,6 @@ static void interval(struct timeval *tv, void *v) sel_addtimer(&sel, &it, &tvv, interval, v); } -/* --- @mystrieq@ --- * - * - * Arguments: @const char *x, *y@ = two strings - * - * Returns: True if @x@ and @y are equal, up to case. - */ - -int mystrieq(const char *x, const char *y) -{ - for (;;) { - if (!*x && !*y) return (1); - if (tolower((unsigned char)*x) != tolower((unsigned char)*y)) - return (0); - x++; y++; - } -} - /* --- @main@ --- * * * Arguments: @int argc@ = number of command line arguments @@ -91,15 +72,12 @@ int mystrieq(const char *x, const char *y) 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"); } -static void version(FILE *fp) -{ - pquis(fp, "$, version " VERSION "\n"); -} +static void version(FILE *fp) { pquis(fp, "$, version " VERSION "\n"); } static void help(FILE *fp) { @@ -115,9 +93,11 @@ 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.\n\ +-p, --port=PORT Select UDP port to listen to " + "[default " STR(TRIPE_PORT) "].\n\ -n, --tunnel=TUNNEL Seelect default tunnel driver.\n\ -U, --setuid=USER Set uid to USER after initialization.\n\ -G, --setgid=GROUP Set gid to GROUP after initialization.\n\ @@ -138,23 +118,27 @@ int main(int argc, char *argv[]) const char *csock = SOCKETDIR "/tripesock"; const char *dir = CONFIGDIR; const char *p; - unsigned port = 0; + unsigned port = TRIPE_PORT; struct in_addr baddr = { INADDR_ANY }; 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); ) if ((p = getenv("TRIPEDIR")) != 0) dir = p; + if ((p = getenv("TRIPESOCK")) != 0) + csock = p; tun_default = tunnels[0]; for (;;) { @@ -165,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' }, @@ -184,7 +169,7 @@ int main(int argc, char *argv[]) { 0, 0, 0, 0 } }; - i = mdwopt(argc, argv, "hvuDU:G:b: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; @@ -202,32 +187,15 @@ int main(int argc, char *argv[]) case 'D': f |= f_daemon; break; - case 'U': { - struct passwd *pw; - char *p; - unsigned long i = strtoul(optarg, &p, 0); - if (!*p) - 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) - gr = getgrgid(i); - else - gr = getgrnam(optarg); - if (!gr) - die(EXIT_FAILURE, "group `%s' not found", optarg); - g = gr->gr_gid; - } break; + case 'U': + u = u_getuser(optarg, &g); + break; + case 'G': + g = u_getgroup(optarg); + break; + case 'F': + f |= f_foreground; + break; case 'b': { struct hostent *h = gethostbyname(optarg); @@ -244,7 +212,7 @@ int main(int argc, char *argv[]) die(EXIT_FAILURE, "unknown service name `%s'", optarg); i = ntohs(s->s_port); } - if (i == 0 || i >= 65536) + if (i >= 65536) die(EXIT_FAILURE, "bad port number %lu", i); port = i; } break; @@ -295,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", @@ -310,28 +280,19 @@ 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); } - 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 != (uid_t)-1) { - if (setuid(u)) { - die(EXIT_FAILURE, "couldn't setuid to %u: %s", - (unsigned)u, strerror(errno)); - } - } + u_setugid(u, g); km_init(kr_priv, kr_pub, tag_priv); a_init(csock); if (f & f_daemon) { - if (u_daemon()) + if (daemonize()) die(EXIT_FAILURE, "couldn't become a daemon: %s", strerror(errno)); a_daemon(); }