OpenDNSSEC-signer 1.2.1

/build/buildd-opendnssec_1.2.1.dfsg-1-mips-p9AT07/opendnssec-1.2.1.dfsg/signer/src/daemon/signal.c

Go to the documentation of this file.
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 }