diff options
author | usa <usa@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2006-07-31 08:09:01 +0000 |
---|---|---|
committer | usa <usa@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2006-07-31 08:09:01 +0000 |
commit | eec1f2882e50adf46728f63390bb7f6989aedfa0 (patch) | |
tree | f8779784061d5ecb1d155b96d690b8004eeca7a7 /win32/win32.c | |
parent | 10fafb6c4bcc912074e15ce937b3fbbe329a65be (diff) |
* win32/win32.c (exit_handler): new function; release winsock and
environment work area.
* win32/win32.c (NTInitialize): setup exit_handler.
* win32/win32.c (StartSockets): use exit_handler.
exit handler.
* win32/win32.c (rb_w32_getenv): use GetEnvironmentStrings() instead
of GetEnvironmentVariable(), because the latter cannot distinguish
wheather a null environment variable exists or not.
fixed: [ruby-talk:205123]
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8@10651 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'win32/win32.c')
-rw-r--r-- | win32/win32.c | 49 |
1 files changed, 30 insertions, 19 deletions
diff --git a/win32/win32.c b/win32/win32.c index d4ece006ae..2cadc57ec5 100644 --- a/win32/win32.c +++ b/win32/win32.c @@ -367,6 +367,21 @@ static void invalid_parameter(const wchar_t *expr, const wchar_t *func, const wc } #endif +static BOOL fWinsock; +static char *envarea; +static void +exit_handler(void) +{ + if (fWinsock) { + WSACleanup(); + fWinsock = FALSE; + } + if (envarea) { + FreeEnvironmentStrings(envarea); + envarea = NULL; + } +} + // // Initialization stuff // @@ -392,6 +407,8 @@ NtInitialize(int *argc, char ***argv) tzset(); + atexit(exit_handler); + // Initialize Winsock StartSockets(); @@ -2020,7 +2037,7 @@ StartSockets () rb_fatal("could not find version 1 of winsock dll\n"); #endif /* USE_WINSOCK2 */ - atexit((void (*)(void)) WSACleanup); + fWinsock = TRUE; #ifndef USE_WINSOCK2 # ifndef SO_SYNCHRONOUS_NONALERT @@ -2852,28 +2869,22 @@ wait() char * rb_w32_getenv(const char *name) { - static char *curitem = NULL; - static DWORD curlen = 0; - DWORD needlen; + int len = strlen(name); + char *env; - if (curitem == NULL || curlen == 0) { - curlen = 512; - curitem = ALLOC_N(char, curlen); - } - - needlen = GetEnvironmentVariable(name, curitem, curlen); - if (needlen != 0) { - while (needlen > curlen) { - REALLOC_N(curitem, char, needlen); - curlen = needlen; - needlen = GetEnvironmentVariable(name, curitem, curlen); - } - } - else { + if (envarea) + FreeEnvironmentStrings(envarea); + envarea = GetEnvironmentStrings(); + if (!envarea) { + map_errno(GetLastError()); return NULL; } - return curitem; + for (env = envarea; *env; env += strlen(env) + 1) + if (strncasecmp(env, name, len) == 0 && *(env + len) == '=') + return env + len + 1; + + return NULL; } int |