aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/libstrongswan/networking/streams/stream_service.c3
-rw-r--r--src/libstrongswan/networking/streams/stream_service.h6
2 files changed, 5 insertions, 4 deletions
diff --git a/src/libstrongswan/networking/streams/stream_service.c b/src/libstrongswan/networking/streams/stream_service.c
index 7eaca86be..1b06e1eb1 100644
--- a/src/libstrongswan/networking/streams/stream_service.c
+++ b/src/libstrongswan/networking/streams/stream_service.c
@@ -124,8 +124,7 @@ static job_requeue_t accept_async(async_data_t *data)
if (stream)
{
thread_cleanup_push((void*)stream->destroy, stream);
- data->cb(data->data, stream);
- thread_cleanup_pop(TRUE);
+ thread_cleanup_pop(!data->cb(data->data, stream));
}
return JOB_REQUEUE_NONE;
}
diff --git a/src/libstrongswan/networking/streams/stream_service.h b/src/libstrongswan/networking/streams/stream_service.h
index 27ef79148..c8faba323 100644
--- a/src/libstrongswan/networking/streams/stream_service.h
+++ b/src/libstrongswan/networking/streams/stream_service.h
@@ -39,12 +39,14 @@ typedef stream_service_t*(*stream_service_constructor_t)(char *uri, int backlog)
/**
* Service callback routine for accepting client connections.
*
- * The passed stream_service gets closed/destroyed by the callback caller.
+ * The passed stream gets closed/destroyed by the callback caller, unless
+ * TRUE is returned.
*
* @param data user data, as passed during registration
* @param stream accept()ed client connection
+ * @return TRUE to keep stream alive, FALSE to destroy it
*/
-typedef void (*stream_service_cb_t)(void *data, stream_t *stream);
+typedef bool (*stream_service_cb_t)(void *data, stream_t *stream);
/**
* A service accepting client connection streams.