X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Futil%2Fserver_tc.c;h=f803af48cba988c64f624224577c7c312f63ed88;hb=72c8645af31896829b674b575c5375706f362a30;hp=7514b0cd334c54d5666e3efa2b499ab37d6996ac;hpb=48436941449d867ef9a32ddf29439c5017d37775;p=oweals%2Fgnunet.git diff --git a/src/util/server_tc.c b/src/util/server_tc.c index 7514b0cd3..f803af48c 100644 --- a/src/util/server_tc.c +++ b/src/util/server_tc.c @@ -33,6 +33,8 @@ #include "gnunet_time_lib.h" +#define LOG(kind,...) GNUNET_log_from (kind, "util", __VA_ARGS__) + /** * How much buffer space do we want to have at least @@ -79,13 +81,12 @@ transmit_response (void *cls, size_t size, void *buf) { struct GNUNET_SERVER_TransmitContext *tc = cls; size_t msize; - if (buf == NULL) - { - GNUNET_SERVER_receive_done (tc->client, GNUNET_SYSERR); - GNUNET_free_non_null (tc->buf); - GNUNET_free (tc); - return 0; - } + + if (NULL == buf) + { + GNUNET_SERVER_transmit_context_destroy (tc, GNUNET_SYSERR); + return 0; + } if (tc->total - tc->off > size) msize = size; else @@ -93,28 +94,26 @@ transmit_response (void *cls, size_t size, void *buf) memcpy (buf, &tc->buf[tc->off], msize); tc->off += msize; if (tc->total == tc->off) - { - GNUNET_SERVER_receive_done (tc->client, GNUNET_OK); - GNUNET_free_non_null (tc->buf); - GNUNET_free (tc); - } + { + GNUNET_SERVER_receive_done (tc->client, GNUNET_OK); + GNUNET_SERVER_client_drop (tc->client); + GNUNET_free_non_null (tc->buf); + GNUNET_free (tc); + } else + { + if (NULL == + GNUNET_SERVER_notify_transmit_ready (tc->client, + GNUNET_MIN (MIN_BLOCK_SIZE, + tc->total - tc->off), + GNUNET_TIME_absolute_get_remaining + (tc->timeout), &transmit_response, + tc)) { - if (NULL == GNUNET_SERVER_notify_transmit_ready (tc->client, - GNUNET_MIN - (MIN_BLOCK_SIZE, - tc->total - tc->off), - GNUNET_TIME_absolute_get_remaining - (tc->timeout), - &transmit_response, - tc)) - { - GNUNET_break (0); - GNUNET_SERVER_receive_done (tc->client, GNUNET_SYSERR); - GNUNET_free_non_null (tc->buf); - GNUNET_free (tc); - } + GNUNET_break (0); + GNUNET_SERVER_transmit_context_destroy (tc, GNUNET_SYSERR); } + } return msize; } @@ -131,8 +130,9 @@ GNUNET_SERVER_transmit_context_create (struct GNUNET_SERVER_Client *client) { struct GNUNET_SERVER_TransmitContext *tc; - GNUNET_assert (client != NULL); + GNUNET_assert (NULL != client); tc = GNUNET_malloc (sizeof (struct GNUNET_SERVER_TransmitContext)); + GNUNET_SERVER_client_keep (client); tc->client = client; return tc; } @@ -150,8 +150,8 @@ GNUNET_SERVER_transmit_context_create (struct GNUNET_SERVER_Client *client) */ void GNUNET_SERVER_transmit_context_append_data (struct GNUNET_SERVER_TransmitContext - *tc, const void *data, size_t length, - uint16_t type) + *tc, const void *data, + size_t length, uint16_t type) { struct GNUNET_MessageHeader *msg; size_t size; @@ -177,8 +177,11 @@ GNUNET_SERVER_transmit_context_append_data (struct GNUNET_SERVER_TransmitContext * @param msg message to append */ void -GNUNET_SERVER_transmit_context_append_message(struct GNUNET_SERVER_TransmitContext - *tc, const struct GNUNET_MessageHeader *msg) +GNUNET_SERVER_transmit_context_append_message (struct + GNUNET_SERVER_TransmitContext + *tc, + const struct GNUNET_MessageHeader + *msg) { struct GNUNET_MessageHeader *m; uint16_t size; @@ -210,12 +213,34 @@ GNUNET_SERVER_transmit_context_run (struct GNUNET_SERVER_TransmitContext *tc, GNUNET_MIN (MIN_BLOCK_SIZE, tc->total), timeout, &transmit_response, tc)) - { - GNUNET_break (0); - GNUNET_SERVER_receive_done (tc->client, GNUNET_SYSERR); - GNUNET_free_non_null (tc->buf); - GNUNET_free (tc); - } + { + GNUNET_break (0); + GNUNET_SERVER_transmit_context_destroy (tc, GNUNET_SYSERR); + } } + +/** + * Destroy a transmission context. This function must not be called + * after 'GNUNET_SERVER_transmit_context_run'. + * + * @param tc transmission context to destroy + * @param success code to give to 'GNUNET_SERVER_receive_done' for + * the client: GNUNET_OK to keep the connection open and + * continue to receive + * GNUNET_NO to close the connection (normal behavior) + * GNUNET_SYSERR to close the connection (signal + * serious error) + */ +void +GNUNET_SERVER_transmit_context_destroy (struct GNUNET_SERVER_TransmitContext + *tc, int success) +{ + GNUNET_SERVER_receive_done (tc->client, success); + GNUNET_SERVER_client_drop (tc->client); + GNUNET_free_non_null (tc->buf); + GNUNET_free (tc); +} + + /* end of server_tc.c */