X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=etc%2Fnetatalk%2Fnetatalk.c;h=a806d50ae32a7b9b8811901c70bf15b59e79321a;hb=47de27c3b1bec126c2343709a884f9882fab97a6;hp=734ded3a3edf421176e13dfcbcbf5af91fb2d0b1;hpb=e4515cc30969fca282f200cab8ee965aadd83440;p=netatalk.git diff --git a/etc/netatalk/netatalk.c b/etc/netatalk/netatalk.c index 734ded3a..a806d50a 100644 --- a/etc/netatalk/netatalk.c +++ b/etc/netatalk/netatalk.c @@ -42,22 +42,30 @@ #include #include #include +#include "afp_zeroconf.h" #include /* how many seconds we wait to shutdown from SIGTERM before we send SIGKILL */ #define KILL_GRACETIME 5 +/* defines that control whether services should run by default */ +#define NETATALK_SRV_NEEDED -1 +#define NETATALK_SRV_OPTIONAL 0 +#define NETATALK_SRV_ERROR NETATALK_SRV_NEEDED + /* forward declaration */ static pid_t run_process(const char *path, ...); static void kill_childs(int sig, ...); /* static variables */ static AFPObj obj; -static pid_t afpd_pid = -1, cnid_metad_pid = -1, dbus_pid = -1; +static pid_t afpd_pid = NETATALK_SRV_NEEDED; +static pid_t cnid_metad_pid = NETATALK_SRV_NEEDED; +static pid_t dbus_pid = NETATALK_SRV_OPTIONAL; static uint afpd_restarts, cnid_metad_restarts, dbus_restarts; static struct event_base *base; -struct event *sigterm_ev, *sigquit_ev, *sigchld_ev, *timer_ev; +struct event *sigterm_ev, *sigquit_ev, *sigchld_ev, *sighup_ev, *timer_ev; static int in_shutdown; static const char *dbus_path; @@ -65,6 +73,13 @@ static const char *dbus_path; * Misc stuff ******************************************************************/ +static bool service_running(pid_t pid) +{ + if ((pid != NETATALK_SRV_NEEDED) && (pid != NETATALK_SRV_OPTIONAL)) + return true; + return false; +} + /* Set Tracker Miners to index all our volumes */ static int set_sl_volumes(void) { @@ -159,7 +174,7 @@ static void sigterm_cb(evutil_socket_t fd, short what, void *arg) event_del(sigquit_ev); event_del(timer_ev); -#ifdef HAVE_TRACKER_SPARQL +#ifdef HAVE_TRACKER system("tracker-control -t"); #endif kill_childs(SIGTERM, &afpd_pid, &cnid_metad_pid, &dbus_pid, NULL); @@ -169,7 +184,7 @@ static void sigterm_cb(evutil_socket_t fd, short what, void *arg) static void sigquit_cb(evutil_socket_t fd, short what, void *arg) { LOG(log_note, logtype_afpd, "Exiting on SIGQUIT"); -#ifdef HAVE_TRACKER_SPARQL +#ifdef HAVE_TRACKER system("tracker-control -t"); #endif kill_childs(SIGQUIT, &afpd_pid, &cnid_metad_pid, &dbus_pid, NULL); @@ -179,6 +194,14 @@ static void sigquit_cb(evutil_socket_t fd, short what, void *arg) static void sighup_cb(evutil_socket_t fd, short what, void *arg) { LOG(log_note, logtype_afpd, "Received SIGHUP, sending all processes signal to reload config"); + + if (!(obj.options.flags & OPTION_NOZEROCONF)) { + zeroconf_deregister(); + load_volumes(&obj, lv_all | lv_force); + zeroconf_register(&obj); + LOG(log_note, logtype_default, "Re-registered with Zeroconf"); + } + kill_childs(SIGHUP, &afpd_pid, &cnid_metad_pid, NULL); } @@ -202,17 +225,21 @@ static void sigchld_cb(evutil_socket_t fd, short what, void *arg) } if (pid == afpd_pid) - afpd_pid = -1; + afpd_pid = NETATALK_SRV_ERROR; else if (pid == cnid_metad_pid) - cnid_metad_pid = -1; + cnid_metad_pid = NETATALK_SRV_ERROR; else if (pid == dbus_pid) - dbus_pid = -1; + dbus_pid = NETATALK_SRV_ERROR; else LOG(log_error, logtype_afpd, "Bad pid: %d", pid); } - if (in_shutdown && afpd_pid == -1 && cnid_metad_pid == -1 && dbus_pid == -1) + if (in_shutdown + && !service_running(afpd_pid) + && !service_running(cnid_metad_pid) + && !service_running(dbus_pid)) { event_base_loopbreak(base); + } } /* timer callback */ @@ -221,7 +248,7 @@ static void timer_cb(evutil_socket_t fd, short what, void *arg) if (in_shutdown) return; - if (afpd_pid == -1) { + if (afpd_pid == NETATALK_SRV_NEEDED) { 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) { @@ -229,7 +256,7 @@ static void timer_cb(evutil_socket_t fd, short what, void *arg) } } - if (cnid_metad_pid == -1) { + if (cnid_metad_pid == NETATALK_SRV_NEEDED) { 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) { @@ -238,7 +265,7 @@ static void timer_cb(evutil_socket_t fd, short what, void *arg) } #ifdef HAVE_TRACKER - if (dbus_pid == -1) { + if (dbus_pid == NETATALK_SRV_NEEDED) { dbus_restarts++; LOG(log_note, logtype_afpd, "Restarting 'dbus' (restarts: %u)", dbus_restarts); if ((dbus_pid = run_process(dbus_path, "--config-file=" _PATH_CONFDIR "dbus-session.conf", NULL)) == -1) { @@ -261,7 +288,7 @@ static void kill_childs(int sig, ...) va_start(args, sig); while ((pid = va_arg(args, pid_t *)) != NULL) { - if (*pid == -1) + if (*pid == NETATALK_SRV_ERROR || *pid == NETATALK_SRV_OPTIONAL) continue; kill(*pid, sig); } @@ -357,12 +384,12 @@ int main(int argc, char **argv) LOG(log_note, logtype_default, "Netatalk AFP server starting"); - if ((afpd_pid = run_process(_PATH_AFPD, "-d", "-F", obj.options.configfile, NULL)) == -1) { + if ((afpd_pid = run_process(_PATH_AFPD, "-d", "-F", obj.options.configfile, NULL)) == NETATALK_SRV_ERROR) { LOG(log_error, logtype_afpd, "Error starting 'afpd'"); netatalk_exit(EXITERR_CONF); } - if ((cnid_metad_pid = run_process(_PATH_CNID_METAD, "-d", "-F", obj.options.configfile, NULL)) == -1) { + if ((cnid_metad_pid = run_process(_PATH_CNID_METAD, "-d", "-F", obj.options.configfile, NULL)) == NETATALK_SRV_ERROR) { LOG(log_error, logtype_afpd, "Error starting 'cnid_metad'"); netatalk_exit(EXITERR_CONF); } @@ -374,7 +401,7 @@ int main(int argc, char **argv) sigterm_ev = event_new(base, SIGTERM, EV_SIGNAL, sigterm_cb, NULL); sigquit_ev = event_new(base, SIGQUIT, EV_SIGNAL | EV_PERSIST, sigquit_cb, NULL); - sigquit_ev = event_new(base, SIGHUP, EV_SIGNAL | EV_PERSIST, sighup_cb, NULL); + sighup_ev = event_new(base, SIGHUP, EV_SIGNAL | EV_PERSIST, sighup_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); @@ -384,6 +411,7 @@ int main(int argc, char **argv) event_add(sigterm_ev, NULL); event_add(sigquit_ev, NULL); event_add(sigchld_ev, NULL); + event_add(sighup_ev, NULL); event_add(timer_ev, &tv); sigfillset(&blocksigs); @@ -394,42 +422,48 @@ int main(int argc, char **argv) sigprocmask(SIG_SETMASK, &blocksigs, NULL); #ifdef HAVE_TRACKER - setenv("DBUS_SESSION_BUS_ADDRESS", "unix:path=" _PATH_STATEDIR "spotlight.ipc", 1); - setenv("XDG_DATA_HOME", _PATH_STATEDIR, 0); - setenv("XDG_CACHE_HOME", _PATH_STATEDIR, 0); - setenv("TRACKER_USE_LOG_FILES", "1", 0); - - dbus_path = atalk_iniparser_getstring(obj.iniconfig, INISEC_GLOBAL, "dbus daemon", DBUS_DAEMON_PATH); - LOG(log_debug, logtype_default, "DBUS: '%s'", dbus_path); - if ((dbus_pid = run_process(dbus_path, "--config-file=" _PATH_CONFDIR "dbus-session.conf", NULL)) == -1) { - LOG(log_error, logtype_default, "Error starting '%s'", dbus_path); - netatalk_exit(EXITERR_CONF); - } + if (obj.options.flags & OPTION_SPOTLIGHT) { + setenv("DBUS_SESSION_BUS_ADDRESS", "unix:path=" _PATH_STATEDIR "spotlight.ipc", 1); + setenv("XDG_DATA_HOME", _PATH_STATEDIR, 0); + setenv("XDG_CACHE_HOME", _PATH_STATEDIR, 0); + setenv("TRACKER_USE_LOG_FILES", "1", 0); + + if (atalk_iniparser_getboolean(obj.iniconfig, INISEC_GLOBAL, "start dbus", 1)) { + dbus_path = atalk_iniparser_getstring(obj.iniconfig, INISEC_GLOBAL, "dbus daemon", DBUS_DAEMON_PATH); + LOG(log_note, logtype_default, "Starting dbus: %s", dbus_path); + if ((dbus_pid = run_process(dbus_path, "--config-file=" _PATH_CONFDIR "dbus-session.conf", NULL)) == NETATALK_SRV_ERROR) { + LOG(log_error, logtype_default, "Error starting '%s'", dbus_path); + netatalk_exit(EXITERR_CONF); + } + + /* Allow dbus some time to start up */ + sleep(1); + } - /* Allow dbus some time to start up */ - sleep(1); -#endif + set_sl_volumes(); -#ifdef HAVE_TRACKER_SPARQL -#ifdef SOLARIS - setenv("XDG_DATA_DIRS", TRACKER_PREFIX "/share", 0); - setenv("TRACKER_DB_ONTOLOGIES_DIR", TRACKER_PREFIX "/share/tracker/ontologies", 0); - setenv("TRACKER_EXTRACTOR_RULES_DIR", TRACKER_PREFIX "/share/tracker/extract-rules", 0); - setenv("TRACKER_LANGUAGE_STOPWORDS_DIR", TRACKER_PREFIX "/share/tracker/languages", 0); -#endif - set_sl_volumes(); - system(TRACKER_PREFIX "/bin/tracker-control -s"); + if (atalk_iniparser_getboolean(obj.iniconfig, INISEC_GLOBAL, "start tracker", 1)) { + LOG(log_note, logtype_default, "Starting Tracker"); + system(TRACKER_PREFIX "/bin/tracker-control -s"); + } + } #endif + /* Now register with zeroconf, we also need the volumes for that */ + if (! (obj.options.flags & OPTION_NOZEROCONF)) { + zeroconf_register(&obj); + LOG(log_note, logtype_default, "Registered with Zeroconf"); + } + /* run the event loop */ ret = event_base_dispatch(base); - if (afpd_pid != -1 || cnid_metad_pid != -1 || dbus_pid != -1) { - if (afpd_pid != -1) + if (service_running(afpd_pid) || service_running(cnid_metad_pid) || service_running(dbus_pid)) { + if (service_running(afpd_pid)) LOG(log_error, logtype_afpd, "AFP service did not shutdown, killing it"); - if (cnid_metad_pid != -1) + if (service_running(cnid_metad_pid)) LOG(log_error, logtype_afpd, "CNID database service did not shutdown, killing it"); - if (dbus_pid != -1) + if (service_running(dbus_pid)) LOG(log_error, logtype_afpd, "DBUS session daemon still running, killing it"); kill_childs(SIGKILL, &afpd_pid, &cnid_metad_pid, &dbus_pid, NULL); }