X-Git-Url: http://git.silcnet.org/gitweb/?a=blobdiff_plain;f=apps%2Fsilcd%2Fsilcd.c;h=cf3315a2cd126100a2611548ee6e1c271d797dda;hb=d47a87b03b846e2333ef57b2c0d81f1644992964;hp=e740fd1bf27ddeb50dd9c6bcaadf5a611fd96110;hpb=d724e6e0616bad77bdcd83ed08a3f20daf5660b2;p=silc.git diff --git a/apps/silcd/silcd.c b/apps/silcd/silcd.c index e740fd1b..cf3315a2 100644 --- a/apps/silcd/silcd.c +++ b/apps/silcd/silcd.c @@ -1,23 +1,23 @@ /* silcd.c - + Author: Pekka Riikonen - Copyright (C) 1997 - 2001 Pekka Riikonen + Copyright (C) 1997 - 2002 Pekka Riikonen 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 the Free Software Foundation; either version 2 of the License, or (at your option) any later version. - + This program 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. */ -/* +/* * Created: Wed Mar 19 00:17:12 1997 * * This is the main program for the SILC daemon. This parses command @@ -29,16 +29,19 @@ #include "server_internal.h" #include "version.h" +/* For now, we'll have this one server context global for this module. */ +static SilcServer silcd; + static void silc_usage(); static char *silc_server_create_identifier(); -static int +static int silc_server_create_key_pair(char *pkcs_name, int bits, char *path, - char *identifier, + char *identifier, SilcPublicKey *ret_pub_key, SilcPrivateKey *ret_prv_key); /* Long command line options */ -static struct option long_opts[] = +static struct option long_opts[] = { { "config-file", 1, NULL, 'f' }, { "debug", 1, NULL, 'd' }, @@ -99,15 +102,15 @@ Usage: silcd [options]\n\ /* Dies if a *valid* pid file exists already */ -static void silc_checkpid(SilcServer silcd) +static void silc_server_checkpid(SilcServer silcd) { - if (silcd->config->pidfile && silcd->config->pidfile->pid_file) { + if (silcd->config->server_info->pid_file) { int oldpid; char *buf; uint32 buf_len; SILC_LOG_DEBUG(("Checking for another silcd running")); - buf = silc_file_readfile(silcd->config->pidfile->pid_file, &buf_len); + buf = silc_file_readfile(silcd->config->server_info->pid_file, &buf_len); if (!buf) return; oldpid = atoi(buf); @@ -118,25 +121,38 @@ static void silc_checkpid(SilcServer silcd) if (errno != ESRCH) { fprintf(stderr, "\nI detected another daemon running with the same pid file.\n"); fprintf(stderr, "Please change the config file, or erase the %s\n", - silcd->config->pidfile->pid_file); + silcd->config->server_info->pid_file); exit(1); } } } +static void got_hup(int z) +{ + /* First, reset all log files (they might have been deleted) */ + silc_log_reset_all(); + silc_log_flush_all(); +} + +static void stop_server(int z) +{ + /* Stop scheduler, the program will stop eventually after noticing + that the scheduler is down. */ + silc_schedule_stop(silcd->schedule); +} + int main(int argc, char **argv) { int ret, opt, option_index; char *config_file = NULL; bool foreground = FALSE; - SilcServer silcd; struct sigaction sa; /* Parse command line arguments */ if (argc > 1) { while ((opt = getopt_long(argc, argv, "cf:d:hFVC:", long_opts, &option_index)) != EOF) { - switch(opt) + switch(opt) { case 'h': silc_usage(); @@ -157,7 +173,7 @@ int main(int argc, char **argv) foreground = TRUE; silc_log_quick = TRUE; #else - fprintf(stdout, + fprintf(stdout, "Run-time debugging is not enabled. To enable it recompile\n" "the server with --enable-debug configuration option.\n"); #endif @@ -223,7 +239,7 @@ int main(int argc, char **argv) goto fail; /* Check for another silcd running */ - silc_checkpid(silcd); + silc_server_checkpid(silcd); /* Initialize the server */ ret = silc_server_init(silcd); @@ -235,17 +251,23 @@ int main(int argc, char **argv) sa.sa_flags = 0; sigemptyset(&sa.sa_mask); sigaction(SIGPIPE, &sa, NULL); + sa.sa_handler = got_hup; + sigaction(SIGHUP, &sa, NULL); + sa.sa_handler = stop_server; + sigaction(SIGTERM, &sa, NULL); + sa.sa_handler = stop_server; + sigaction(SIGINT, &sa, NULL); /* Before running the server, fork to background. */ if (!foreground) silc_server_daemonise(silcd); /* If set, write pid to file */ - if (silcd->config->pidfile && silcd->config->pidfile->pid_file) { - char buf[10]; - unlink(silcd->config->pidfile->pid_file); + if (silcd->config->server_info->pid_file) { + char buf[10], *pidfile = silcd->config->server_info->pid_file; + unlink(pidfile); snprintf(buf, sizeof(buf) - 1, "%d\n", getpid()); - silc_file_writefile(silcd->config->pidfile->pid_file, buf, strlen(buf)); + silc_file_writefile(pidfile, buf, strlen(buf)); } /* Drop root. */ @@ -255,11 +277,13 @@ int main(int argc, char **argv) and we will exit. */ silc_server_run(silcd); - /* Stop the server. This probably has been done already but it - doesn't hurt to do it here again. */ + /* Stop the server and free it. */ silc_server_stop(silcd); silc_server_free(silcd); - + + /* Flush the logging system */ + silc_log_flush_all(); + exit(0); fail: exit(1);