122715Sdist /*
268839Seric  * Copyright (c) 1983, 1995 Eric P. Allman
362532Sbostic  * Copyright (c) 1988, 1993
462532Sbostic  *	The Regents of the University of California.  All rights reserved.
533731Sbostic  *
642829Sbostic  * %sccs.include.redist.c%
733731Sbostic  */
822715Sdist 
922715Sdist #ifndef lint
10*69652Seric static char sccsid[] = "@(#)sysexits.c	8.5 (Berkeley) 05/24/95";
1133731Sbostic #endif /* not lint */
1222715Sdist 
13*69652Seric #include <sendmail.h>
14297Seric 
15575Seric /*
1658669Seric **  SYSEXITS.C -- error messages corresponding to sysexits.h
1758669Seric **
1858669Seric **	If the first character of the string is a colon, interpolate
1958669Seric **	the current errno after the rest of the string.
2058669Seric */
2158669Seric 
2258669Seric char *SysExMsg[] =
2358669Seric {
2458669Seric 	/* 64 USAGE */		" 500 Bad usage",
2558669Seric 	/* 65 DATAERR */	" 501 Data format error",
2658669Seric 	/* 66 NOINPUT */	":550 Cannot open input",
2758669Seric 	/* 67 NOUSER */		" 550 User unknown",
2858669Seric 	/* 68 NOHOST */		" 550 Host unknown",
2958669Seric 	/* 69 UNAVAILABLE */	" 554 Service unavailable",
3058669Seric 	/* 70 SOFTWARE */	":554 Internal error",
3158669Seric 	/* 71 OSERR */		":451 Operating system error",
3258669Seric 	/* 72 OSFILE */		":554 System file missing",
3358669Seric 	/* 73 CANTCREAT */	":550 Can't create output",
3458669Seric 	/* 74 IOERR */		":451 I/O error",
3558669Seric 	/* 75 TEMPFAIL */	" 250 Deferred",
3658669Seric 	/* 76 PROTOCOL */	" 554 Remote protocol error",
3758669Seric 	/* 77 NOPERM */		":550 Insufficient permission",
3858669Seric 	/* 78 CONFIG */		" 554 Local configuration error",
39297Seric };
40297Seric 
4133930Sbostic int N_SysEx = sizeof(SysExMsg) / sizeof(SysExMsg[0]);
4268849Seric /*
4368849Seric **  DSNTOEXITSTAT -- convert DSN-style error code to EX_ style.
4468849Seric **
4568849Seric **	Parameters:
4668849Seric **		dsncode -- the text of the DSN-style code.
4768849Seric **
4868849Seric **	Returns:
4968849Seric **		The corresponding exit status.
5068849Seric */
5168849Seric 
5268849Seric int
dsntoexitstat(dsncode)5368849Seric dsntoexitstat(dsncode)
5468849Seric 	char *dsncode;
5568849Seric {
5668849Seric 	int code2, code3;
5768849Seric 
5868849Seric 	/* first the easy cases.... */
5968849Seric 	if (*dsncode == '2')
6068849Seric 		return EX_OK;
6168849Seric 	if (*dsncode == '4')
6268849Seric 		return EX_TEMPFAIL;
6368849Seric 
6468849Seric 	/* now decode the other two field parts */
6568849Seric 	if (*++dsncode == '.')
6668849Seric 		dsncode++;
6768849Seric 	code2 = atoi(dsncode);
6868849Seric 	while (*dsncode != '\0' && *dsncode != '.')
6968849Seric 		dsncode++;
7068849Seric 	if (*dsncode != '\0')
7168849Seric 		dsncode++;
7268849Seric 	code3 = atoi(dsncode);
7368849Seric 
7468849Seric 	/* and do a nested switch to work them out */
7568849Seric 	switch (code2)
7668849Seric 	{
7768849Seric 	  case 0:	/* Other or Undefined status */
7868849Seric 		return EX_UNAVAILABLE;
7968849Seric 
8068849Seric 	  case 1:	/* Address Status */
8168849Seric 		switch (code3)
8268849Seric 		{
8368849Seric 		  case 0:	/* Other Address Status */
8468849Seric 			return EX_DATAERR;
8568849Seric 
8668859Seric 		  case 1:	/* Bad destination mailbox address */
8768849Seric 		  case 6:	/* Mailbox has moved, No forwarding address */
8868849Seric 			return EX_NOUSER;
8968849Seric 
9068859Seric 		  case 2:	/* Bad destination system address */
9168859Seric 		  case 8:	/* Bad senders system address */
9268849Seric 			return EX_NOHOST;
9368849Seric 
9468859Seric 		  case 3:	/* Bad destination mailbox address syntax */
9568859Seric 		  case 7:	/* Bad senders mailbox address syntax */
9668849Seric 			return EX_USAGE;
9768849Seric 
9868859Seric 		  case 4:	/* Destination mailbox address ambiguous */
9968849Seric 			return EX_UNAVAILABLE;
10068849Seric 
10168859Seric 		  case 5:	/* Destination address valid */
10268849Seric 			return EX_OK;
10368849Seric 		}
10468849Seric 		break;
10568849Seric 
10668849Seric 	  case 2:	/* Mailbox Status */
10768849Seric 		switch (code3)
10868849Seric 		{
10968849Seric 		  case 0:	/* Other or Undefined mailbox status */
11068849Seric 		  case 1:	/* Mailbox disabled, not acccepting messages */
11168849Seric 		  case 2:	/* Mailbox full */
11268849Seric 		  case 4:	/* Mailing list expansion problem */
11368849Seric 			return EX_UNAVAILABLE;
11468849Seric 
11568849Seric 		  case 3:	/* Message length exceeds administrative lim */
11668849Seric 			return EX_DATAERR;
11768849Seric 		}
11868849Seric 		break;
11968849Seric 
12068849Seric 	  case 3:	/* System Status */
12168849Seric 		return EX_OSERR;
12268849Seric 
12368849Seric 	  case 4:	/* Network and Routing Status */
12468849Seric 		switch (code3)
12568849Seric 		{
12668849Seric 		  case 0:	/* Other or undefined network or routing stat */
12768849Seric 			return EX_IOERR;
12868849Seric 
12968849Seric 		  case 1:	/* No answer from host */
13068849Seric 		  case 3:	/* Routing server failure */
13168849Seric 		  case 5:	/* Network congestion */
13268849Seric 			return EX_TEMPFAIL;
13368849Seric 
13468849Seric 		  case 2:	/* Bad connection */
13568849Seric 			return EX_IOERR;
13668849Seric 
13768849Seric 		  case 4:	/* Unable to route */
13868849Seric 			return EX_PROTOCOL;
13968849Seric 
14068849Seric 		  case 6:	/* Routing loop detected */
14168849Seric 			return EX_CONFIG;
14268849Seric 
14368849Seric 		  case 7:	/* Delivery time expired */
14468849Seric 			return EX_UNAVAILABLE;
14568849Seric 		}
14668849Seric 		break;
14768849Seric 
14868849Seric 	  case 5:	/* Protocol Status */
14968849Seric 		return EX_PROTOCOL;
15068849Seric 
15168849Seric 	  case 6:	/* Message Content or Media Status */
15268849Seric 		return EX_UNAVAILABLE;
15368849Seric 
15468849Seric 	  case 7:	/* Security Status */
15568849Seric 		return EX_DATAERR;
15668849Seric 	}
15768849Seric 	return EX_CONFIG;
15868849Seric }
159