- const char *kr_priv = "keyring", *kr_pub = "keyring.pub";
- const char *tag_priv = "tripe-dh";
- const char *csock = SOCKETDIR "/tripesock";
- const char *dir = CONFIGDIR;
- const char *p;
- unsigned port = 0;
- struct in_addr baddr = { INADDR_ANY };
- unsigned f = 0;
- int i;
- int selerr = 0;
- struct timeval tv;
- uid_t u = -1;
- gid_t g = -1;
-
-#define f_bogus 1u
-#define f_daemon 2u
-
- ego(argv[0]);
- T( trace_on(stderr, 0); )
-
- if ((p = getenv("TRIPEDIR")) != 0)
- dir = p;
- tun_default = tunnels[0];
-
- for (;;) {
- static const struct option opts[] = {
- { "help", 0, 0, 'h' },
- { "version", 0, 0, 'v' },
- { "usage", 0, 0, 'u' },
- { "tunnels", 0, 0, '0' },
-
- { "daemon", 0, 0, 'D' },
- { "uid", OPTF_ARGREQ, 0, 'U' },
- { "setuid", OPTF_ARGREQ, 0, 'U' },
- { "gid", OPTF_ARGREQ, 0, 'G' },
- { "setgid", OPTF_ARGREQ, 0, 'G' },
- { "bind-address", OPTF_ARGREQ, 0, 'b' },
- { "tunnel", OPTF_ARGREQ, 0, 'n' },
- { "port", OPTF_ARGREQ, 0, 'p' },
- { "directory", OPTF_ARGREQ, 0, 'd' },
- { "priv-keyring", OPTF_ARGREQ, 0, 'k' },
- { "pub-keyring", OPTF_ARGREQ, 0, 'K' },
- { "tag", OPTF_ARGREQ, 0, 't' },
- { "admin-socket", OPTF_ARGREQ, 0, 'a' },
-#ifndef NTRACE
- { "trace", OPTF_ARGREQ, 0, 'T' },
-#endif
-
- { 0, 0, 0, 0 }
- };
-
- i = mdwopt(argc, argv, "hvuDU:G:b:p:d:k:K:t:a:" T("T:"),
- opts, 0, 0, 0);
- if (i < 0)
- break;
- switch (i) {
- case 'h':
- help(stdout);
- exit(0);
- case 'v':
- version(stdout);
- exit(0);
- case 'u':
- usage(stdout);
- exit(0);
-
- 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 'b': {
- struct hostent *h = gethostbyname(optarg);
- if (!h)
- die(EXIT_FAILURE, "unknown host name `%s'", optarg);
- memcpy(&baddr, h->h_addr, sizeof(struct in_addr));
- } break;
- case 'p': {
- char *p;
- unsigned long i = strtoul(optarg, &p, 0);
- if (*p) {
- struct servent *s = getservbyname(optarg, "udp");
- if (!s)
- die(EXIT_FAILURE, "unknown service name `%s'", optarg);
- i = ntohs(s->s_port);
- }
- if (i == 0 || i >= 65536)
- die(EXIT_FAILURE, "bad port number %lu", i);
- port = i;
- } break;
- case 'n': {
- int i;
- for (i = 0;; i++) {
- if (!tunnels[i])
- die(EXIT_FAILURE, "unknown tunnel `%s'", optarg);
- if (mystrieq(optarg, tunnels[i]->name))
- break;
- }
- tun_default = tunnels[i];
- } break;
- case 'd':
- dir = optarg;
- break;
- case 'k':
- kr_priv = optarg;
- break;
- case 'K':
- kr_pub = optarg;
- break;
- case 'a':
- csock = optarg;
- break;
- case 't':
- tag_priv = optarg;
- break;
-#ifndef NTRACE
- case 'T':
- tr_flags = traceopt(tr_opts, optarg, tr_flags, 0);
- trace_level(tr_flags);
- break;
-#endif
- case '0': {
- int i;
- for (i = 0; tunnels[i]; i++)
- puts(tunnels[i]->name);
- exit(0);
- } break;
- default:
- f |= f_bogus;
- break;
- }
- }