diff options
author | Bill Hoffman <bill.hoffman@kitware.com> | 2008-09-23 16:32:06 (GMT) |
---|---|---|
committer | Bill Hoffman <bill.hoffman@kitware.com> | 2008-09-23 16:32:06 (GMT) |
commit | dd92d9ec38232dfc80b4fff804a0960d23ccc227 (patch) | |
tree | bfa3747b1e62ff8d2dd671200f6c88cf1784fb6b /Utilities/cmcurl-7.19.0/docs/examples/opensslthreadlock.c | |
parent | 5778b6efe98e3676e00f01cfeca62bd9b2b481b5 (diff) | |
download | CMake-dd92d9ec38232dfc80b4fff804a0960d23ccc227.zip CMake-dd92d9ec38232dfc80b4fff804a0960d23ccc227.tar.gz CMake-dd92d9ec38232dfc80b4fff804a0960d23ccc227.tar.bz2 |
ENH: import of new curl version
Diffstat (limited to 'Utilities/cmcurl-7.19.0/docs/examples/opensslthreadlock.c')
-rw-r--r-- | Utilities/cmcurl-7.19.0/docs/examples/opensslthreadlock.c | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/Utilities/cmcurl-7.19.0/docs/examples/opensslthreadlock.c b/Utilities/cmcurl-7.19.0/docs/examples/opensslthreadlock.c new file mode 100644 index 0000000..18a2f77 --- /dev/null +++ b/Utilities/cmcurl-7.19.0/docs/examples/opensslthreadlock.c @@ -0,0 +1,82 @@ +/***************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * $Id$ + * + * Example source code to show one way to set the necessary OpenSSL locking + * callbacks if you want to do multi-threaded transfers with HTTPS/FTPS with + * libcurl built to use OpenSSL. + * + * This is not a complete stand-alone example. + * + * Author: Jeremy Brown + */ + + +#include <stdio.h> +#include <pthread.h> +#include <openssl/err.h> + +#define MUTEX_TYPE pthread_mutex_t +#define MUTEX_SETUP(x) pthread_mutex_init(&(x), NULL) +#define MUTEX_CLEANUP(x) pthread_mutex_destroy(&(x)) +#define MUTEX_LOCK(x) pthread_mutex_lock(&(x)) +#define MUTEX_UNLOCK(x) pthread_mutex_unlock(&(x)) +#define THREAD_ID pthread_self( ) + + +void handle_error(const char *file, int lineno, const char *msg){ + fprintf(stderr, "** %s:%d %s\n", file, lineno, msg); + ERR_print_errors_fp(stderr); + /* exit(-1); */ + } + +/* This array will store all of the mutexes available to OpenSSL. */ +static MUTEX_TYPE *mutex_buf= NULL; + + +static void locking_function(int mode, int n, const char * file, int line) +{ + if (mode & CRYPTO_LOCK) + MUTEX_LOCK(mutex_buf[n]); + else + MUTEX_UNLOCK(mutex_buf[n]); +} + +static unsigned long id_function(void) +{ + return ((unsigned long)THREAD_ID); +} + +int thread_setup(void) +{ + int i; + + mutex_buf = (MUTEX_TYPE *)malloc(CRYPTO_num_locks( ) * sizeof(MUTEX_TYPE)); + if (!mutex_buf) + return 0; + for (i = 0; i < CRYPTO_num_locks( ); i++) + MUTEX_SETUP(mutex_buf[i]); + CRYPTO_set_id_callback(id_function); + CRYPTO_set_locking_callback(locking_function); + return 1; +} + +int thread_cleanup(void) +{ + int i; + + if (!mutex_buf) + return 0; + CRYPTO_set_id_callback(NULL); + CRYPTO_set_locking_callback(NULL); + for (i = 0; i < CRYPTO_num_locks( ); i++) + MUTEX_CLEANUP(mutex_buf[i]); + free(mutex_buf); + mutex_buf = NULL; + return 1; +} |