X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?p=netatalk.git;a=blobdiff_plain;f=etc%2Fnetatalk%2Fnetatalk.c;h=1ce7befca67d66073dbac94b16fe7924fb4ef746;hp=7cbb64be95a41dd7a655371a2bc11ab8d2a9ca01;hb=c438f9a125450a4c5da252f8172411f0b55ceef3;hpb=623c302f9f9fec9e2b81f4f7b2dbd958ed1e0b87 diff --git a/etc/netatalk/netatalk.c b/etc/netatalk/netatalk.c index 7cbb64be..1ce7befc 100644 --- a/etc/netatalk/netatalk.c +++ b/etc/netatalk/netatalk.c @@ -48,24 +48,37 @@ /* 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, trackerd_pid = -1; -static uint afpd_restarts, cnid_metad_restarts, dbus_restarts, trackerd_restarts; +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; static int in_shutdown; static const char *dbus_path; -static char *trackerd_loglev; /****************************************************************** * 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) { @@ -78,12 +91,15 @@ static int set_sl_volumes(void) EC_NULL_LOG( volumes = getvolumes() ); for (vol = volumes; vol; vol = vol->v_next) { - bstring volnamequot = bformat("'%s'", vol->v_path); - bstrListPush(vollist, volnamequot); + if (vol->v_flags & AFPVOL_SPOTLIGHT) { + bstring volnamequot = bformat("'%s'", vol->v_path); + bstrListPush(vollist, volnamequot); + } } volnamelist = bjoin(vollist, sep); - cmd = bformat("gsettings set org.freedesktop.Tracker.Miner.Files index-recursive-directories \"[%s]\"", bdata(volnamelist)); + cmd = bformat("gsettings set org.freedesktop.Tracker.Miner.Files index-recursive-directories \"[%s]\"", + bdata(volnamelist) ? bdata(volnamelist) : ""); LOG(log_debug, logtype_sl, "set_sl_volumes: %s", bdata(cmd)); system(bdata(cmd)); @@ -160,7 +176,7 @@ static void sigterm_cb(evutil_socket_t fd, short what, void *arg) #ifdef HAVE_TRACKER_SPARQL system("tracker-control -t"); #endif - kill_childs(SIGTERM, &afpd_pid, &cnid_metad_pid, &dbus_pid, &trackerd_pid, NULL); + kill_childs(SIGTERM, &afpd_pid, &cnid_metad_pid, &dbus_pid, NULL); } /* SIGQUIT callback */ @@ -170,14 +186,14 @@ static void sigquit_cb(evutil_socket_t fd, short what, void *arg) #ifdef HAVE_TRACKER_SPARQL system("tracker-control -t"); #endif - kill_childs(SIGQUIT, &afpd_pid, &cnid_metad_pid, &dbus_pid, &trackerd_pid, NULL); + kill_childs(SIGQUIT, &afpd_pid, &cnid_metad_pid, &dbus_pid, NULL); } /* SIGHUP callback */ 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"); - kill_childs(SIGHUP, &afpd_pid, &cnid_metad_pid, &trackerd_pid, NULL); + kill_childs(SIGHUP, &afpd_pid, &cnid_metad_pid, NULL); } /* SIGCHLD callback */ @@ -200,19 +216,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; - else if (pid == trackerd_pid) - trackerd_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 && trackerd_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 +239,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 +247,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,24 +256,14 @@ 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) { + 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); } } #endif - -#ifdef HAVE_TRACKER_RDF - if (trackerd_pid == -1) { - trackerd_restarts++; - LOG(log_note, logtype_afpd, "Restarting 'trackerd' (restarts: %u)", trackerd_restarts); - if ((trackerd_pid = run_process(TRACKERD_PATH, trackerd_loglev, NULL)) == -1) { - LOG(log_error, logtype_default, "Error starting '%s'", "/usr/bin/trackerd"); - } - } -#endif } /****************************************************************** @@ -271,7 +279,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); } @@ -288,7 +296,7 @@ static void netatalk_exit(int ret) /* this forks() and exec() "path" with varags as argc[] */ static pid_t run_process(const char *path, ...) { - int ret, i = 0; + int i = 0; #define MYARVSIZE 64 char *myargv[MYARVSIZE]; va_list args; @@ -308,7 +316,7 @@ static pid_t run_process(const char *path, ...) } va_end(args); - ret = execv(path, myargv); + (void)execv(path, myargv); /* Yikes! We're still here, so exec failed... */ LOG(log_error, logtype_cnid, "Fatal error in exec: %s", strerror(errno)); @@ -360,19 +368,19 @@ int main(int argc, char **argv) if (afp_config_parse(&obj, "netatalk") != 0) netatalk_exit(EXITERR_CONF); - load_volumes(&obj); + load_volumes(&obj, lv_all); event_set_log_callback(libevent_logmsg_cb); event_set_fatal_callback(netatalk_exit); 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); } @@ -404,53 +412,44 @@ int main(int argc, char **argv) sigprocmask(SIG_SETMASK, &blocksigs, NULL); #ifdef HAVE_TRACKER - setenv("DBUS_SESSION_BUS_ADDRESS", "unix:path=/tmp/spotlight.ipc", 1); - setenv("XDG_DATA_HOME", _PATH_STATEDIR, 0); - setenv("XDG_CACHE_HOME", _PATH_STATEDIR, 0); - - dbus_path = iniparser_getstring(obj.iniconfig, INISEC_GLOBAL, "dbus daemon path", 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_debug, logtype_default, "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"); -#endif -#ifdef HAVE_TRACKER_RDF - if (asprintf(&trackerd_loglev, "--verbosity=%d", obj.options.tracker_loglevel) == -1) - netatalk_exit(EXITERR_CONF); - if ((trackerd_pid = run_process(TRACKERD_PATH, trackerd_loglev, NULL)) == -1) { - LOG(log_error, logtype_default, "Error starting '%s'", TRACKERD_PATH); - netatalk_exit(EXITERR_CONF); + if (atalk_iniparser_getboolean(obj.iniconfig, INISEC_GLOBAL, "start tracker", 1)) { + system(TRACKER_PREFIX "/bin/tracker-control -s"); + } } #endif + /* run the event loop */ ret = event_base_dispatch(base); - if (afpd_pid != -1 || cnid_metad_pid != -1 || dbus_pid != -1 || trackerd_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"); - if (trackerd_pid != -1) - LOG(log_error, logtype_afpd, "trackerd still running, killing it"); - kill_childs(SIGKILL, &afpd_pid, &cnid_metad_pid, &dbus_pid, &trackerd_pid, NULL); + kill_childs(SIGKILL, &afpd_pid, &cnid_metad_pid, &dbus_pid, NULL); } LOG(log_note, logtype_afpd, "Netatalk AFP server exiting");