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/



Reply via email to