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: cygwin1.dll exit status


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/


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