X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Futil%2Fserver.c;h=606d4436906572167ecda4f2af35b6625b18073a;hb=555214089c7045298f23fea9e060ea931804e75f;hp=940aad363cb23a81d1102ccb4d1523893a3e9d44;hpb=45e99c8ffe2b2f86caf02b1cc5cefca280fd3b53;p=oweals%2Fgnunet.git diff --git a/src/util/server.c b/src/util/server.c index 940aad363..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; @@ -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,7 +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->mst = GNUNET_SERVER_mst_create (GNUNET_SERVER_MAX_MESSAGE_SIZE - 1, &client_message_tokenizer_callback, server); client->reference_count = 1; @@ -853,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; }