OpenDNSSEC-signer 1.2.1
|
00001 /* 00002 * $Id: signal.c 4294 2011-01-13 19:58:29Z jakob $ 00003 * 00004 * Copyright (c) 2009 NLNet Labs. All rights reserved. 00005 * 00006 * Redistribution and use in source and binary forms, with or without 00007 * modification, are permitted provided that the following conditions 00008 * are met: 00009 * 1. Redistributions of source code must retain the above copyright 00010 * notice, this list of conditions and the following disclaimer. 00011 * 2. Redistributions in binary form must reproduce the above copyright 00012 * notice, this list of conditions and the following disclaimer in the 00013 * documentation and/or other materials provided with the distribution. 00014 * 00015 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 00016 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 00017 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 00018 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY 00019 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 00020 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE 00021 * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 00022 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER 00023 * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 00024 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 00025 * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 00026 * 00027 */ 00028 00034 #include "config.h" 00035 #include "daemon/engine.h" 00036 #include "daemon/signal.h" 00037 #include "scheduler/locks.h" 00038 00039 #include <signal.h> 00040 00041 static int signal_hup_recvd = 0; 00042 static int signal_term_recvd = 0; 00043 static engine_type* signal_engine = NULL; 00044 00045 00050 void 00051 signal_set_engine(struct engine_struct* engine) 00052 { 00053 signal_engine = (engine_type*) engine; 00054 } 00055 00056 00061 void 00062 signal_handler(sig_atomic_t sig) 00063 { 00064 switch (sig) { 00065 case SIGHUP: 00066 se_log_debug("reload signal received"); 00067 signal_hup_recvd++; 00068 if (signal_engine) { 00069 lock_basic_lock(&signal_engine->signal_lock); 00070 lock_basic_alarm(&signal_engine->signal_cond); 00071 lock_basic_unlock(&signal_engine->signal_lock); 00072 } 00073 break; 00074 case SIGTERM: 00075 se_log_debug("shutdown signal received"); 00076 signal_term_recvd++; 00077 if (signal_engine) { 00078 lock_basic_lock(&signal_engine->signal_lock); 00079 lock_basic_alarm(&signal_engine->signal_cond); 00080 lock_basic_unlock(&signal_engine->signal_lock); 00081 } 00082 break; 00083 default: 00084 break; 00085 } 00086 return; 00087 } 00088 00089 00094 sig_atomic_t 00095 signal_capture(sig_atomic_t dflsig) 00096 { 00097 if (signal_term_recvd) { 00098 signal_term_recvd = 0; 00099 return SIGNAL_SHUTDOWN; 00100 } else if (signal_hup_recvd) { 00101 signal_hup_recvd = 0; 00102 return SIGNAL_RELOAD; 00103 } 00104 return dflsig; 00105 }