Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00034 #include "config.h"
00035 #include "daemon/engine.h"
00036 #include "daemon/signal.h"
00037 #include "shared/locks.h"
00038 #include "shared/log.h"
00039
00040 #include <signal.h>
00041
00042 static int signal_hup_recvd = 0;
00043 static int signal_term_recvd = 0;
00044 static engine_type* signal_engine = NULL;
00045 static const char* signal_str = "signal";
00046
00047
00052 void
00053 signal_set_engine(struct engine_struct* engine)
00054 {
00055 signal_engine = (engine_type*) engine;
00056 }
00057
00058
00063 void
00064 signal_handler(sig_atomic_t sig)
00065 {
00066 switch (sig) {
00067 case SIGHUP:
00068 ods_log_debug("[%s] SIGHUP received", signal_str);
00069 signal_hup_recvd++;
00070 if (signal_engine) {
00071 lock_basic_lock(&signal_engine->signal_lock);
00072
00073 lock_basic_alarm(&signal_engine->signal_cond);
00074
00075 lock_basic_unlock(&signal_engine->signal_lock);
00076 }
00077 break;
00078 case SIGTERM:
00079 ods_log_debug("[%s] SIGTERM received", signal_str);
00080 signal_term_recvd++;
00081 if (signal_engine) {
00082 lock_basic_lock(&signal_engine->signal_lock);
00083
00084 lock_basic_alarm(&signal_engine->signal_cond);
00085
00086 lock_basic_unlock(&signal_engine->signal_lock);
00087 }
00088 break;
00089 default:
00090 break;
00091 }
00092 return;
00093 }
00094
00095
00100 sig_atomic_t
00101 signal_capture(sig_atomic_t dflsig)
00102 {
00103 if (signal_term_recvd) {
00104 signal_term_recvd = 0;
00105 return SIGNAL_SHUTDOWN;
00106 } else if (signal_hup_recvd) {
00107 signal_hup_recvd = 0;
00108 return SIGNAL_RELOAD;
00109 }
00110 return dflsig;
00111 }