diff options
author | Sterling Hughes <sterling@bumblebury.com> | 2001-07-12 01:57:28 +0000 |
---|---|---|
committer | Sterling Hughes <sterling@bumblebury.com> | 2001-07-12 01:57:28 +0000 |
commit | 45037a39aa7141510f6c6bcff65d102c65e6566e (patch) | |
tree | 4ea1de0d8a604c21fab41989b3579bc3934766f4 /lib | |
parent | 31336d63ae4479155a2fed861ac2ac38949a035c (diff) |
Add win32 initialization support to curl_global_init() and
curl_global_cleanup(). Update corresponding man pages...
Improve the logic in curl_global_cleanup() and curl_global_init() so that
they are not called twice if the application libraries have been
initialized and make sure to reset the init flags in curl_global_cleanup().
Diffstat (limited to 'lib')
-rw-r--r-- | lib/easy.c | 72 |
1 files changed, 70 insertions, 2 deletions
diff --git a/lib/easy.c b/lib/easy.c index 0099d6be1..876b4935e 100644 --- a/lib/easy.c +++ b/lib/easy.c @@ -78,27 +78,95 @@ #define _MPRINTF_REPLACE /* use our functions only */ #include <curl/mprintf.h> -/* true globals */ + +/* Silly win32 socket initialization functions */ + +#if defined(WIN32) && !defined(__GNUC__) || defined(__MINGW32__) +static void win32_cleanup(void) +{ + WSACleanup(); +} + +static CURLcode win32_init(void) +{ + WORD wVersionRequested; + WSADATA wsaData; + int err; + wVersionRequested = MAKEWORD(1, 1); + + err = WSAStartup(wVersionRequested, &wsaData); + + if (err != 0) + /* Tell the user that we couldn't find a useable */ + /* winsock.dll. */ + return CURLE_FAILED_INIT; + + /* Confirm that the Windows Sockets DLL supports 1.1.*/ + /* Note that if the DLL supports versions greater */ + /* than 1.1 in addition to 1.1, it will still return */ + /* 1.1 in wVersion since that is the version we */ + /* requested. */ + + if ( LOBYTE( wsaData.wVersion ) != 1 || + HIBYTE( wsaData.wVersion ) != 1 ) { + /* Tell the user that we couldn't find a useable */ + + /* winsock.dll. */ + WSACleanup(); + return CURLE_FAILED_INIT; + } + return CURLE_OK; +} +/* The Windows Sockets DLL is acceptable. Proceed. */ +#else +static CURLcode win32_init(void) { return CURLE_OK; } +#define win32_cleanup() +#endif + + +/* true globals -- for curl_global_init() and curl_global_cleanup() */ static unsigned int initialized = 0; static long init_flags = 0; +/** + * Globally initializes cURL given a bitwise set of + * the different features to initialize. + */ CURLcode curl_global_init(long flags) { - if(flags & CURL_GLOBAL_SSL) + if (initialized) + return CURLE_OK; + + if (flags & CURL_GLOBAL_SSL) Curl_SSL_init(); + if (flags & CURL_GLOBAL_WIN32) + if (win32_init() != CURLE_OK) + return CURLE_FAILED_INIT; + initialized = 1; init_flags = flags; return CURLE_OK; } +/** + * Globally cleanup cURL, uses the value of "init_flags" to determine + * what needs to be cleaned up and what doesn't + */ void curl_global_cleanup(void) { + if (!initialized) + return; + if (init_flags & CURL_GLOBAL_SSL) Curl_SSL_cleanup(); + if (init_flags & CURL_GLOBAL_WIN32) + win32_cleanup(); + initialized = 0; + init_flags = 0; } CURL *curl_easy_init(void) |