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=3fbb3dce26cd5268b217eca3140c4eadddbcd3fe;hb=c438f9a125450a4c5da252f8172411f0b55ceef3;hpb=af3a18cef2dc7a03e2ba40e0907b64b7a9d50e2c diff --git a/etc/netatalk/netatalk.c b/etc/netatalk/netatalk.c index 3fbb3dce..1ce7befc 100644 --- a/etc/netatalk/netatalk.c +++ b/etc/netatalk/netatalk.c @@ -48,14 +48,21 @@ /* 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; @@ -65,6 +72,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) { @@ -77,15 +91,21 @@ 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)); + /* Disable default root user home indexing */ + system("gsettings set org.freedesktop.Tracker.Miner.Files index-single-directories \"[]\""); + EC_CLEANUP: if (cmd) bdestroy(cmd); @@ -156,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 */ @@ -166,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 */ @@ -196,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 */ @@ -217,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) { @@ -225,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) { @@ -233,22 +255,14 @@ static void timer_cb(evutil_socket_t fd, short what, void *arg) } } - if (dbus_pid == -1) { +#ifdef HAVE_TRACKER + 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); } } - -#ifdef HAVE_TRACKER_0_6 - if (trackerd_pid == -1) { - trackerd_restarts++; - LOG(log_note, logtype_afpd, "Restarting 'trackerd' (restarts: %u)", trackerd_restarts); - if ((trackerd_pid = run_process(TRACKER_0_6_PREFIX "/bin/trackerd", "--verbosity=3", NULL)) == -1) { - LOG(log_error, logtype_default, "Error starting '%s'", "/usr/bin/trackerd"); - } - } #endif } @@ -265,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); } @@ -275,15 +289,16 @@ static void kill_childs(int sig, ...) /* this get called when error conditions are met that require us to exit gracefully */ static void netatalk_exit(int ret) { - server_unlock(_PATH_NETATALK_LOCK); + server_unlock(PATH_NETATALK_LOCK); exit(ret); } /* this forks() and exec() "path" with varags as argc[] */ static pid_t run_process(const char *path, ...) { - int ret, i = 0; - char *myargv[10]; + int i = 0; +#define MYARVSIZE 64 + char *myargv[MYARVSIZE]; va_list args; pid_t pid; @@ -295,11 +310,13 @@ static pid_t run_process(const char *path, ...) if (pid == 0) { myargv[i++] = (char *)path; va_start(args, path); - while ((myargv[i++] = va_arg(args, char *)) != NULL) - ; + while (i < MYARVSIZE) { + if ((myargv[i++] = va_arg(args, char *)) == NULL) + break; + } 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)); @@ -336,13 +353,13 @@ int main(int argc, char **argv) } } - if (check_lockfile("netatalk", _PATH_NETATALK_LOCK) != 0) + if (check_lockfile("netatalk", PATH_NETATALK_LOCK) != 0) exit(EXITERR_SYS); if (!debug && daemonize(0, 0) != 0) exit(EXITERR_SYS); - if (create_lockfile("netatalk", _PATH_NETATALK_LOCK) != 0) + if (create_lockfile("netatalk", PATH_NETATALK_LOCK) != 0) exit(EXITERR_SYS); sigfillset(&blocksigs); @@ -351,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) { - LOG(log_error, logtype_afpd, "Error starting 'cnid_metad'"); + 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); } @@ -395,49 +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); -#endif -#if 0 - setenv("XDG_DATA_DIRS", TRACKER_PREFIX "/share/:/usr/share/", 1); - setenv("TRACKER_DB_ONTOLOGIES_DIR", TRACKER_PREFIX "/share/tracker/ontologies", 1); - setenv("TRACKER_EXTRACTOR_RULES_DIR", TRACKER_PREFIX "/share/tracker/extract-rules", 1); - setenv("TRACKER_LANGUAGE_STOPWORDS_DIR", TRACKER_PREFIX "/share/tracker/languages", 1); -#endif - - dbus_path = iniparser_getstring(obj.iniconfig, INISEC_GLOBAL, "dbus daemon path", "/bin/dbus-daemon"); - 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); + set_sl_volumes(); -#ifdef HAVE_TRACKER_SPARQL - set_sl_volumes(); - system(TRACKER_PREFIX "/bin/tracker-control -s"); -#endif -#ifdef HAVE_TRACKER_0_6 - if ((trackerd_pid = run_process(TRACKER_0_6_PREFIX "/bin/trackerd", "--verbosity=3", NULL)) == -1) { - LOG(log_error, logtype_default, "Error starting '%s'", TRACKER_0_6_PREFIX "/bin/trackerd"); - 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");