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/