Mail Archives: cygwin/2005/03/09/09:54:20
> At 09:30 AM 3/7/2005, you wrote:
>
>>The latest version of cygwin1.dll ("cygwin1.dll" v0.0 ts=2005/3/1 11:01) does not return the correct exit status when a Cygwin application is called from Windows. Older versions such as ("cygwin1.dll" v0.0 ts=2004/11/10 8:34) do.
>>
>>
>>Example:
>>
>>Create the bash script - error4.sh
>>-------------------------------------------------
>>#
>># simple script to return the exit status of 4
>>#
>>exit 4
>>-------------------------------------------------
>>
>>The from the Windows command prompt run the following:
>>
>>C:\TMP> bash error4.sh
>>C:\TMP> echo %errorlevel%
>>
>>For an older cygwin1.dll the output is:
>>4
>>
>>For the newest cygwin1.dll the output is:
>>1024
>
>
>
> See <http://sources.redhat.com/ml/cygwin/2005-01/msg01382.html>. Also
> look at the similar thread about this same issue last week:
> <http://sourceware.org/ml/cygwin/2005-03/msg00088.html>. This is all
> as-designed/as-intended.
>
>
>
> --
> Larry Hall http://www.rfk.com
> RFK Partners, Inc. (508) 893-9779 - RFK Office
> 838 Washington Street (508) 893-9889 - FAX
> Holliston, MA 01746
>
>
Thank you that was exactly the problem. To "fix it" for returning an
expected status to a Windows program I wrote a wrapper utility which
calls a CYGWIN program and fixes the exit status. This program works
with old and new CYGWIN and Non-CYGWIN programs.
Two very big caveats:
1) build this utility with non-CYGWIN tools such as Visual C++, Borland
or MinGW so its exit status is not broken.
2) the path of the executable must not contain any spaces.
I hope this utility helps others.
-Zevel
------------------------ File: FixStatus.cpp -------------------------
//
// Utility to fix exit status from CYGWIN programs.
//
// If status passed on command line is greater than 255,
// then use high byte as status
//
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char** argv)
{
bool bVerbose = false;
int nStatus = 0;
int ac = 1;
char szCommand[4096] = {0};
int nIndex;
while(ac < argc)
{
char* av = argv[ac++];
if(*av == '-')
{ // option
switch(av[1])
{
default:
printf("Invalid option: %s\n", av);
/*FALLTHROUGH*/
case '?':
case 'h':
printf("Usage: FixStatus [-h] command [arguments]\n");
exit(0);
}
}
else
{ // first argument is executable - copy to command buffer
nIndex = sprintf(szCommand, av);
break;
}
}
while(ac < argc)
{ // build up command line by quoting other arguments
nIndex += sprintf(szCommand + nIndex, " \"%s\"", argv[ac++]);
}
nStatus = system(szCommand);
if(nStatus >= 256)
{ // need to fix status from new CYGWIN
nStatus >>= 8;
}
nStatus &= 0x00ff;
exit(nStatus);
return(0); // to quiet compiler
}
--
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 -