TMP and TMPDIR mapping
Corinna Vinschen
corinna-cygwin@cygwin.com
Fri Jan 27 11:32:40 GMT 2023
On Jan 27 09:08, john daintree via Cygwin wrote:
> Hi Audrey.
>
> Here's an example of what's going on:
>
> >>: export TMPDIR=/cygdrive/c/tmp/jd
> >>: export TMPDIR2=/cygdrive/c/tmp/jd2
> >>: cmd.exe
> Microsoft Windows [Version 10.0.22621.1105]
> (c) Microsoft Corporation. All rights reserved.
>
> C:\>echo %TMPDIR%
> C:\tmp\jd
>
> C:\>echo %TMPDIR2%
> /cygdrive/c/tmp/jd2
>
> So, if I set TMPDIR and TMPDIR2 in bash, and then call cmd.exe then TMPDIR
> is changed to c:\tmp\jd but TMPDIR2 is left as /cygdrive/c/tmp/jd2
>
> I was hoping that there's something I can do to get the following in
> cmd.exe:
>
> C:\>echo %TMPDIR2%
> C:\tmp\jd2 # TMPDIR2 "mapped"
> to c:\.... in the same way that TMPDIR is
>
> I hope that's a clearer example.
>
> Note that the actual use case is calling other Win32 programs, and the
> environment variable name is different, but the above example is an attempt
> to simplify the repro.
> $PATH is mapped in a similar way. So I assume that there is a list of names
> which are mapped. I'd like to be able to add my own names to that list.
Easy: Don't call the affected Win32 executable directly. Call it
through a child process.
Two scenarios:
- Starting the nativ executable from a shell or a Makefile:
Create a wrapper script which calls
TMPDIR2="$(cygpath -wa ${TMPDIR2})
before calling your native app.
- Starting the nativ executable from your own process:
After fork(), call
const char *tmpdir2_old;
char *tmpdir2_new;
tmpdir2_old = getenv ("TMPDIR2");
tmpdir2_new = (char *) cygwin_create_path (CCP_POSIX_TO_WIN_A,
tmpdir2_old);
setenv ("TMPDIR2", tmpdir2_new, 1);
free (tmpdir2_new);
Then call execve or friends. Alternatively you can construct the
new environment like the above for any exec call taking an
environment as argument, i.e, execve, execle, execvpe.
Corinna
More information about the Cygwin
mailing list