/* -*-c-*-
- *
- * $Id$
*
* Main program
*
* (c) 2001 Straylight/Edgeware
*/
-/*----- Licensing notice --------------------------------------------------*
+/*----- Licensing notice --------------------------------------------------*
*
* This file is part of Trivial IP Encryption (TrIPE).
*
* 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.
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
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");
}
--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\
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;
- 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); )
{ "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' },
{ 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;
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);
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;
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",
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));
- }
- }
+ 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));