static pid_t afpd_pid = -1, cnid_metad_pid = -1;
static uint afpd_restarts, cnid_metad_restarts;
static struct event_base *base;
-struct event *sigterm_ev, *sigquit_ev, *sigchld_ev;
+struct event *sigterm_ev, *sigquit_ev, *sigchld_ev, *timer_ev;
static int in_shutdown;
/******************************************************************
LOG(log_info, logtype_afpd, "child[%d]: died", pid);
}
- if (pid == afpd_pid) {
- if (in_shutdown) {
- afpd_pid = -1;
- } else {
- sleep(1);
- afpd_restarts++;
- LOG(log_note, logtype_afpd, "Restarting 'afpd' (restarts: %u)", afpd_restarts);
- if ((afpd_pid = run_process(_PATH_AFPD, "-d", "-F", obj.options.configfile, NULL)) == -1) {
- LOG(log_error, logtype_afpd, "Error starting 'afpd'");
- }
- }
- } else if (pid = cnid_metad_pid) {
- if (in_shutdown) {
- cnid_metad_pid = -1;
- } else {
- sleep(1);
- cnid_metad_restarts++;
- LOG(log_note, logtype_afpd, "Restarting 'cnid_metad' (restarts: %u)", cnid_metad_restarts);
- if ((cnid_metad_pid = run_process(_PATH_CNID_METAD, "-d", "-F", obj.options.configfile, NULL)) == -1) {
- LOG(log_error, logtype_afpd, "Error starting 'cnid_metad'");
- }
- }
- } else {
+ if (pid == afpd_pid)
+ afpd_pid = -1;
+ else if (pid = cnid_metad_pid)
+ cnid_metad_pid = -1;
+ else
LOG(log_error, logtype_afpd, "Bad pid: %d", pid);
- }
}
if (in_shutdown && afpd_pid == -1 && cnid_metad_pid == -1)
event_base_loopbreak(base);
}
+/* timer callback */
+static void timer_cb(evutil_socket_t fd, short what, void *arg)
+{
+ static int i = 0;
+ LOG(log_debug, logtype_afpd, "looping: %i", i++);
+
+ if (in_shutdown)
+ return;
+
+ if (afpd_pid == -1) {
+ afpd_restarts++;
+ LOG(log_note, logtype_afpd, "Restarting 'afpd' (restarts: %u)", afpd_restarts);
+ if ((afpd_pid = run_process(_PATH_AFPD, "-d", "-F", obj.options.configfile, NULL)) == -1) {
+ LOG(log_error, logtype_afpd, "Error starting 'afpd'");
+ }
+ }
+
+ if (cnid_metad_pid == -1) {
+ cnid_metad_restarts++;
+ LOG(log_note, logtype_afpd, "Restarting 'cnid_metad' (restarts: %u)", cnid_metad_restarts);
+ if ((cnid_metad_pid = run_process(_PATH_CNID_METAD, "-d", "-F", obj.options.configfile, NULL)) == -1) {
+ LOG(log_error, logtype_afpd, "Error starting 'cnid_metad'");
+ }
+ }
+}
+
/******************************************************************
* helper functions
******************************************************************/
const char *configfile = NULL;
int c, ret, debug = 0;
sigset_t blocksigs;
+ struct timeval tv;
/* Log SIGBUS/SIGSEGV SBT */
fault_setup(NULL);
sigterm_ev = event_new(base, SIGTERM, EV_SIGNAL, sigterm_cb, NULL);
sigquit_ev = event_new(base, SIGQUIT, EV_SIGNAL | EV_PERSIST, sigquit_cb, NULL);
sigchld_ev = event_new(base, SIGCHLD, EV_SIGNAL | EV_PERSIST, sigchld_cb, NULL);
+ timer_ev = event_new(base, -1, EV_PERSIST, timer_cb, NULL);
+
+ tv.tv_sec = 1;
+ tv.tv_usec = 0;
event_add(sigterm_ev, NULL);
event_add(sigquit_ev, NULL);
event_add(sigchld_ev, NULL);
+ event_add(timer_ev, &tv);
sigfillset(&blocksigs);
sigdelset(&blocksigs, SIGTERM);
sigprocmask(SIG_SETMASK, &blocksigs, NULL);
/* setup new events: remove SIGTERM and SIGQUIT cbs, add timeout */
- struct timeval tv;
tv.tv_sec = KILL_GRACETIME;
tv.tv_usec = 0;
event_base_loopexit(base, &tv);