xref: /netbsd-src/external/ibm-public/postfix/dist/src/global/cleanup_strerror.c (revision 67b9b338a7386232ac596b5fd0cd5a9cc8a03c71)
1 /*	$NetBSD: cleanup_strerror.c,v 1.2 2022/10/08 16:12:45 christos Exp $	*/
2 
3 /*++
4 /* NAME
5 /*	cleanup_strerror 3
6 /* SUMMARY
7 /*	cleanup status code to string
8 /* SYNOPSIS
9 /*	#include <cleanup_user.h>
10 /*
11 /*	typedef struct {
12 /* .in +4
13 /*	    const unsigned status;	/* cleanup status */
14 /*	    const int smtp;	/* RFC 821 */
15 /*	    const char *dsn;	/* RFC 3463 */
16 /*	    const char *text;	/* free text */
17 /* .in -4
18 /*	} CLEANUP_STAT_DETAIL;
19 /*
20 /*	const char *cleanup_strerror(code)
21 /*	int	code;
22 /*
23 /*	const CLEANUP_STAT_DETAIL *cleanup_stat_detail(code)
24 /*	int	code;
25 /* DESCRIPTION
26 /*	cleanup_strerror() maps a status code returned by the \fIcleanup\fR
27 /*	service to printable string.
28 /*	The result is for read purposes only.
29 /*
30 /*	cleanup_stat_detail() returns a pointer to structure with
31 /*	assorted information.
32 /* DIAGNOSTICS:
33 /*	Panic: unknown status.
34 /* LICENSE
35 /* .ad
36 /* .fi
37 /*	The Secure Mailer license must be distributed with this software.
38 /* AUTHOR(S)
39 /*	Wietse Venema
40 /*	IBM T.J. Watson Research
41 /*	P.O. Box 704
42 /*	Yorktown Heights, NY 10598, USA
43 /*
44 /*	Wietse Venema
45 /*	Google, Inc.
46 /*	111 8th Avenue
47 /*	New York, NY 10011, USA
48 /*--*/
49 
50 /* System library. */
51 
52 #include <sys_defs.h>
53 
54 /* Utility library. */
55 
56 #include <vstring.h>
57 #include <msg.h>
58 
59 /* Global library. */
60 
61 #include <cleanup_user.h>
62 
63  /*
64   * Mapping from status code to printable string. One message may suffer from
65   * multiple errors, to it is important to list the most severe errors first,
66   * because cleanup_strerror() can report only one error.
67   */
68 static const CLEANUP_STAT_DETAIL cleanup_stat_map[] = {
69     CLEANUP_STAT_DEFER, 451, "4.7.1", "service unavailable",
70     CLEANUP_STAT_PROXY, 451, "4.3.0", "queue file write error",
71     CLEANUP_STAT_BAD, 451, "4.3.0", "internal protocol error",
72     CLEANUP_STAT_RCPT, 550, "5.1.0", "no recipients specified",
73     CLEANUP_STAT_HOPS, 554, "5.4.0", "too many hops",
74     CLEANUP_STAT_SIZE, 552, "5.3.4", "message file too big",
75     CLEANUP_STAT_CONT, 550, "5.7.1", "message content rejected",
76     CLEANUP_STAT_WRITE, 451, "4.3.0", "queue file write error",
77     CLEANUP_STAT_NOPERM, 550, "5.7.1", "service denied",
78 };
79 
80 static CLEANUP_STAT_DETAIL cleanup_stat_success = {
81     CLEANUP_STAT_OK, 250, "2.0.0", "Success",
82 };
83 
84 /* cleanup_strerror - map status code to printable string */
85 
cleanup_strerror(unsigned status)86 const char *cleanup_strerror(unsigned status)
87 {
88     unsigned i;
89 
90     if (status == CLEANUP_STAT_OK)
91 	return ("Success");
92 
93     for (i = 0; i < sizeof(cleanup_stat_map) / sizeof(cleanup_stat_map[0]); i++)
94 	if (cleanup_stat_map[i].status & status)
95 	    return (cleanup_stat_map[i].text);
96 
97     msg_panic("cleanup_strerror: unknown status %u", status);
98 }
99 
100 /* cleanup_stat_detail - map status code to table entry with assorted data */
101 
cleanup_stat_detail(unsigned status)102 const CLEANUP_STAT_DETAIL *cleanup_stat_detail(unsigned status)
103 {
104     unsigned i;
105 
106     if (status == CLEANUP_STAT_OK)
107 	return (&cleanup_stat_success);
108 
109     for (i = 0; i < sizeof(cleanup_stat_map) / sizeof(cleanup_stat_map[0]); i++)
110 	if (cleanup_stat_map[i].status & status)
111 	    return (cleanup_stat_map + i);
112 
113     msg_panic("cleanup_stat_detail: unknown status %u", status);
114 }
115