From 92aeeeb531e26df27995a2ef37152ab4e9dde66c Mon Sep 17 00:00:00 2001 From: Frank Lahm Date: Tue, 23 Oct 2012 21:59:10 +0200 Subject: [PATCH] Initialize Spotlight from session child Spotlight initialisation must be perfomed in the session childs. Wrap all Tracker calls between become_root()/unbecome_root(). Force bus SPARQL backend, as direct connections cause problems with some SPARQL queries. --- etc/afpd/afp_dsi.c | 5 +++++ etc/afpd/main.c | 2 -- etc/afpd/spotlight_module.c | 43 +++++++++++++++++++++++++++++++------ 3 files changed, 41 insertions(+), 9 deletions(-) diff --git a/etc/afpd/afp_dsi.c b/etc/afpd/afp_dsi.c index 3e5cd47c..8e883d4b 100644 --- a/etc/afpd/afp_dsi.c +++ b/etc/afpd/afp_dsi.c @@ -44,6 +44,7 @@ #include "auth.h" #include "fork.h" #include "dircache.h" +#include "spotlight.h" #ifndef SOL_TCP #define SOL_TCP IPPROTO_TCP @@ -492,6 +493,10 @@ void afp_over_dsi(AFPObj *obj) int flag = 1; setsockopt(dsi->socket, SOL_TCP, TCP_NODELAY, &flag, sizeof(flag)); + /* Initialize Spotlight */ + if (obj->options.flags & OPTION_SPOTLIGHT) + sl_mod_load(_PATH_AFPDUAMPATH "mod_spotlight.so"); + /* get stuck here until the end */ while (1) { if (sigsetjmp(recon_jmp, 1) != 0) diff --git a/etc/afpd/main.c b/etc/afpd/main.c index 2598a72e..9555fc58 100644 --- a/etc/afpd/main.c +++ b/etc/afpd/main.c @@ -344,8 +344,6 @@ int main(int ac, char **av) /* Initialize */ cnid_init(); - if (obj.options.flags & OPTION_SPOTLIGHT) - sl_mod_load(_PATH_AFPDUAMPATH "mod_spotlight.so"); /* watch atp, dsi sockets and ipc parent/child file descriptor. */ diff --git a/etc/afpd/spotlight_module.c b/etc/afpd/spotlight_module.c index 91c761a6..cdc36404 100644 --- a/etc/afpd/spotlight_module.c +++ b/etc/afpd/spotlight_module.c @@ -17,6 +17,7 @@ #endif /* HAVE_CONFIG_H */ #include +#include #include #include @@ -25,6 +26,7 @@ #include #include #include +#include #include "spotlight.h" @@ -55,11 +57,22 @@ static int sl_mod_init(void *p) GError *error = NULL; const char *msg = p; - LOG(log_note, logtype_sl, "sl_mod_init: %s", msg); - setenv("DBUS_SESSION_BUS_ADDRESS", "unix:path=/tmp/spotlight.ipc", 1); + LOG(log_info, logtype_sl, "sl_mod_init: %s", msg); g_type_init(); + setenv("DBUS_SESSION_BUS_ADDRESS", "unix:path=/tmp/spotlight.ipc", 1); + setenv("TRACKER_SPARQL_BACKEND", "bus", 1); + +#ifdef DEBUG + setenv("TRACKER_VERBOSITY", "3", 1); + dup2(type_configs[logtype_sl].fd, 1); + dup2(type_configs[logtype_sl].fd, 2); +#endif + + become_root(); connection = tracker_sparql_connection_get(NULL, &error); + unbecome_root(); + if (!connection) { LOG(log_error, logtype_sl, "Couldn't obtain a direct connection to the Tracker store: %s", error ? error->message : "unknown error"); @@ -97,7 +110,7 @@ static const gchar *map_spotlight_to_sparql_query(slq_t *slq) LOG(log_debug, logtype_sl, "query_word_from_sl_query: \"%s\"", sparql_query); } else if ((word = strstr(slquery, "kMDItemDisplayName=="))) { /* Filename search */ - sparql_query_format = "SELECT nie:url(?f) WHERE { ?f nie:url ?url . ?f nfo:fileName ?name . FILTER(fn:starts-with(?url, 'file://%s/') && regex(?name, '%s')) }"; + sparql_query_format = "SELECT ?url WHERE { ?x nie:url ?url ; nfo:fileName ?name FILTER(fn:starts-with(?url, 'file://%s/') && regex(?name, '%s')) }"; EC_NULL_LOG( word = strchr(word, '"') ); word++; EC_NULL( word = dalloc_strdup(slq, word) ); @@ -155,7 +168,10 @@ static int sl_mod_start_search(void *p) tracker_sparql_connection_query_async(connection, sparql_query, NULL, tracker_cb, slq); #endif + become_root(); slq->slq_tracker_cursor = tracker_sparql_connection_query(connection, sparql_query, NULL, &error); + unbecome_root(); + if (error) { LOG(log_error, logtype_sl, "Couldn't query the Tracker Store: '%s'", error ? error->message : "unknown error"); @@ -213,7 +229,7 @@ static int sl_mod_fetch_result(void *p) sl_filemeta_t *fm; sl_array_t *fm_array; uint64_t uint64; - gboolean more; + gboolean qres; if (!slq->slq_tracker_cursor) { LOG(log_debug, logtype_sl, "sl_mod_fetch_result: no results found"); @@ -237,15 +253,27 @@ static int sl_mod_fetch_result(void *p) LOG(log_debug, logtype_sl, "sl_mod_fetch_result: now interating Tracker results cursor"); - while (i <= MAX_SL_RESULTS && tracker_sparql_cursor_next(slq->slq_tracker_cursor, NULL, &error)) { + while (i <= MAX_SL_RESULTS) { + become_root(); + qres = tracker_sparql_cursor_next(slq->slq_tracker_cursor, NULL, &error); + unbecome_root(); + + if (!qres) + break; + + become_root(); uri = tracker_sparql_cursor_get_string(slq->slq_tracker_cursor, 0, NULL); + unbecome_root(); + + LOG(log_debug, logtype_sl, "uri: \"%s\"", uri); + EC_NULL_LOG( path = tracker_to_unix_path(uri) ); if ((id = cnid_for_path(slq->slq_vol->v_cdb, slq->slq_vol->v_path, path, &did)) == CNID_INVALID) { LOG(log_error, logtype_sl, "sl_mod_fetch_result: cnid_for_path error"); goto loop_cleanup; } - LOG(log_debug, logtype_sl, "Result %d: CNID: %" PRIu32 ", path: \"%s\"", i++, ntohl(id), path); + LOG(log_debug, logtype_sl, "Result %d: CNID: %" PRIu32 ", path: \"%s\"", i, ntohl(id), path); uint64 = ntohl(id); dalloc_add_copy(cnids->ca_cnids, &uint64, uint64_t); @@ -253,7 +281,8 @@ static int sl_mod_fetch_result(void *p) loop_cleanup: g_free(path); - } + i++; + } if (error) { LOG(log_error, logtype_sl, "Couldn't query the Tracker Store: '%s'", -- 2.39.2