X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Futil%2Fserver_tc.c;h=f803af48cba988c64f624224577c7c312f63ed88;hb=72c8645af31896829b674b575c5375706f362a30;hp=bffb892b17299afd9a70d888fb426a6d830feaab;hpb=2518cfc0a86865ebe4d0550e0013ed52a494231b;p=oweals%2Fgnunet.git diff --git a/src/util/server_tc.c b/src/util/server_tc.c index bffb892b1..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; } @@ -149,9 +149,9 @@ GNUNET_SERVER_transmit_context_create (struct GNUNET_SERVER_Client *client) * @param type type of the message */ void -GNUNET_SERVER_transmit_context_append (struct GNUNET_SERVER_TransmitContext - *tc, const void *data, size_t length, - uint16_t type) +GNUNET_SERVER_transmit_context_append_data (struct GNUNET_SERVER_TransmitContext + *tc, const void *data, + size_t length, uint16_t type) { struct GNUNET_MessageHeader *msg; size_t size; @@ -168,6 +168,32 @@ GNUNET_SERVER_transmit_context_append (struct GNUNET_SERVER_TransmitContext } +/** + * Append a message to the transmission context. + * All messages in the context will be sent by + * the transmit_context_run method. + * + * @param tc context to use + * @param msg message to append + */ +void +GNUNET_SERVER_transmit_context_append_message (struct + GNUNET_SERVER_TransmitContext + *tc, + const struct GNUNET_MessageHeader + *msg) +{ + struct GNUNET_MessageHeader *m; + uint16_t size; + + size = ntohs (msg->size); + tc->buf = GNUNET_realloc (tc->buf, tc->total + size); + m = (struct GNUNET_MessageHeader *) &tc->buf[tc->total]; + tc->total += size; + memcpy (m, msg, size); +} + + /** * Execute a transmission context. If there is * an error in the transmission, the receive_done @@ -187,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 */