allow error mailer to take DSN status code
[unix-history] / usr / src / usr.sbin / sendmail / src / sysexits.c
/*
* Copyright (c) 1983, 1995 Eric P. Allman
* Copyright (c) 1988, 1993
* The Regents of the University of California. All rights reserved.
*
* %sccs.include.redist.c%
*/
#ifndef lint
static char sccsid[] = "@(#)sysexits.c 8.3 (Berkeley) %G%";
#endif /* not lint */
#include <sysexits.h>
/*
** SYSEXITS.C -- error messages corresponding to sysexits.h
**
** If the first character of the string is a colon, interpolate
** the current errno after the rest of the string.
*/
char *SysExMsg[] =
{
/* 64 USAGE */ " 500 Bad usage",
/* 65 DATAERR */ " 501 Data format error",
/* 66 NOINPUT */ ":550 Cannot open input",
/* 67 NOUSER */ " 550 User unknown",
/* 68 NOHOST */ " 550 Host unknown",
/* 69 UNAVAILABLE */ " 554 Service unavailable",
/* 70 SOFTWARE */ ":554 Internal error",
/* 71 OSERR */ ":451 Operating system error",
/* 72 OSFILE */ ":554 System file missing",
/* 73 CANTCREAT */ ":550 Can't create output",
/* 74 IOERR */ ":451 I/O error",
/* 75 TEMPFAIL */ " 250 Deferred",
/* 76 PROTOCOL */ " 554 Remote protocol error",
/* 77 NOPERM */ ":550 Insufficient permission",
/* 78 CONFIG */ " 554 Local configuration error",
};
int N_SysEx = sizeof(SysExMsg) / sizeof(SysExMsg[0]);
\f/*
** DSNTOEXITSTAT -- convert DSN-style error code to EX_ style.
**
** Parameters:
** dsncode -- the text of the DSN-style code.
**
** Returns:
** The corresponding exit status.
*/
int
dsntoexitstat(dsncode)
char *dsncode;
{
int code2, code3;
/* first the easy cases.... */
if (*dsncode == '2')
return EX_OK;
if (*dsncode == '4')
return EX_TEMPFAIL;
/* now decode the other two field parts */
if (*++dsncode == '.')
dsncode++;
code2 = atoi(dsncode);
while (*dsncode != '\0' && *dsncode != '.')
dsncode++;
if (*dsncode != '\0')
dsncode++;
code3 = atoi(dsncode);
/* and do a nested switch to work them out */
switch (code2)
{
case 0: /* Other or Undefined status */
return EX_UNAVAILABLE;
case 1: /* Address Status */
switch (code3)
{
case 0: /* Other Address Status */
return EX_DATAERR;
case 1: /* Bad mailbox address */
case 6: /* Mailbox has moved, No forwarding address */
return EX_NOUSER;
case 2: /* Bad system address */
return EX_NOHOST;
case 3: /* Bad mailbox address syntax */
return EX_USAGE;
case 4: /* Mailbox address ambiguous */
return EX_UNAVAILABLE;
case 5: /* Address valid */
return EX_OK;
}
break;
case 2: /* Mailbox Status */
switch (code3)
{
case 0: /* Other or Undefined mailbox status */
case 1: /* Mailbox disabled, not acccepting messages */
case 2: /* Mailbox full */
case 4: /* Mailing list expansion problem */
return EX_UNAVAILABLE;
case 3: /* Message length exceeds administrative lim */
return EX_DATAERR;
}
break;
case 3: /* System Status */
return EX_OSERR;
case 4: /* Network and Routing Status */
switch (code3)
{
case 0: /* Other or undefined network or routing stat */
return EX_IOERR;
case 1: /* No answer from host */
case 3: /* Routing server failure */
case 5: /* Network congestion */
return EX_TEMPFAIL;
case 2: /* Bad connection */
return EX_IOERR;
case 4: /* Unable to route */
return EX_PROTOCOL;
case 6: /* Routing loop detected */
return EX_CONFIG;
case 7: /* Delivery time expired */
return EX_UNAVAILABLE;
}
break;
case 5: /* Protocol Status */
return EX_PROTOCOL;
case 6: /* Message Content or Media Status */
return EX_UNAVAILABLE;
case 7: /* Security Status */
return EX_DATAERR;
}
return EX_CONFIG;
}