From 488e822c8d242760f3f47e10d7f071edee65923f Mon Sep 17 00:00:00 2001 From: Andreas Schneider Date: Mon, 17 May 2010 11:19:31 +0200 Subject: [PATCH] poll: Added a cleanup function to free the ws2_32 library. --- include/libssh/poll.h | 1 + include/libssh/socket.h | 1 + libssh/init.c | 1 + libssh/poll.c | 12 ++++++++++++ libssh/socket.c | 12 +++++++++++- 5 files changed, 26 insertions(+), 1 deletion(-) diff --git a/include/libssh/poll.h b/include/libssh/poll.h index 81891a13..e60d7664 100644 --- a/include/libssh/poll.h +++ b/include/libssh/poll.h @@ -77,6 +77,7 @@ typedef unsigned long int nfds_t; #endif /* HAVE_POLL */ void ssh_poll_init(void); +void ssh_poll_cleanup(void); int ssh_poll(ssh_pollfd_t *fds, nfds_t nfds, int timeout); typedef struct ssh_poll_ctx_struct *ssh_poll_ctx; typedef struct ssh_poll_handle_struct *ssh_poll_handle; diff --git a/include/libssh/socket.h b/include/libssh/socket.h index 9a2ee20d..ad838ac9 100644 --- a/include/libssh/socket.h +++ b/include/libssh/socket.h @@ -30,6 +30,7 @@ struct ssh_socket_struct; typedef struct ssh_socket_struct* ssh_socket; int ssh_socket_init(void); +void ssh_socket_cleanup(void); ssh_socket ssh_socket_new(ssh_session session); void ssh_socket_free(ssh_socket s); void ssh_socket_set_fd(ssh_socket s, socket_t fd); diff --git a/libssh/init.c b/libssh/init.c index 5725fef0..e1159feb 100644 --- a/libssh/init.c +++ b/libssh/init.c @@ -72,6 +72,7 @@ int ssh_finalize(void) { ssh_free_global_poll_ctx(); ssh_regex_finalize(); ssh_crypto_finalize(); + ssh_socket_cleanup(); #ifdef HAVE_LIBGCRYPT gcry_control(GCRYCTL_TERM_SECMEM); #elif defined HAVE_LIBCRYPTO diff --git a/libssh/poll.c b/libssh/poll.c index dc28b9b0..67671a09 100644 --- a/libssh/poll.c +++ b/libssh/poll.c @@ -67,6 +67,10 @@ void ssh_poll_init(void) { return; } +void ssh_poll_cleanup(void) { + return; +} + int ssh_poll(ssh_pollfd_t *fds, nfds_t nfds, int timeout) { return poll((struct pollfd *) fds, nfds, timeout); } @@ -217,6 +221,14 @@ void ssh_poll_init(void) { } } +void ssh_poll_cleanup(void) { + win_poll = bsd_poll; + + FreeLibrary(hlib); + + hlib = NULL; +} + int ssh_poll(ssh_pollfd_t *fds, nfds_t nfds, int timeout) { return win_poll(fds, nfds, timeout); } diff --git a/libssh/socket.c b/libssh/socket.c index 7c5a83f0..9350bcab 100644 --- a/libssh/socket.c +++ b/libssh/socket.c @@ -111,10 +111,20 @@ int ssh_socket_init(void) { return -1; } - ssh_poll_init(); #endif + ssh_poll_init(); + return 0; } + +/** + * @brief Cleanup the socket system. + */ +void ssh_socket_cleanup(void) { + ssh_poll_cleanup(); +} + + /** * \internal * \brief creates a new Socket object