Mail Archives: cygwin/2006/12/12/10:31:47
Corinna Vinschen wrote:
> On Dec 12 14:23, Michael Schaap wrote:
>
>> Corinna Vinschen wrote:
>>
>>> Does cygstart use CreateProcess and/or GetCurrentDirectory instead of
>>> fork/exec/getcwd?
>>>
>>> If so, cygstart will have to call cygwin_internal(CW_SYNC_WINENV) before
>>> using the native Windows functions.
>>>
>> No, it uses ShellExecute (see "cygstart --reference"). It does indeed
>> need to sync the environment, but it does this using its own code.
>> (Predates cygwin_internal(CW_SYNC_WINENV); I still need to change
>> cygstart some day to use it.)
>>
>
> ShellExecute is the same problem. With 1.7.0 you must use
> cygwin_internal(CW_SYNC_WINENV), when calling native Windows functions
> which have even vaguely to do with the current directory.
>
>
Indeed.
I had code to do that which precedes (and even inspired, I think)
cygwin_internal(CW_SYNC_WINENV), but that did not set the current
directory, the need for which, I guess, is a new thing.
>> However, this is unrelated to this problem, things go wrong long before
>> that. It appears that cygwin_conv_to_win32_path incorrectly determines
>> the current working directory.
>>
>> It is called as follows:
>>
>> cygwin_conv_to_win32_path(aPath, winPath);
>>
>> where aPath == "hello.txt".
>>
>> The current directory is "/cygdrive/c/user" =~ "c:\user", but
>> cygwin_conv_to_win32_path thinks that:
>>
>> normalize_posix_path: /cygdrive/c/WINDOWS/system32/hello.txt =
>> normalize_posix_path (hello.txt)
>>
>
> Hang on. cygwin_conv_to_win32_path does not translate the path into
> an absolute path, cygwin_conv_to_full_win32_path does that.
>
>
You're right. I was fooled by the strace output which seemed to suggest
that it did.
Indeed, the problem is not filename conversion, but the Windows current
directory.
(FWIW, the above strace output is now actually incorrect, prepending
/cygdrive/c/WINDOWS/system32/, instead of the POSIX current directory,
to the filename.)
> I'm running the following simple testcase(tm):
>
> #include <stdio.h>
> #include <sys/cygwin.h>
>
> int
> main (int argc, char **argv)
> {
> char buf[260];
>
> cygwin_conv_to_win32_path (argv[1], buf);
> puts (buf);
> cygwin_conv_to_full_win32_path (argv[1], buf);
> puts (buf);
> GetCurrentDirectory (260, buf);
> puts (buf);
> cygwin_internal (CW_SYNC_WINENV);
> GetCurrentDirectory (260, buf);
> puts (buf);
> return 0;
> }
>
> $ pwd
> /home/corinna/tests
> $ ./cyg_conv_to_w32 hello.txt
> hello.txt
> C:\home\corinna\tests\hello.txt
> C:\WINDOWS\system32
> C:\home\corinna\tests
>
> This shows you what happens. This is not a bug, but deliberately
> chosen. Use cygwin_internal(CW_SYNC_WINENV), please.
>
>
Yes, ma'am. :-)
I've been holding off for a while, since the old code did the job as
well, and still worked for older Cygwin versions that didn't have
cygwin_internal (CW_SYNC_WINENV), but I guess the time has come...
especially since the old code doesn't work anymore. ;-)
- Michael
--
Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple
Problem reports: http://cygwin.com/problems.html
Documentation: http://cygwin.com/docs.html
FAQ: http://cygwin.com/faq/
- Raw text -