]> arthur.barton.de Git - netatalk.git/blobdiff - etc/netatalk/netatalk.c
Merge remote-tracking branch 'origin/develop' into spotlight
[netatalk.git] / etc / netatalk / netatalk.c
index 57e8ecf19ff28ade8bc4a3e635f3bb65805baa42..e2235a85ba649a5449ac9b648b0a94dfdf7c35b9 100644 (file)
@@ -32,6 +32,8 @@
 #include <atalk/errchk.h>
 #include <atalk/globals.h>
 #include <atalk/netatalk_conf.h>
+#include <atalk/bstrlib.h>
+#include <atalk/bstradd.h>
 
 #include <event2/event.h>
 
@@ -52,6 +54,43 @@ struct event *sigterm_ev, *sigquit_ev, *sigchld_ev, *timer_ev;
 static int in_shutdown;
 static const char *dbus_path;
 
+/******************************************************************
+ * Misc stuff
+ ******************************************************************/
+
+/* Set Tracker Miners to index all our volumes */
+static int set_sl_volumes(void)
+{
+    EC_INIT;
+    const struct vol *volumes, *vol;
+    struct bstrList *vollist = bstrListCreate();
+    bstring sep = bfromcstr(", ");
+    bstring volnamelist = NULL, cmd = NULL;
+
+    EC_NULL_LOG( volumes = getvolumes() );
+
+    for (vol = volumes; vol; vol = vol->v_next) {
+        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));
+    LOG(log_debug, logtype_sl, "set_sl_volumes: %s", bdata(cmd));
+    system(bdata(cmd));
+
+EC_CLEANUP:
+    if (cmd)
+        bdestroy(cmd);
+    if (sep)
+        bdestroy(sep);
+    if (vollist)
+        bstrListDestroy(vollist);
+    if (volnamelist)
+        bdestroy(volnamelist);
+    EC_EXIT;
+}
+
 /******************************************************************
  * libevent helper functions
  ******************************************************************/
@@ -119,6 +158,13 @@ static void sigquit_cb(evutil_socket_t fd, short what, void *arg)
     kill_childs(SIGQUIT, &afpd_pid, &cnid_metad_pid, &dbus_pid, NULL);
 }
 
+/* SIGQUIT 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, NULL);
+}
+
 /* SIGCHLD callback */
 static void sigchld_cb(evutil_socket_t fd, short what, void *arg)
 {
@@ -285,6 +331,8 @@ int main(int argc, char **argv)
     if (afp_config_parse(&obj, "netatalk") != 0)
         netatalk_exit(EXITERR_CONF);
 
+    load_volumes(&obj);
+
     event_set_log_callback(libevent_logmsg_cb);
     event_set_fatal_callback(netatalk_exit);
 
@@ -307,6 +355,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);
 
@@ -322,19 +371,22 @@ 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 path", "/bin/dbus-daemon");
+    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);
     }
 
+    /* Allow dbus some time to start up */
     sleep(1);
 
     setenv("DBUS_SESSION_BUS_ADDRESS", "unix:path=/tmp/spotlight.ipc", 1);
-    system("/usr/bin/tracker-control -s");
+    set_sl_volumes();
+    system(TRACKER_PREFIX "/bin/tracker-control -s");
 
     /* run the event loop */
     ret = event_base_dispatch(base);