]> arthur.barton.de Git - netatalk.git/blobdiff - etc/afpd/spotlight.c
netatalk: fix a crash on Solaris when registering with mDNS
[netatalk.git] / etc / afpd / spotlight.c
index 994438d900fc5d5e097eaf70f8cd7d0e099d7402..d2539b8358e25684e3d4c568ee8cce9df55c73ea 100644 (file)
@@ -42,6 +42,8 @@
 #include "directory.h"
 #include "etc/spotlight/sparql_parser.h"
 
+#include <glib.h>
+
 #define MAX_SL_RESULTS 20
 
 struct slq_state_names {
@@ -400,7 +402,7 @@ static bool create_result_handle(slq_t *slq)
 static bool add_results(sl_array_t *array, slq_t *slq)
 {
     sl_filemeta_t *fm;
-    uint64_t status = 0;
+    uint64_t status;
 
     /* FileMeta */
     fm = talloc_zero(array, sl_filemeta_t);
@@ -408,6 +410,19 @@ static bool add_results(sl_array_t *array, slq_t *slq)
         return false;
     }
 
+    switch (slq->slq_state) {
+    case SLQ_STATE_RUNNING:
+        /*
+         * Wtf, why 35? Taken from an AFP capture.
+         */
+        status = 35;
+        break;
+
+    default:
+        status = 0;
+        break;
+    }
+
     dalloc_add_copy(array, &status, uint64_t);
     dalloc_add(array, slq->query_results->cnids, sl_cnids_t);
     if (slq->query_results->num_results > 0) {
@@ -707,7 +722,6 @@ static void tracker_query_cb(GObject      *object,
                              GAsyncResult *res,
                              gpointer      user_data)
 {
-    bool ok;
     GError *error = NULL;
     slq_t *slq = user_data;
 
@@ -734,13 +748,6 @@ static void tracker_query_cb(GObject      *object,
 
     slq->slq_state = SLQ_STATE_RESULTS;
 
-    ok = create_result_handle(slq);
-    if (!ok) {
-        LOG(log_error, logtype_sl, "create_result_handle error");
-        slq->slq_state = SLQ_STATE_ERROR;
-        return;
-    }
-
     tracker_sparql_cursor_next_async(slq->tracker_cursor,
                                      slq->slq_obj->sl_ctx->cancellable,
                                      tracker_cursor_cb,
@@ -822,6 +829,7 @@ static int sl_rpc_openQuery(AFPObj *obj,
     uint64_t result;
     gchar *sparql_query;
     GError *error = NULL;
+    bool ok;
 
     array = talloc_zero(reply, sl_array_t);
 
@@ -905,6 +913,14 @@ static int sl_rpc_openQuery(AFPObj *obj,
     }
 
     slq->slq_state = SLQ_STATE_RUNNING;
+
+    ok = create_result_handle(slq);
+    if (!ok) {
+        LOG(log_error, logtype_sl, "create_result_handle error");
+        slq->slq_state = SLQ_STATE_ERROR;
+        EC_FAIL;
+    }
+
     slq_add(slq);
 
 EC_CLEANUP:
@@ -965,8 +981,7 @@ static int sl_rpc_fetchQueryResultsForContext(const AFPObj *obj,
             LOG(log_error, logtype_sl, "error adding results");
             EC_FAIL;
         }
-        if (slq->slq_state == SLQ_STATE_RESULTS
-            || slq->slq_state == SLQ_STATE_FULL) {
+        if (slq->slq_state == SLQ_STATE_FULL) {
             slq->slq_state = SLQ_STATE_RESULTS;
 
             tracker_sparql_cursor_next_async(
@@ -1286,6 +1301,9 @@ int spotlight_init(AFPObj *obj)
     /*
      * Tracker uses glibs event dispatching, so we need a mainloop
      */
+#if ((GLIB_MAJOR_VERSION <= 2) && (GLIB_MINOR_VERSION < 36))
+        g_type_init();
+#endif
     sl_ctx->mainloop = g_main_loop_new(NULL, false);
     sl_ctx->cancellable = g_cancellable_new();