X-Git-Url: https://www.tinc-vpn.org/git/browse?p=tinc;a=blobdiff_plain;f=src%2Ftincd.c;h=251e125156b3ac2230188a97854b749865d22323;hp=0da27a38d49f43b6403649b89ceeeaffc2fc34e1;hb=61e71ab74ad9b5edb044b84ccf1111a33eb468cb;hpb=f2076e3e7031ac8ad87eb6aab0cea40f379dd0c6 diff --git a/src/tincd.c b/src/tincd.c index 0da27a38..251e1251 100644 --- a/src/tincd.c +++ b/src/tincd.c @@ -1,6 +1,6 @@ /* tincd.c -- the main file for tincd - Copyright (C) 1998,99 Ivo Timmermans + Copyright (C) 1998,1999,2000 Ivo Timmermans This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -17,6 +17,25 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ +/* + * $Log: tincd.c,v $ + * Revision 1.8 2000/05/14 12:22:42 guus + * Cleanups. + * + * Revision 1.7 2000/04/27 13:47:51 zarq + * Default config file name is tinc.conf, and pidfile is tinc.pid. + * + * Revision 1.6 2000/04/18 16:04:10 zarq + * Address for bugreports changed to tinc@nl.linux.org. + * + * Revision 1.5 2000/04/17 16:23:29 zarq + * Pass the requested size from xmalloc() and xrealloc() on to xalloc_fail_func() + * + * Revision 1.4 2000/04/06 18:28:29 zarq + * New option -D, don't detach. + * + */ + #include "config.h" #include @@ -53,6 +72,9 @@ static int show_version; /* If nonzero, it will attempt to kill a running tincd and exit. */ static int kill_tincd = 0; +/* If zero, don't detach from the terminal. */ +static int do_detach = 1; + char *confbase = NULL; /* directory in which all config files are */ char *configfilename = NULL; /* configuration file name */ char *identname; /* program name for syslog */ @@ -76,6 +98,7 @@ static struct option const long_options[] = { "timeout", required_argument, NULL, 'p' }, { "help", no_argument, &show_help, 1 }, { "version", no_argument, &show_version, 1 }, + { "no-detach", no_argument, &do_detach, 0 }, { NULL, 0, NULL, 0 } }; @@ -88,13 +111,14 @@ usage(int status) { printf("Usage: %s [option]...\n\n", program_name); printf(" -c, --config=FILE Read configuration options from FILE.\n" + " -D, --no-detach Don't fork and detach.\n" " -d Increase debug level.\n" " -k, --kill Attempt to kill a running tincd and exit.\n" " -n, --net=NETNAME Connect to net NETNAME.\n" " -t, --timeout=TIMEOUT Seconds to wait before giving a timeout.\n"); printf(" --help Display this help and exit.\n" " --version Output version information and exit.\n\n"); - printf("Report bugs to zarq@iname.com.\n"); + printf("Report bugs to tinc@nl.linux.org.\n"); } exit(status); } @@ -106,7 +130,7 @@ parse_options(int argc, char **argv, char **envp) int option_index = 0; config_t *p; - while((r = getopt_long(argc, argv, "c:dkn:t:", long_options, &option_index)) != EOF) + while((r = getopt_long(argc, argv, "c:Ddkn:t:", long_options, &option_index)) != EOF) { switch(r) { @@ -116,6 +140,9 @@ parse_options(int argc, char **argv, char **envp) configfilename = xmalloc(strlen(optarg)+1); strcpy(configfilename, optarg); break; + case 'D': /* no detach */ + do_detach = 0; + break; case 'd': /* inc debug level */ debug_lvl++; break; @@ -141,9 +168,9 @@ parse_options(int argc, char **argv, char **envp) } } -void memory_full(void) +void memory_full(int size) { - syslog(LOG_ERR, "Memory exhausted; exiting."); + syslog(LOG_ERR, "Memory exhausted (last is %s:%d) (couldn't allocate %d bytes); exiting.", cp_file, cp_line, size); exit(1); } @@ -154,37 +181,44 @@ int detach(void) { int fd; pid_t pid; - - ppid = getpid(); - if((pid = fork()) < 0) - { - perror("fork"); - return -1; - } - if(pid) /* parent process */ + + if(do_detach) { - signal(SIGTERM, parent_exit); - sleep(600); /* wait 10 minutes */ - exit(1); - } + ppid = getpid(); + if((pid = fork()) < 0) + { + perror("fork"); + return -1; + } + if(pid) /* parent process */ + { + signal(SIGTERM, parent_exit); + sleep(600); /* wait 10 minutes */ + exit(1); + } + } + if(write_pidfile()) return -1; - if((fd = open("/dev/tty", O_RDWR)) >= 0) + if(do_detach) { - if(ioctl(fd, TIOCNOTTY, NULL)) + if((fd = open("/dev/tty", O_RDWR)) >= 0) { - perror("ioctl"); - return -1; + if(ioctl(fd, TIOCNOTTY, NULL)) + { + perror("ioctl"); + return -1; + } + close(fd); } - close(fd); - } - if(setsid() < 0) - return -1; + if(setsid() < 0) + return -1; - kill(ppid, SIGTERM); + kill(ppid, SIGTERM); + } chdir("/"); /* avoid keeping a mointpoint busy */ @@ -276,30 +310,30 @@ void make_names(void) if(netname) { configfilename = xmalloc(strlen(netname)+18+strlen(CONFDIR)); - sprintf(configfilename, "%s/tinc/%s/tincd.conf", CONFDIR, netname); + sprintf(configfilename, "%s/tinc/%s/tinc.conf", CONFDIR, netname); } else { configfilename = xmalloc(17+strlen(CONFDIR)); - sprintf(configfilename, "%s/tinc/tincd.conf", CONFDIR); + sprintf(configfilename, "%s/tinc/tinc.conf", CONFDIR); } } if(netname) { pidfilename = xmalloc(strlen(netname)+20); - sprintf(pidfilename, "/var/run/tincd.%s.pid", netname); + sprintf(pidfilename, "/var/run/tinc.%s.pid", netname); confbase = xmalloc(strlen(netname)+8+strlen(CONFDIR)); sprintf(confbase, "%s/tinc/%s/", CONFDIR, netname); identname = xmalloc(strlen(netname)+7); - sprintf(identname, "tincd.%s", netname); + sprintf(identname, "tinc.%s", netname); } else { - pidfilename = "/var/run/tincd.pid"; + pidfilename = "/var/run/tinc.pid"; confbase = xmalloc(7+strlen(CONFDIR)); sprintf(confbase, "%s/tinc/", CONFDIR); - identname = "tincd"; + identname = "tinc"; } } @@ -312,7 +346,7 @@ main(int argc, char **argv, char **envp) if(show_version) { - printf("%s version %s\nCopyright (C) 1998,99 Ivo Timmermans and others,\n" + printf("%s version %s\nCopyright (C) 1998,1999,2000 Ivo Timmermans and others,\n" "see the AUTHORS file for a complete list.\n\n" "tinc comes with ABSOLUTELY NO WARRANTY. This is free software,\n" "and you are welcome to redistribute it under certain conditions;\n" @@ -344,10 +378,7 @@ main(int argc, char **argv, char **envp) setup_signals(); if(detach()) - { - kill(ppid, SIGTERM); - exit(0); - } + exit(0); if(security_init()) return 1; @@ -463,10 +494,10 @@ setup_signals(void) signal(SIGINT, sigint_handler); signal(SIGUSR1, sigusr1_handler); signal(SIGUSR2, sigusr2_handler); + signal(SIGCHLD, parent_exit); } RETSIGTYPE parent_exit(int a) { exit(0); } -