X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=etc%2Fnetatalk%2Fnetatalk.c;h=3e3444f25af3bb7e7600dff5e8ec2412f31b9909;hb=952a2d8e011254243e5c3707ef857eab01625f93;hp=3b62eca4bb6124777ecbeaa1e4fc7163f5fd9087;hpb=69750c713bbc94881142d9cd71b94bafab4d54ee;p=netatalk.git diff --git a/etc/netatalk/netatalk.c b/etc/netatalk/netatalk.c index 3b62eca4..3e3444f2 100644 --- a/etc/netatalk/netatalk.c +++ b/etc/netatalk/netatalk.c @@ -1,8 +1,16 @@ -/* - * Copyright (c) 1990,1993 Regents of The University of Michigan. - * All Rights Reserved. See COPYRIGHT. - */ - +/* + Copyright (c) 2012 Frank Lahm + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. +*/ #ifdef HAVE_CONFIG_H #include "config.h" #endif /* HAVE_CONFIG_H */ @@ -46,13 +54,13 @@ static void kill_childs(int sig, ...); /* static variables */ static AFPObj obj; -static sig_atomic_t got_chldsig; -static pid_t afpd_pid = -1, cnid_metad_pid = -1, dbus_pid = -1; -static uint afpd_restarts, cnid_metad_restarts, dbus_restarts; +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 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 @@ -70,8 +78,10 @@ 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); @@ -79,6 +89,9 @@ static int set_sl_volumes(void) 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); @@ -146,22 +159,33 @@ static void sigterm_cb(evutil_socket_t fd, short what, void *arg) event_del(sigquit_ev); event_del(timer_ev); +#ifdef HAVE_TRACKER_SPARQL system("tracker-control -t"); - kill_childs(SIGTERM, &afpd_pid, &cnid_metad_pid, &dbus_pid, NULL); +#endif + kill_childs(SIGTERM, &afpd_pid, &cnid_metad_pid, &dbus_pid, &trackerd_pid, NULL); } /* SIGQUIT callback */ static void sigquit_cb(evutil_socket_t fd, short what, void *arg) { LOG(log_note, logtype_afpd, "Exiting on SIGQUIT"); +#ifdef HAVE_TRACKER_SPARQL system("tracker-control -t"); - kill_childs(SIGQUIT, &afpd_pid, &cnid_metad_pid, &dbus_pid, NULL); +#endif + kill_childs(SIGQUIT, &afpd_pid, &cnid_metad_pid, &dbus_pid, &trackerd_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); } /* SIGCHLD callback */ static void sigchld_cb(evutil_socket_t fd, short what, void *arg) { - int status, i; + int status; pid_t pid; while ((pid = waitpid(-1, &status, WNOHANG)) > 0) { @@ -183,19 +207,19 @@ static void sigchld_cb(evutil_socket_t fd, short what, void *arg) cnid_metad_pid = -1; else if (pid == dbus_pid) dbus_pid = -1; + else if (pid == trackerd_pid) + trackerd_pid = -1; 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 && afpd_pid == -1 && cnid_metad_pid == -1 && dbus_pid == -1 && trackerd_pid == -1) event_base_loopbreak(base); } /* timer callback */ static void timer_cb(evutil_socket_t fd, short what, void *arg) { - static int i = 0; - if (in_shutdown) return; @@ -215,6 +239,7 @@ static void timer_cb(evutil_socket_t fd, short what, void *arg) } } +#ifdef HAVE_TRACKER if (dbus_pid == -1) { dbus_restarts++; LOG(log_note, logtype_afpd, "Restarting 'dbus' (restarts: %u)", dbus_restarts); @@ -222,6 +247,17 @@ static void timer_cb(evutil_socket_t fd, short what, void *arg) 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 } /****************************************************************** @@ -247,7 +283,7 @@ 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); } @@ -255,7 +291,8 @@ static void netatalk_exit(int ret) static pid_t run_process(const char *path, ...) { int ret, i = 0; - char *myargv[10]; +#define MYARVSIZE 64 + char *myargv[MYARVSIZE]; va_list args; pid_t pid; @@ -267,8 +304,10 @@ 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); @@ -287,7 +326,6 @@ static void usage(void) int main(int argc, char **argv) { - const char *configfile = NULL; int c, ret, debug = 0; sigset_t blocksigs; struct timeval tv; @@ -309,13 +347,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); @@ -324,7 +362,7 @@ int main(int argc, char **argv) if (afp_config_parse(&obj, "netatalk") != 0) netatalk_exit(EXITERR_CONF); - load_volumes(&obj, NULL); + load_volumes(&obj); event_set_log_callback(libevent_logmsg_cb); event_set_fatal_callback(netatalk_exit); @@ -332,7 +370,7 @@ 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) { - LOG(log_error, logtype_afpd, "Error starting 'cnid_metad'"); + LOG(log_error, logtype_afpd, "Error starting 'afpd'"); netatalk_exit(EXITERR_CONF); } @@ -348,6 +386,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); sigchld_ev = event_new(base, SIGCHLD, EV_SIGNAL | EV_PERSIST, sigchld_cb, NULL); timer_ev = event_new(base, -1, EV_PERSIST, timer_cb, NULL); @@ -363,9 +402,15 @@ int main(int argc, char **argv) sigdelset(&blocksigs, SIGTERM); sigdelset(&blocksigs, SIGQUIT); sigdelset(&blocksigs, SIGCHLD); + sigdelset(&blocksigs, SIGHUP); sigprocmask(SIG_SETMASK, &blocksigs, NULL); - dbus_path = iniparser_getstring(obj.iniconfig, INISEC_GLOBAL, "dbus daemon path", "/bin/dbus-daemon"); +#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); @@ -374,22 +419,38 @@ int main(int argc, char **argv) /* Allow dbus some time to start up */ sleep(1); - - setenv("DBUS_SESSION_BUS_ADDRESS", "unix:path=/tmp/spotlight.ipc", 1); +#endif + +#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 ((trackerd_pid = run_process(TRACKERD_PATH, trackerd_loglev, NULL)) == -1) { + LOG(log_error, logtype_default, "Error starting '%s'", TRACKERD_PATH); + netatalk_exit(EXITERR_CONF); + } +#endif /* run the event loop */ ret = event_base_dispatch(base); - if (afpd_pid != -1 || cnid_metad_pid != -1 || dbus_pid != -1) { + if (afpd_pid != -1 || cnid_metad_pid != -1 || dbus_pid != -1 || trackerd_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"); if (dbus_pid != -1) LOG(log_error, logtype_afpd, "DBUS session daemon still running, killing it"); - kill_childs(SIGKILL, &afpd_pid, &cnid_metad_pid, &dbus_pid, NULL); + 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); } LOG(log_note, logtype_afpd, "Netatalk AFP server exiting");