From eec1f2882e50adf46728f63390bb7f6989aedfa0 Mon Sep 17 00:00:00 2001 From: usa Date: Mon, 31 Jul 2006 08:09:01 +0000 Subject: * 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 --- ChangeLog | 15 +++++++++++++++ win32/win32.c | 49 ++++++++++++++++++++++++++++++------------------- 2 files changed, 45 insertions(+), 19 deletions(-) diff --git a/ChangeLog b/ChangeLog index 48e988b74e..f32e7943b2 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,18 @@ +Mon Jul 31 17:08:20 2006 NAKAMURA Usaku + + * 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] + Mon Jul 31 16:15:13 2006 Tanaka Akira * test/ruby/test_process.rb (TestProcess#test_rlimit_nofile): 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 -- cgit v1.2.3