Link libgnunetblockgroup to libgnunetblock
[oweals/gnunet.git] / src / util / server.c
index 920d4ab334c0316a7c3d65b672962952d1c1f379..83c30e328fcafffa6939a3464c55de3081eb8196 100644 (file)
@@ -1,6 +1,6 @@
 /*
      This file is part of GNUnet.
-     Copyright (C) 2009-2013 Christian Grothoff (and other contributing authors)
+     Copyright (C) 2009-2013 GNUnet e.V.
 
      GNUnet is free software; you can redistribute it and/or modify
      it under the terms of the GNU General Public License as published
@@ -14,8 +14,8 @@
 
      You should have received a copy of the GNU General Public License
      along with GNUnet; see the file COPYING.  If not, write to the
-     Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-     Boston, MA 02111-1307, USA.
+     Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+     Boston, MA 02110-1301, USA.
 */
 
 /**
 #include "gnunet_util_lib.h"
 #include "gnunet_protocols.h"
 
-#define LOG(kind,...) GNUNET_log_from (kind, "util", __VA_ARGS__)
+#define LOG(kind,...) GNUNET_log_from (kind, "util-server", __VA_ARGS__)
 
-#define LOG_STRERROR(kind,syscall) GNUNET_log_from_strerror (kind, "util", syscall)
+#define LOG_STRERROR(kind,syscall) GNUNET_log_from_strerror (kind, "util-server", syscall)
 
-#define LOG_STRERROR_FILE(kind,syscall,filename) GNUNET_log_from_strerror_file (kind, "util", syscall, filename)
+#define LOG_STRERROR_FILE(kind,syscall,filename) GNUNET_log_from_strerror_file (kind, "util-server", syscall, filename)
 
 
 /**
@@ -389,23 +389,17 @@ GNUNET_SERVER_client_set_user_context_ (struct GNUNET_SERVER_Client *client,
  *
  * @param cls handle to our server for which we are processing the listen
  *        socket
- * @param tc reason why we are running right now
  */
 static void
