*/
struct NotifyList *disconnect_notify_list_tail;
+ /**
+ * Head of linked list of functions to call on connects by clients.
+ */
+ struct NotifyList *connect_notify_list_head;
+
+ /**
+ * Tail of linked list of functions to call on connects by clients.
+ */
+ struct NotifyList *connect_notify_list_tail;
+
/**
* Function to call for access control.
*/
*/
int receive_pending;
- /**
- * Finish pending write when disconnecting?
- */
- int finish_pending_write;
-
/**
* Persist the file handle for this client no matter what happens,
* force the OS to close once the process actually dies. Should only
struct GNUNET_NETWORK_FDSet *r;
unsigned int i;
+ if (NULL == server->listen_sockets)
+ return;
if (NULL == server->listen_sockets[0])
return; /* nothing to do, no listen sockets! */
if (NULL == server->listen_sockets[1])
npos);
GNUNET_free (npos);
}
+ while (NULL != (npos = server->connect_notify_list_head))
+ {
+ npos->callback (npos->callback_cls, NULL);
+ GNUNET_CONTAINER_DLL_remove (server->connect_notify_list_head,
+ server->connect_notify_list_tail,
+ npos);
+ GNUNET_free (npos);
+ }
GNUNET_free (server);
}
&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 %llums\n"),
+ _("Processing code for message of type %u did not call `GNUNET_SERVER_receive_done' after %s\n"),
(unsigned int) client->warn_type,
- (unsigned long long)
- GNUNET_TIME_absolute_get_duration (client->warn_start).rel_value);
+ GNUNET_STRINGS_relative_time_to_string (GNUNET_TIME_absolute_get_duration (client->warn_start), GNUNET_YES));
}
"Expected %u bytes for message of type %u, got %u\n",
mh->expected_size, mh->type, size);
GNUNET_break_op (0);
+#else
+ LOG (GNUNET_ERROR_TYPE_DEBUG,
+ "Expected %u bytes for message of type %u, got %u\n",
+ mh->expected_size, mh->type, size);
#endif
return GNUNET_SYSERR;
}
struct GNUNET_CONNECTION_Handle *connection)
{
struct GNUNET_SERVER_Client *client;
+ struct NotifyList *n;
client = GNUNET_malloc (sizeof (struct GNUNET_SERVER_Client));
client->connection = connection;
client->mst =
GNUNET_SERVER_mst_create (&client_message_tokenizer_callback, server);
GNUNET_assert (NULL != client->mst);
+ for (n = server->connect_notify_list_head; NULL != n; n = n->next)
+ n->callback (n->callback_cls, client);
+
client->receive_pending = GNUNET_YES;
GNUNET_CONNECTION_receive (client->connection,
GNUNET_SERVER_MAX_MESSAGE_SIZE - 1,
/**
- * Ask the server to stop notifying us whenever a client disconnects.
+ * Ask the server to notify us whenever a client connects.
+ * This function is called whenever the actual network connection
+ * is opened.
*
* @param server the server manageing the clients
- * @param callback function to call on disconnect
+ * @param callback function to call on sconnect
+ * @param callback_cls closure for callback
+ */
+void
+GNUNET_SERVER_connect_notify (struct GNUNET_SERVER_Handle *server,
+ GNUNET_SERVER_ConnectCallback callback, void *callback_cls)
+{
+ struct NotifyList *n;
+
+ n = GNUNET_malloc (sizeof (struct NotifyList));
+ n->callback = callback;
+ n->callback_cls = callback_cls;
+ GNUNET_CONTAINER_DLL_insert (server->connect_notify_list_head,
+ server->connect_notify_list_tail,
+ n);
+}
+
+
+/**
+ * Ask the server to stop notifying us whenever a client connects.
+ *
+ * @param server the server manageing the clients
+ * @param callback function to call on connect
* @param callback_cls closure for callback
*/
void
}
+/**
+ * Ask the server to stop notifying us whenever a client disconnects.
+ *
+ * @param server the server manageing the clients
+ * @param callback function to call on disconnect
+ * @param callback_cls closure for callback
+ */
+void
+GNUNET_SERVER_connect_notify_cancel (struct GNUNET_SERVER_Handle *server,
+ GNUNET_SERVER_ConnectCallback callback, void *callback_cls)
+{
+ struct NotifyList *pos;
+
+ for (pos = server->connect_notify_list_head; NULL != pos; pos = pos->next)
+ if ((pos->callback == callback) && (pos->callback_cls == callback_cls))
+ break;
+ if (NULL == pos)
+ {
+ GNUNET_break (0);
+ return;
+ }
+ GNUNET_CONTAINER_DLL_remove (server->connect_notify_list_head,
+ server->connect_notify_list_tail,
+ pos);
+ GNUNET_free (pos);
+}
+
+
/**
* Destroy the connection that is passed in via 'cls'. Used
* as calling 'GNUNET_CONNECTION_destroy' from within a function