From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 18389 invoked by alias); 5 Oct 2011 12:52:42 -0000 Received: (qmail 18326 invoked by uid 22791); 5 Oct 2011 12:52:17 -0000 X-Spam-Check-By: sourceware.org Received: from aquarius.hirmke.de (HELO calimero.vinschen.de) (217.91.18.234) by sourceware.org (qpsmtpd/0.83/v0.83-20-g38e4449) with ESMTP; Wed, 05 Oct 2011 12:52:00 +0000 Received: by calimero.vinschen.de (Postfix, from userid 500) id BC7622C00DB; Wed, 5 Oct 2011 14:51:57 +0200 (CEST) Date: Wed, 05 Oct 2011 12:52:00 -0000 From: Corinna Vinschen To: gdb-patches@sourceware.org Subject: Re: [RFA] testsuite: Add a test for passing of environment variables to inferior Message-ID: <20111005125157.GA24105@calimero.vinschen.de> Reply-To: gdb-patches@sourceware.org Mail-Followup-To: gdb-patches@sourceware.org References: <006301cc8292$367539b0$a35fad10$@muller@ics-cnrs.unistra.fr> <20111004134506.GB24369@calimero.vinschen.de> <000901cc82a4$dfba7cd0$9f2f7670$@muller@ics-cnrs.unistra.fr> <20111004151236.GC15757@calimero.vinschen.de> <003901cc82b0$471e3a00$d55aae00$@muller@ics-cnrs.unistra.fr> <20111005113941.GA13366@calimero.vinschen.de> <004401cc8357$74fd1c00$5ef75400$@muller@ics-cnrs.unistra.fr> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline In-Reply-To: <004401cc8357$74fd1c00$5ef75400$@muller@ics-cnrs.unistra.fr> User-Agent: Mutt/1.5.21 (2010-09-15) X-IsSubscribed: yes Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2011-10/txt/msg00133.txt.bz2 On Oct 5 14:08, Pierre Muller wrote: > Hi Corinna, > I didn't know about the charset problem... > > > Here's my proposal, based on your patch. I'll work on using the > > yet-to-be-created new cygwin_internal call after I implemented it in > > Cygwin. > > I think that your approach is OK, > I checked that it does also pass all > the tests in my gdb.base/testenv.exp > (11 passes instead of 7 passes/4 failures for current Cygwin GDB 7.3.50 20110821cvs). > > Your patch proposal thus supersedes mine. > > We just need an approval from Christopher Faylor... Right. Here's a new version of the patch which uses the new cygwin_internal(CW_CVT_ENV_TO_WINENV) which will be available starting with the next Cygwin 1.7.10. The patch allows to build GDB under older versions of Cygwin and it will fallback to the CW_SYNC_WINENV method if the cygwin_internal (CW_CVT_ENV_TO_WINENV) call returns with an error. That allows to run a GDB built under 1.7.10 to run under older Cygwin versions (provided all other DLL dependencies still work). Tested under Cygwin 1.7.9 and current CVS. Corinna * windows-nat.c: Include wchar.h to avoid compiler warnings. Include cygwin/version.h to get version information. (clear_win32_environment): New function for Cygwin to clear out Win32 environment. (windows_create_inferior): Prepare new environment from in_env for Cygwin, too. Use cygwin_internal (CW_CVT_ENV_TO_WINENV) call to get a Win32 copy of the desired POSIX environment if available, fall back to changing the GDB environment otherwise. Index: windows-nat.c =================================================================== RCS file: /cvs/src/src/gdb/windows-nat.c,v retrieving revision 1.219 diff -u -p -r1.219 windows-nat.c --- windows-nat.c 28 Sep 2011 09:07:54 -0000 1.219 +++ windows-nat.c 5 Oct 2011 12:47:40 -0000 @@ -40,7 +40,9 @@ #include #include #ifdef __CYGWIN__ +#include #include +#include #endif #include @@ -1963,6 +1965,28 @@ envvar_cmp (const void *a, const void *b } #endif +#ifdef __CYGWIN__ +static void +clear_win32_environment (char **env) +{ + int i; + size_t len; + wchar_t *copy = NULL, *equalpos; + + for (i = 0; env[i] && *env[i]; i++) + { + len = mbstowcs (NULL, env[i], 0) + 1; + copy = (wchar_t *) xrealloc (copy, len * sizeof (wchar_t)); + mbstowcs (copy, env[i], len); + equalpos = wcschr (copy, L'='); + if (equalpos) + *equalpos = L'\0'; + SetEnvironmentVariableW (copy, NULL); + } + xfree (copy); +} +#endif + /* Start an inferior windows child process and sets inferior_ptid to its pid. EXEC_FILE is the file to run. ALLARGS is a string containing the arguments to the program. @@ -1980,6 +2004,8 @@ windows_create_inferior (struct target_o cygwin_buf_t *toexec; cygwin_buf_t *cygallargs; cygwin_buf_t *args; + char **old_env; + PWCHAR w32_env; size_t len; int tty; int ostdin, ostdout, ostderr; @@ -2066,8 +2092,23 @@ windows_create_inferior (struct target_o strcat (args, cygallargs); #endif - /* Prepare the environment vars for CreateProcess. */ - cygwin_internal (CW_SYNC_WINENV); +#if CYGWIN_VERSION_API_MAJOR > 0 || CYGWIN_VERSION_API_MINOR >= 252 + /* First try to create a direct Win32 copy of the POSIX environment. */ + w32_env = (PWCHAR) cygwin_internal (CW_CVT_ENV_TO_WINENV, in_env); + if (w32_env != (PWCHAR) -1) + flags |= CREATE_UNICODE_ENVIRONMENT; + else + /* If that fails, fall back to old method tweaking GDB's environment. */ +#endif + { + /* Reset all Win32 environment variables to avoid leftover on next run. */ + clear_win32_environment (environ); + /* Prepare the environment vars for CreateProcess. */ + old_env = environ; + environ = in_env; + cygwin_internal (CW_SYNC_WINENV); + w32_env = NULL; + } if (!inferior_io_terminal) tty = ostdin = ostdout = ostderr = -1; @@ -2097,10 +2138,22 @@ windows_create_inferior (struct target_o NULL, /* thread */ TRUE, /* inherit handles */ flags, /* start flags */ - NULL, /* environment */ + w32_env, /* environment */ NULL, /* current directory */ &si, &pi); + if (w32_env) + /* Just free the Win32 environment, if it could be created. */ + free (w32_env); + else + { + /* Reset all environment variables to avoid leftover on next run. */ + clear_win32_environment (in_env); + /* Restore normal GDB environment variables. */ + environ = old_env; + cygwin_internal (CW_SYNC_WINENV); + } + if (tty >= 0) { close (tty); -- Corinna Vinschen Cygwin Project Co-Leader Red Hat