cygstart getting The specified file was not found

Michael Schaap cygwin@mscha.nl
Tue Dec 12 15:31:00 GMT 2006


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/



More information about the Cygwin mailing list