/*
 * Copyright (c) 2005 Sendmail, Inc. and its suppliers.
 *	All rights reserved.
 *
 * By using this file, you agree to the terms and conditions set
 * forth in the LICENSE file which can be found at the top level of
 * the sendmail distribution.
 */

#include "sm/generic.h"
SM_RCSID("@(#)$Id: childstatus.c,v 1.2 2007/09/29 02:15:43 ca Exp $")

#include "sm/types.h"
#include "sm/signal.h"
#include "sm/wait.h"
#include "sm/sysexits.h"

/*
**  SM_CHILD_STATUS -- decode child status
**
**	Parameters:
**		status -- return status (achieved via wait())
**
**	Returns:
**		type of failure (see wait.h)
*/

int
sm_child_status(int status)
{
	int k, failtype;

	/* default return value */
	failtype = SM_FAILED_IGNORE;
	if (status == 0)
		return failtype;
	if (WIFEXITED(status))
	{
		k = WEXITSTATUS(status);
		switch (k)
		{
		  /* don't count these as failures */
		  case EX_DATAERR:
		  case EX_NOINPUT:
		  case EX_NOUSER:
		  case EX_NOHOST:
		  case EX_OSERR:
		  case EX_OSFILE:
		  case EX_CANTCREAT:
		  case EX_IOERR:
		  case EX_TEMPFAIL:
		  case EX_PROTOCOL:
			break;

		  /* don't try to restart on these errors */
		  case EX_USAGE:
		  case EX_CONFIG:
			failtype = SM_FAILED_STOP;
			break;
		  case EX_RESTARTDEP:
			failtype = SM_FAILED_RESTARTDEP;
			break;
		  case EX_RESTARTALL:
			failtype = SM_FAILED_RESTARTALL;
			break;
		  default:
			failtype = SM_FAILED_COUNT;
			break;
		}
	}
	else if (WIFSIGNALED(status))
	{
		k = WTERMSIG(status);
		switch (k)
		{
		  /* don't count these as failures */
		  case SIGHUP:
		  case SIGINT:
		  case SIGPIPE:
			break;
		  default:
			failtype = SM_FAILED_COUNT;
			break;
		}
	}
	return failtype;
}


syntax highlighted by Code2HTML, v. 0.9.1