X-Git-Url: https://www.tinc-vpn.org/git/browse?p=tinc;a=blobdiff_plain;f=src%2Ftincd.c;h=74dac49b0dc7eb2b2ff6f1365c780b71b7664dfe;hp=124276f1d0a0b41d1342f58b48ce72ab9f6458a9;hb=3219be5770716bdb0c8b6e9e4c674a447c5085f2;hpb=1243156a5e03a666b36bc4400f1402243a85c9a7 diff --git a/src/tincd.c b/src/tincd.c index 124276f1..74dac49b 100644 --- a/src/tincd.c +++ b/src/tincd.c @@ -17,6 +17,22 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ +/* + * $Log: tincd.c,v $ + * 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 +69,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 +95,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 +108,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 +127,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 +137,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 +165,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 +178,45 @@ 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); - } - kill(ppid, SIGTERM); + if(setsid() < 0) + return -1; + + kill(ppid, SIGTERM); + } - if(setsid() < 0) - return -1; chdir("/"); /* avoid keeping a mointpoint busy */ openlog(identname, LOG_CONS | LOG_PID, LOG_DAEMON); @@ -275,30 +307,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"; } } @@ -343,7 +375,7 @@ main(int argc, char **argv, char **envp) setup_signals(); if(detach()) - cleanup_and_exit(1); + exit(0); if(security_init()) return 1; @@ -432,10 +464,10 @@ RETSIGTYPE sighuh(int a) { if(cp_file) - syslog(LOG_NOTICE, "Got unexpected signal after %s line %d.", - cp_file, cp_line); + syslog(LOG_NOTICE, "Got unexpected signal (%d) after %s line %d.", + a, cp_file, cp_line); else - syslog(LOG_NOTICE, "Got unexpected signal."); + syslog(LOG_NOTICE, "Got unexpected signal (%d).", a); } void @@ -459,6 +491,7 @@ setup_signals(void) signal(SIGINT, sigint_handler); signal(SIGUSR1, sigusr1_handler); signal(SIGUSR2, sigusr2_handler); + signal(SIGCHLD, parent_exit); } RETSIGTYPE parent_exit(int a)