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