From 16ef69d70a1c8d767ff690c5062a4837617da5d7 Mon Sep 17 00:00:00 2001 From: Martin Willi Date: Thu, 17 Jan 2013 15:16:03 +0100 Subject: Pass a constructor callback to create TNCCS server instances while dispatching --- src/libpttls/pt_tls_dispatcher.c | 16 ++++++++++++++-- src/libpttls/pt_tls_dispatcher.h | 9 +++++++-- src/libpttls/pt_tls_server.c | 15 +++++---------- src/libpttls/pt_tls_server.h | 6 +++++- 4 files changed, 31 insertions(+), 15 deletions(-) (limited to 'src/libpttls') diff --git a/src/libpttls/pt_tls_dispatcher.c b/src/libpttls/pt_tls_dispatcher.c index adcf5b4bf..fab44596c 100644 --- a/src/libpttls/pt_tls_dispatcher.c +++ b/src/libpttls/pt_tls_dispatcher.c @@ -45,6 +45,11 @@ struct private_pt_tls_dispatcher_t { * Server identity */ identification_t *server; + + /** + * TNCCS protocol handler constructor + */ + tnccs_t*(*create)(); }; /** @@ -106,11 +111,12 @@ static void cleanup(pt_tls_server_t *connection) } METHOD(pt_tls_dispatcher_t, dispatch, void, - private_pt_tls_dispatcher_t *this) + private_pt_tls_dispatcher_t *this, tnccs_t*(*create)()) { while (TRUE) { pt_tls_server_t *connection; + tnccs_t *tnccs; bool old; int fd; @@ -123,7 +129,13 @@ METHOD(pt_tls_dispatcher_t, dispatch, void, continue; } - connection = pt_tls_server_create(this->server, fd); + tnccs = create(); + if (!tnccs) + { + close(fd); + continue; + } + connection = pt_tls_server_create(this->server, fd, tnccs); if (!connection) { close(fd); diff --git a/src/libpttls/pt_tls_dispatcher.h b/src/libpttls/pt_tls_dispatcher.h index 463bd6cc8..5d01f7fef 100644 --- a/src/libpttls/pt_tls_dispatcher.h +++ b/src/libpttls/pt_tls_dispatcher.h @@ -24,6 +24,8 @@ #include #include +#include + typedef struct pt_tls_dispatcher_t pt_tls_dispatcher_t; /** @@ -34,9 +36,12 @@ struct pt_tls_dispatcher_t { /** * Dispatch and handle PT-TLS connections. * - * This call is blocking and a thread cancellation point. + * This call is blocking and a thread cancellation point. The passed + * constructor gets called for each dispatched connection. + * + * @param create TNCCS constructor function to use */ - void (*dispatch)(pt_tls_dispatcher_t *this); + void (*dispatch)(pt_tls_dispatcher_t *this, tnccs_t*(*create)()); /** * Destroy a pt_tls_dispatcher_t. diff --git a/src/libpttls/pt_tls_server.c b/src/libpttls/pt_tls_server.c index 2260d72ab..b525acb6f 100644 --- a/src/libpttls/pt_tls_server.c +++ b/src/libpttls/pt_tls_server.c @@ -18,8 +18,6 @@ #include -#include - typedef struct private_pt_tls_server_t private_pt_tls_server_t; /** @@ -221,12 +219,6 @@ METHOD(pt_tls_server_t, handle, status_t, return FAILED; } this->state = PT_TLS_SERVER_TNCCS; - this->tnccs = (tls_t*)tnc->tnccs->create_instance(tnc->tnccs, - TNCCS_2_0, TRUE); - if (!this->tnccs) - { - return FAILED; - } break; case PT_TLS_SERVER_TNCCS: if (!assess(this, (tls_t*)this->tnccs)) @@ -250,7 +242,7 @@ METHOD(pt_tls_server_t, get_fd, int, METHOD(pt_tls_server_t, destroy, void, private_pt_tls_server_t *this) { - DESTROY_IF(this->tnccs); + this->tnccs->destroy(this->tnccs); this->tls->destroy(this->tls); free(this); } @@ -258,7 +250,8 @@ METHOD(pt_tls_server_t, destroy, void, /** * See header */ -pt_tls_server_t *pt_tls_server_create(identification_t *server, int fd) +pt_tls_server_t *pt_tls_server_create(identification_t *server, int fd, + tnccs_t *tnccs) { private_pt_tls_server_t *this; @@ -270,10 +263,12 @@ pt_tls_server_t *pt_tls_server_create(identification_t *server, int fd) }, .state = PT_TLS_SERVER_VERSION, .tls = tls_socket_create(TRUE, server, NULL, fd, NULL), + .tnccs = (tls_t*)tnccs, ); if (!this->tls) { + this->tnccs->destroy(this->tnccs); free(this); return NULL; } diff --git a/src/libpttls/pt_tls_server.h b/src/libpttls/pt_tls_server.h index 0d952c440..244111b43 100644 --- a/src/libpttls/pt_tls_server.h +++ b/src/libpttls/pt_tls_server.h @@ -23,6 +23,8 @@ #include +#include + typedef struct pt_tls_server_t pt_tls_server_t; /** @@ -58,8 +60,10 @@ struct pt_tls_server_t { * * @param server TLS server identity * @param fd client connection socket + * @param tnccs inner TNCCS protocol handler to use for this connection * @return PT-TLS server */ -pt_tls_server_t *pt_tls_server_create(identification_t *server, int fd); +pt_tls_server_t *pt_tls_server_create(identification_t *server, int fd, + tnccs_t *tnccs); #endif /** PT_TLS_SERVER_H_ @}*/ -- cgit v1.2.3