use NULL as flag for evaluation of query, ensure we pass non-NULL for reply_block...
[oweals/gnunet.git] / src / util / service_new.c
index 9929341f46e408870283a118c52f74c5fd43e325..8d654c0cbda81591f9edcac1255636520f5df0d7 100644 (file)
@@ -136,7 +136,7 @@ struct GNUNET_SERVICE_Handle
   /**
    * Message handlers to use for all clients.
    */
-  const struct GNUNET_MQ_MessageHandler *handlers;
+  struct GNUNET_MQ_MessageHandler *handlers;
 
   /**
    * Closure for @e task.
@@ -390,6 +390,14 @@ service_main (void *cls)
     GNUNET_SCHEDULER_add_shutdown (&service_shutdown,
                                    sh);
   GNUNET_SERVICE_resume (sh);
+
+  if (-1 != sh->ready_confirm_fd)
+  {
+    GNUNET_break (1 == WRITE (sh->ready_confirm_fd, ".", 1));
+    GNUNET_break (0 == CLOSE (sh->ready_confirm_fd));
+    sh->ready_confirm_fd = -1;
+  }
+
   if (NULL != sh->service_init_cb)
     sh->service_init_cb (sh->cb_cls,
                         sh->cfg,
@@ -1616,12 +1624,24 @@ GNUNET_SERVICE_starT (const char *service_name,
   sh->connect_cb = connect_cb;
   sh->disconnect_cb = disconnect_cb;
   sh->cb_cls = cls;
-  sh->handlers = handlers;
+  if (NULL != handlers)
+  {
+    unsigned int i;
+
+    for (i=0;NULL != handlers[i].cb; i++) ;
+    sh->handlers = GNUNET_new_array (i + 1,
+                                    struct GNUNET_MQ_MessageHandler);
+    GNUNET_memcpy (sh->handlers,
+                   handlers,
+                   i * sizeof (struct GNUNET_MQ_MessageHandler));
+  }
   if (GNUNET_OK != setup_service (sh))
   {
+    GNUNET_free (sh->handlers);
     GNUNET_free (sh);
     return NULL;
   }
+  GNUNET_SERVICE_resume (sh);
   return sh;
 }
 
@@ -1634,7 +1654,13 @@ GNUNET_SERVICE_starT (const char *service_name,
 void
 GNUNET_SERVICE_stoP (struct GNUNET_SERVICE_Handle *srv)
 {
+  struct GNUNET_SERVICE_Client *client;
+
+  GNUNET_SERVICE_suspend (srv);
+  while (NULL != (client = srv->clients_head))
+    GNUNET_SERVICE_client_drop (client);
   teardown_service (srv);
+  GNUNET_free (srv->handlers);
   GNUNET_free (srv);
 }
 
@@ -1736,7 +1762,17 @@ GNUNET_SERVICE_ruN_ (int argc,
   sh.connect_cb = connect_cb;
   sh.disconnect_cb = disconnect_cb;
   sh.cb_cls = cls;
-  sh.handlers = handlers;
+  if (NULL != handlers)
+  {
+    unsigned int i;
+
+    for (i=0;NULL != handlers[i].cb; i++) ;
+    sh.handlers = GNUNET_new_array (i + 1,
+                                    struct GNUNET_MQ_MessageHandler);
+    GNUNET_memcpy (sh.handlers,
+                   handlers,
+                   i * sizeof (struct GNUNET_MQ_MessageHandler));
+  }
   sh.service_name = service_name;
 
   /* setup subsystems */
@@ -1867,7 +1903,7 @@ shutdown:
   }
 #endif
   teardown_service (&sh);
-
+  GNUNET_free (sh.handlers);
   GNUNET_SPEEDUP_stop_ ();
   GNUNET_CONFIGURATION_destroy (cfg);
   GNUNET_free_non_null (logfile);
@@ -1946,6 +1982,10 @@ do_send (void *cls)
       return;
     }
   }
+  if (0 == client->msg_pos)
+  {
+    GNUNET_MQ_impl_send_in_flight (client->mq);
+  }
   client->msg_pos += ret;
   if (left > ret)
   {
@@ -1998,9 +2038,10 @@ service_mq_cancel (struct GNUNET_MQ_Handle *mq,
 {
   struct GNUNET_SERVICE_Client *client = impl_state;
 
-  GNUNET_assert (0); // not implemented
-  // FIXME: stop transmission! (must be possible, otherwise
-  // we must have told MQ that the message was sent!)
+  GNUNET_assert (0 == client->msg_pos);
+  client->msg = NULL;
+  GNUNET_SCHEDULER_cancel (client->send_task);
+  client->send_task = NULL;
 }
 
 
@@ -2162,9 +2203,10 @@ start_client (struct GNUNET_SERVICE_Handle *sh,
                                               client);
   client->mst = GNUNET_MST_create (&service_client_mst_cb,
                                   client);
-  client->user_context = sh->connect_cb (sh->cb_cls,
-                                         client,
-                                         client->mq);
+  if (NULL != sh->connect_cb)
+    client->user_context = sh->connect_cb (sh->cb_cls,
+                                           client,
+                                           client->mq);
   GNUNET_MQ_set_handlers_closure (client->mq,
                                   client->user_context);
   client->recv_task
@@ -2484,9 +2526,10 @@ GNUNET_SERVICE_client_drop (struct GNUNET_SERVICE_Client *c)
   GNUNET_CONTAINER_DLL_remove (sh->clients_head,
                                sh->clients_tail,
                                c);
-  sh->disconnect_cb (sh->cb_cls,
-                     c,
-                     c->user_context);
+  if (NULL != sh->disconnect_cb)
+    sh->disconnect_cb (sh->cb_cls,
+                       c,
+                       c->user_context);
   if (NULL != c->warn_task)
   {
     GNUNET_SCHEDULER_cancel (c->warn_task);