From 2c1e75c6dddcba773349971229f2e8fdbfd72f59 Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Thu, 6 Oct 2011 08:58:04 +0000 Subject: [PATCH] vminko: new API to delete a TransmitContext (slightly modified patch from #1822) --- src/include/gnunet_server_lib.h | 24 +++++++++++++++---- src/util/server_tc.c | 41 +++++++++++++++++++++++---------- 2 files changed, 49 insertions(+), 16 deletions(-) diff --git a/src/include/gnunet_server_lib.h b/src/include/gnunet_server_lib.h index f03d9625d..5289a6270 100644 --- a/src/include/gnunet_server_lib.h +++ b/src/include/gnunet_server_lib.h @@ -463,10 +463,9 @@ GNUNET_SERVER_transmit_context_append_message (struct /** - * Execute a transmission context. If there is - * an error in the transmission, the receive_done - * method will be called with an error code (GNUNET_SYSERR), - * otherwise with GNUNET_OK. + * Execute a transmission context. If there is an error in the + * transmission, the receive_done method will be called with an error + * code (GNUNET_SYSERR), otherwise with GNUNET_OK. * * @param tc transmission context to use * @param timeout when to time out and abort the transmission @@ -476,6 +475,23 @@ GNUNET_SERVER_transmit_context_run (struct GNUNET_SERVER_TransmitContext *tc, struct GNUNET_TIME_Relative timeout); +/** + * 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); + /** * The notification context is the key datastructure for a conveniance diff --git a/src/util/server_tc.c b/src/util/server_tc.c index 127131032..5e9a9e946 100644 --- a/src/util/server_tc.c +++ b/src/util/server_tc.c @@ -82,10 +82,7 @@ transmit_response (void *cls, size_t size, void *buf) if (buf == NULL) { - GNUNET_SERVER_receive_done (tc->client, GNUNET_SYSERR); - GNUNET_SERVER_client_drop (tc->client); - GNUNET_free_non_null (tc->buf); - GNUNET_free (tc); + GNUNET_SERVER_transmit_context_destroy (tc, GNUNET_SYSERR); return 0; } if (tc->total - tc->off > size) @@ -96,6 +93,7 @@ transmit_response (void *cls, size_t size, void *buf) tc->off += msize; if (tc->total == tc->off) { + GNUNET_SERVER_receive_done (tc->client, GNUNET_OK); GNUNET_SERVER_client_drop (tc->client); GNUNET_free_non_null (tc->buf); @@ -112,10 +110,7 @@ transmit_response (void *cls, size_t size, void *buf) tc)) { GNUNET_break (0); - GNUNET_SERVER_receive_done (tc->client, GNUNET_SYSERR); - GNUNET_SERVER_client_drop (tc->client); - GNUNET_free_non_null (tc->buf); - GNUNET_free (tc); + GNUNET_SERVER_transmit_context_destroy (tc, GNUNET_SYSERR); } } return msize; @@ -219,11 +214,33 @@ GNUNET_SERVER_transmit_context_run (struct GNUNET_SERVER_TransmitContext *tc, &transmit_response, tc)) { GNUNET_break (0); - GNUNET_SERVER_receive_done (tc->client, GNUNET_SYSERR); - GNUNET_SERVER_client_drop (tc->client); - GNUNET_free_non_null (tc->buf); - GNUNET_free (tc); + 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 */ -- 2.25.1