-process_listen_socket (void *cls,
-                       const struct GNUNET_SCHEDULER_TaskContext *tc)
+process_listen_socket (void *cls)
 {
   struct GNUNET_SERVER_Handle *server = cls;
+  const struct GNUNET_SCHEDULER_TaskContext *tc;
   struct GNUNET_CONNECTION_Handle *sock;
   unsigned int i;
 
   server->listen_task = NULL;
-  if (0 != (tc->reason & GNUNET_SCHEDULER_REASON_SHUTDOWN))
-  {
-    /* ignore shutdown, someone else will take care of it! */
-    GNUNET_SERVER_resume (server);
-    return;
-  }
+  tc = GNUNET_SCHEDULER_get_task_context ();
   for (i = 0; NULL != server->listen_sockets[i]; i++)
   {
     if (GNUNET_NETWORK_fdset_isset (tc->read_ready,
@@ -437,7 +431,8 @@ process_listen_socket (void *cls,
  * @return NULL on error, otherwise the listen socket
  */
 static struct GNUNET_NETWORK_Handle *
-open_listen_socket (const struct sockaddr *server_addr, socklen_t socklen)
+open_listen_socket (const struct sockaddr *server_addr,
+                   socklen_t socklen)
 {
   struct GNUNET_NETWORK_Handle *sock;
   uint16_t port;
@@ -655,12 +650,10 @@ GNUNET_SERVER_client_mark_monitor (struct GNUNET_SERVER_Client *client)
  * Helper function for #test_monitor_clients() to trigger
  * #GNUNET_SERVER_destroy() after the stack has unwound.
  *
- * @param cls the 'struct GNUNET_SERVER_Handle' to destroy
- * @param tc unused
+ * @param cls the `struct GNUNET_SERVER_Handle *` to destroy
  */
 static void
-do_destroy (void *cls,
-           const struct GNUNET_SCHEDULER_TaskContext *tc)
+do_destroy (void *cls)
 {
   struct GNUNET_SERVER_Handle *server = cls;
 
@@ -685,7 +678,7 @@ test_monitor_clients (struct GNUNET_SERVER_Handle *server)
     if (GNUNET_NO == client->is_monitor)
       return; /* not done yet */
   server->in_soft_shutdown = GNUNET_SYSERR;
-  GNUNET_SCHEDULER_add_now (&do_destroy, server);
+  (void) GNUNET_SCHEDULER_add_now (&do_destroy, server);
 }
 
 
@@ -722,8 +715,8 @@ GNUNET_SERVER_resume (struct GNUNET_SERVER_Handle *server)
     return; /* nothing to do, no listen sockets! */
   if (NULL == server->listen_sockets[1])
   {
-    /* simplified method: no fd set needed; this is then much simpler and
-       much more efficient */
+    /* simplified method: no fd set needed; this is then much simpler
+       and much more efficient */
     server->listen_task =
       GNUNET_SCHEDULER_add_read_net_with_priority (GNUNET_TIME_UNIT_FOREVER_REL,
                                                   GNUNET_SCHEDULER_PRIORITY_HIGH,
@@ -813,7 +806,8 @@ GNUNET_SERVER_destroy (struct GNUNET_SERVER_Handle *server)
   }
   while (NULL != (npos = server->disconnect_notify_list_head))
   {
-    npos->callback (npos->callback_cls, NULL);
+    npos->callback (npos->callback_cls,
+                    NULL);
     GNUNET_CONTAINER_DLL_remove (server->disconnect_notify_list_head,
                                 server->disconnect_notify_list_tail,
                                 npos);
@@ -821,7 +815,8 @@ GNUNET_SERVER_destroy (struct GNUNET_SERVER_Handle *server)
   }
   while (NULL != (npos = server->connect_notify_list_head))
   {
-    npos->callback (npos->callback_cls, NULL);
+    npos->callback (npos->callback_cls,
+                    NULL);
     GNUNET_CONTAINER_DLL_remove (server->connect_notify_list_head,
                                 server->connect_notify_list_tail,
                                 npos);
@@ -885,11 +880,9 @@ GNUNET_SERVER_set_callbacks (struct GNUNET_SERVER_Handle *server,
  * Task run to warn about missing calls to #GNUNET_SERVER_receive_done.
  *
  * @param cls our `struct GNUNET_SERVER_Client *` to process more requests from
- * @param tc scheduler context (unused)
  */
 static void
-warn_no_receive_done (void *cls,
-                     const struct GNUNET_SCHEDULER_TaskContext *tc)
+warn_no_receive_done (void *cls)
 {
   struct GNUNET_SERVER_Client *client = cls;
 
@@ -897,11 +890,11 @@ warn_no_receive_done (void *cls,
   client->warn_task =
       GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_MINUTES,
                                     &warn_no_receive_done, client);
-  if (0 == (GNUNET_SCHEDULER_REASON_SHUTDOWN & tc->reason))
-    LOG (GNUNET_ERROR_TYPE_WARNING,
-         _("Processing code for message of type %u did not call `GNUNET_SERVER_receive_done' after %s\n"),
-         (unsigned int) client->warn_type,
-         GNUNET_STRINGS_relative_time_to_string (GNUNET_TIME_absolute_get_duration (client->warn_start), GNUNET_YES));
+  LOG (GNUNET_ERROR_TYPE_WARNING,
+       _("Processing code for message of type %u did not call `GNUNET_SERVER_receive_done' after %s\n"),
+       (unsigned int) client->warn_type,
+       GNUNET_STRINGS_relative_time_to_string (GNUNET_TIME_absolute_get_duration (client->warn_start),
+                                              GNUNET_YES));
 }
 
 
@@ -952,9 +945,9 @@ GNUNET_SERVER_inject (struct GNUNET_SERVER_Handle *server,
 
   type = ntohs (message->type);
   size = ntohs (message->size);
-  LOG (GNUNET_ERROR_TYPE_DEBUG,
-       "Server schedules transmission of %u-byte message of type %u to client.\n",
-       size, type);
+  LOG (GNUNET_ERROR_TYPE_INFO,
+       "Received message of type %u and size %u from client\n",
+       type, size);
   found = GNUNET_NO;
   for (pos = server->handlers; NULL != pos; pos = pos->next)
   {
@@ -987,7 +980,8 @@ GNUNET_SERVER_inject (struct GNUNET_SERVER_Handle *server,
             sender->warn_start = GNUNET_TIME_absolute_get ();
             sender->warn_task =
                 GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_MINUTES,
-                                              &warn_no_receive_done, sender);
+                                              &warn_no_receive_done,
+                                             sender);
             sender->warn_type = type;
           }
           sender->suspended++;
@@ -1136,7 +1130,8 @@ process_incoming (void *cls,
     GNUNET_CONNECTION_receive (client->connection,
                                GNUNET_SERVER_MAX_MESSAGE_SIZE - 1,
                                GNUNET_TIME_absolute_get_remaining (end),
-                               &process_incoming, client);
+                               &process_incoming,
+                               client);
     return;
   }
   if ( (NULL == buf) ||
@@ -1196,11 +1191,9 @@ process_incoming (void *cls,
  * and process requests.
  *
  * @param cls our `struct GNUNET_SERVER_Client *` to process more requests from
- * @param tc scheduler context (unused)
  */
 static void
-restart_processing (void *cls,
-                    const struct GNUNET_SCHEDULER_TaskContext *tc)
+restart_processing (void *cls)
 {
   struct GNUNET_SERVER_Client *client = cls;
 
@@ -1247,8 +1240,8 @@ client_message_tokenizer_callback (void *cls,
   int ret;
 
   LOG (GNUNET_ERROR_TYPE_DEBUG,
-       "Tokenizer gives server message of type %u from client\n",
-       ntohs (message->type));
+       "Tokenizer gives server message of type %u and size %u from client\n",
+       ntohs (message->type), ntohs (message->size));
   sender->in_process_client_buffer = GNUNET_YES;
   ret = GNUNET_SERVER_inject (server, sender, message);
   sender->in_process_client_buffer = GNUNET_NO;
@@ -1416,6 +1409,7 @@ GNUNET_SERVER_connect_notify (struct GNUNET_SERVER_Handle *server,
                              void *callback_cls)
 {
   struct NotifyList *n;
+  struct GNUNET_SERVER_Client *client;
 
   n = GNUNET_new (struct NotifyList);
   n->callback = callback;
@@ -1423,6 +1417,8 @@ GNUNET_SERVER_connect_notify (struct GNUNET_SERVER_Handle *server,
   GNUNET_CONTAINER_DLL_insert (server->connect_notify_list_head,
                               server->connect_notify_list_tail,
                               n);
+  for (client = server->clients_head; NULL != client; client = client->next)
+    callback (callback_cls, client);
 }
 
 
@@ -1435,8 +1431,8 @@ GNUNET_SERVER_connect_notify (struct GNUNET_SERVER_Handle *server,
  */
 void
 GNUNET_SERVER_disconnect_notify_cancel (struct GNUNET_SERVER_Handle *server,
-                                        GNUNET_SERVER_DisconnectCallback
-                                        callback, void *callback_cls)
+                                        GNUNET_SERVER_DisconnectCallback callback,
+                                        void *callback_cls)
 {
   struct NotifyList *pos;
 
@@ -1491,11 +1487,9 @@ GNUNET_SERVER_connect_notify_cancel (struct GNUNET_SERVER_Handle *server,
  * 'connection.c' is not allowed (see #2329).
  *
  * @param cls connection to destroy
- * @param tc scheduler context (unused)
  */
 static void
-destroy_connection (void *cls,
-                   const struct GNUNET_SCHEDULER_TaskContext *tc)
+destroy_connection (void *cls)
 {
   struct GNUNET_CONNECTION_Handle *connection = cls;
 
@@ -1653,8 +1647,8 @@ struct GNUNET_SERVER_TransmitHandle *
 GNUNET_SERVER_notify_transmit_ready (struct GNUNET_SERVER_Client *client,
                                      size_t size,
                                      struct GNUNET_TIME_Relative timeout,
-                                     GNUNET_CONNECTION_TransmitReadyNotify
-                                     callback, void *callback_cls)
+                                     GNUNET_CONNECTION_TransmitReadyNotify callback,
+                                     void *callback_cls)
 {
   if (NULL != client->th.callback)
     return NULL;
@@ -1750,7 +1744,8 @@ GNUNET_SERVER_receive_done (struct GNUNET_SERVER_Client *client,
   LOG (GNUNET_ERROR_TYPE_DEBUG,
        "GNUNET_SERVER_receive_done causes restart in reading from the socket\n");
   GNUNET_assert (NULL == client->restart_task);
-  client->restart_task = GNUNET_SCHEDULER_add_now (&restart_processing, client);
+  client->restart_task = GNUNET_SCHEDULER_add_now (&restart_processing,
+                                                   client);
 }