X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Futil%2Fserver.c;h=606d4436906572167ecda4f2af35b6625b18073a;hb=555214089c7045298f23fea9e060ea931804e75f;hp=4fa296f4ac1536fc4046a0386874cdb7e353c288;hpb=d5b01c568df1eec766605aa5051e8bee254ae9ae;p=oweals%2Fgnunet.git diff --git a/src/util/server.c b/src/util/server.c index 4fa296f4a..606d44369 100644 --- a/src/util/server.c +++ b/src/util/server.c @@ -33,7 +33,7 @@ #include "gnunet_disk_lib.h" #include "gnunet_protocols.h" -#define DEBUG_SERVER GNUNET_YES +#define DEBUG_SERVER GNUNET_NO /** * List of arrays of message handlers. @@ -389,6 +389,60 @@ open_listen_socket (const struct sockaddr *serverAddr, socklen_t socklen) } +/** + * Create a new server. + * + * @param sched scheduler to use + * @param access function for access control + * @param access_cls closure for access + * @param lsocks NULL-terminated array of listen sockets + * @param maxbuf maximum write buffer size for accepted sockets + * @param idle_timeout after how long should we timeout idle connections? + * @param require_found if YES, connections sending messages of unknown type + * will be closed + * @return handle for the new server, NULL on error + * (typically, "port" already in use) + */ +struct GNUNET_SERVER_Handle * +GNUNET_SERVER_create_with_sockets (struct GNUNET_SCHEDULER_Handle *sched, + GNUNET_CONNECTION_AccessCheck access, void *access_cls, + struct GNUNET_NETWORK_Handle **lsocks, + size_t maxbuf, + struct GNUNET_TIME_Relative + idle_timeout, + int require_found) +{ + struct GNUNET_SERVER_Handle *ret; + struct GNUNET_NETWORK_FDSet *r; + int i; + + ret = GNUNET_malloc (sizeof (struct GNUNET_SERVER_Handle)); + ret->sched = sched; + ret->maxbuf = maxbuf; + ret->idle_timeout = idle_timeout; + ret->listen_sockets = lsocks; + ret->access = access; + ret->access_cls = access_cls; + ret->require_found = require_found; + if (lsocks != NULL) + { + r = GNUNET_NETWORK_fdset_create (); + i = 0; + while (NULL != ret->listen_sockets[i]) + GNUNET_NETWORK_fdset_set (r, ret->listen_sockets[i++]); + ret->listen_task = GNUNET_SCHEDULER_add_select (sched, + GNUNET_SCHEDULER_PRIORITY_HIGH, + GNUNET_SCHEDULER_NO_TASK, + GNUNET_TIME_UNIT_FOREVER_REL, + r, NULL, + &process_listen_socket, + ret); + GNUNET_NETWORK_fdset_destroy (r); + } + return ret; +} + + /** * Create a new server. * @@ -414,9 +468,7 @@ GNUNET_SERVER_create (struct GNUNET_SCHEDULER_Handle *sched, struct GNUNET_TIME_Relative idle_timeout, int require_found) { - struct GNUNET_SERVER_Handle *ret; struct GNUNET_NETWORK_Handle **lsocks; - struct GNUNET_NETWORK_FDSet *r; unsigned int i; unsigned int j; @@ -448,30 +500,12 @@ GNUNET_SERVER_create (struct GNUNET_SCHEDULER_Handle *sched, { lsocks = NULL; } - ret = GNUNET_malloc (sizeof (struct GNUNET_SERVER_Handle)); - ret->sched = sched; - ret->maxbuf = maxbuf; - ret->idle_timeout = idle_timeout; - ret->listen_sockets = lsocks; - ret->access = access; - ret->access_cls = access_cls; - ret->require_found = require_found; - if (lsocks != NULL) - { - r = GNUNET_NETWORK_fdset_create (); - i = 0; - while (NULL != ret->listen_sockets[i]) - GNUNET_NETWORK_fdset_set (r, ret->listen_sockets[i++]); - ret->listen_task = GNUNET_SCHEDULER_add_select (sched, - GNUNET_SCHEDULER_PRIORITY_HIGH, - GNUNET_SCHEDULER_NO_TASK, - GNUNET_TIME_UNIT_FOREVER_REL, - r, NULL, - &process_listen_socket, - ret); - GNUNET_NETWORK_fdset_destroy (r); - } - return ret; + return GNUNET_SERVER_create_with_sockets (sched, + access, access_cls, + lsocks, + maxbuf, + idle_timeout, + require_found); } @@ -667,7 +701,7 @@ process_mst (struct GNUNET_SERVER_Client *client, "Server re-enters receive loop.\n"); #endif GNUNET_CONNECTION_receive (client->connection, - GNUNET_SERVER_MAX_MESSAGE_SIZE, + GNUNET_SERVER_MAX_MESSAGE_SIZE - 1, client->server->idle_timeout, &process_incoming, client); break; @@ -675,7 +709,7 @@ process_mst (struct GNUNET_SERVER_Client *client, #if DEBUG_SERVER GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Server processes additional messages instantly.\n"); #endif - ret = GNUNET_SERVER_mst_receive (client->mst, NULL, 0, GNUNET_NO, GNUNET_YES); + ret = GNUNET_SERVER_mst_receive (client->mst, client, NULL, 0, GNUNET_NO, GNUNET_YES); } #if DEBUG_SERVER GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, @@ -743,7 +777,7 @@ process_incoming (void *cls, #endif GNUNET_SERVER_client_keep (client); client->last_activity = GNUNET_TIME_absolute_get (); - ret = GNUNET_SERVER_mst_receive (client->mst, buf, available, GNUNET_NO, GNUNET_YES); + ret = GNUNET_SERVER_mst_receive (client->mst, client, buf, available, GNUNET_NO, GNUNET_YES); process_mst (client, ret); } @@ -777,7 +811,7 @@ restart_processing (void *cls, #endif client->receive_pending = GNUNET_YES; GNUNET_CONNECTION_receive (client->connection, - GNUNET_SERVER_MAX_MESSAGE_SIZE, + GNUNET_SERVER_MAX_MESSAGE_SIZE - 1, client->server->idle_timeout, &process_incoming, client); return; } @@ -843,8 +877,7 @@ GNUNET_SERVER_connect_socket (struct client = GNUNET_malloc (sizeof (struct GNUNET_SERVER_Client)); client->connection = connection; - client->mst = GNUNET_SERVER_mst_create (GNUNET_SERVER_MAX_MESSAGE_SIZE, - client, + client->mst = GNUNET_SERVER_mst_create (GNUNET_SERVER_MAX_MESSAGE_SIZE - 1, &client_message_tokenizer_callback, server); client->reference_count = 1; @@ -854,7 +887,7 @@ GNUNET_SERVER_connect_socket (struct server->clients = client; client->receive_pending = GNUNET_YES; GNUNET_CONNECTION_receive (client->connection, - GNUNET_SERVER_MAX_MESSAGE_SIZE, + GNUNET_SERVER_MAX_MESSAGE_SIZE - 1, server->idle_timeout, &process_incoming, client); return client; }