+ /* got SIGTERM or similar, so we're going to shutdown */
+
+ /* block any signal but SIGCHLD */
+ sigfillset(&blocksigs);
+ sigdelset(&blocksigs, SIGCHLD);
+ 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);
+ event_del(sigterm_ev);
+ event_del(sigquit_ev);
+
+ /* run the event loop again, waiting for child to exit on SIGTERM for KILL_GRACETIME seconds */
+ kill_childs(2, SIGTERM, &afpd_pid, &cnid_metad_pid);
+ ret = event_base_dispatch(base);
+
+ if (afpd_pid != -1 || cnid_metad_pid != -1) {
+ if (afpd_pid != -1)
+ LOG(log_error, logtype_afpd, "AFP service did not shutdown, killing it");
+ if (cnid_metad_pid != -1)
+ LOG(log_error, logtype_afpd, "CNID database service did not shutdown, killing it");
+ kill_childs(2, SIGKILL, &afpd_pid, &cnid_metad_pid);
+ }
+ netatalk_exit(ret);