X-Git-Url: http://git.silcnet.org/gitweb/?a=blobdiff_plain;f=apps%2Fsilcd%2Fsilcd.c;h=84e35dc4aab629b45a250e625db6410b121e3b25;hb=a818c5b5411bbc4436d1c5f011236985c96bb787;hp=ace7c3ce463709c3689ebf491816a67eae593584;hpb=307765c665b44dc5e7bd364037b17aa8f1e2a8f3;p=silc.git diff --git a/apps/silcd/silcd.c b/apps/silcd/silcd.c index ace7c3ce..84e35dc4 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 @@ -27,18 +27,21 @@ #include "serverincludes.h" #include "server_internal.h" -#include "version.h" +#include "silcversion.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; + SilcUInt32 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,28 +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; - int opt, option_index; - int foreground = FALSE; + int ret, opt, option_index; char *config_file = NULL; - SilcServer silcd; + bool foreground = FALSE; struct sigaction sa; - silc_debug = FALSE; - /* 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(); @@ -148,17 +161,19 @@ int main(int argc, char **argv) printf("SILCd Secure Internet Live Conferencing daemon, " "version %s (base: SILC Toolkit %s)\n", silc_dist_version, silc_version); - printf("(c) 1997 - 2001 Pekka Riikonen " + printf("(c) 1997 - 2002 Pekka Riikonen " "\n"); exit(0); break; case 'd': +#ifdef SILC_DEBUG silc_debug = TRUE; silc_debug_hexdump = TRUE; silc_log_set_debug_string(optarg); foreground = TRUE; -#ifndef SILC_DEBUG - fprintf(stdout, + silc_log_quick = TRUE; +#else + fprintf(stdout, "Run-time debugging is not enabled. To enable it recompile\n" "the server with --enable-debug configuration option.\n"); #endif @@ -224,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); @@ -236,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. */ @@ -256,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); @@ -306,7 +329,7 @@ silc_server_create_key_pair(char *pkcs_name, int bits, char *path, SilcPrivateKey prv_key; SilcRng rng; unsigned char *key; - uint32 key_len; + SilcUInt32 key_len; char pkfile[256], prvfile[256]; if (!pkcs_name || !path)