This is the mail archive of the cygwin mailing list for the Cygwin project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: cygstart getting The specified file was not found


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/


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]