xref: /netbsd-src/external/ibm-public/postfix/dist/src/global/ehlo_mask.c (revision f3cfa6f6ce31685c6c4a758bc430e69eb99f50a4)
1 /*	$NetBSD: ehlo_mask.c,v 1.2 2017/02/14 01:16:45 christos Exp $	*/
2 
3 /*++
4 /* NAME
5 /*	ehlo_mask 3
6 /* SUMMARY
7 /*	map EHLO keywords to bit mask
8 /* SYNOPSIS
9 /*	#include <ehlo_mask.h>
10 /*
11 /*	#define EHLO_MASK_8BITMIME	(1<<0)
12 /*	#define EHLO_MASK_PIPELINING	(1<<1)
13 /*	#define EHLO_MASK_SIZE		(1<<2)
14 /*	#define EHLO_MASK_VRFY		(1<<3)
15 /*	#define EHLO_MASK_ETRN		(1<<4)
16 /*	#define EHLO_MASK_AUTH		(1<<5)
17 /*	#define EHLO_MASK_VERP		(1<<6)
18 /*	#define EHLO_MASK_STARTTLS	(1<<7)
19 /*	#define EHLO_MASK_XCLIENT	(1<<8)
20 /*	#define EHLO_MASK_XFORWARD	(1<<9)
21 /*	#define EHLO_MASK_ENHANCEDSTATUSCODES	(1<<10)
22 /*	#define EHLO_MASK_DSN		(1<<11)
23 /*	#define EHLO_MASK_SMTPUTF8	(1<<12)
24 /*	#define EHLO_MASK_SILENT	(1<<15)
25 /*
26 /*	int	ehlo_mask(keyword_list)
27 /*	const char *keyword_list;
28 /*
29 /*	const char *str_ehlo_mask(bitmask)
30 /*	int	bitmask;
31 /* DESCRIPTION
32 /*	ehlo_mask() computes the bit-wise OR of the masks that correspond
33 /*	to the names listed in the \fIkeyword_list\fR argument, separated by
34 /*	comma and/or whitespace characters. Undefined names are silently
35 /*	ignored.
36 /*
37 /*	str_ehlo_mask() translates a mask into its equivalent names.
38 /*	The result is written to a static buffer that is overwritten
39 /*	upon each call. Undefined bits cause a fatal run-time error.
40 /* DIAGNOSTICS
41 /*	Fatal: str_ehlo_mask() found an undefined bit.
42 /* LICENSE
43 /* .ad
44 /* .fi
45 /*	The Secure Mailer license must be distributed with this software.
46 /* AUTHOR(S)
47 /*	Wietse Venema
48 /*	IBM T.J. Watson Research
49 /*	P.O. Box 704
50 /*	Yorktown Heights, NY 10598, USA
51 /*--*/
52 
53 /* System library.*/
54 
55 #include <sys_defs.h>
56 
57 /* Utility library. */
58 
59 #include <name_mask.h>
60 
61 /* Global library. */
62 
63 #include <ehlo_mask.h>
64 
65  /*
66   * The lookup table.
67   */
68 static const NAME_MASK ehlo_mask_table[] = {
69     "8BITMIME", EHLO_MASK_8BITMIME,
70     "AUTH", EHLO_MASK_AUTH,
71     "ETRN", EHLO_MASK_ETRN,
72     "PIPELINING", EHLO_MASK_PIPELINING,
73     "SIZE", EHLO_MASK_SIZE,
74     "VERP", EHLO_MASK_VERP,
75     "VRFY", EHLO_MASK_VRFY,
76     "XCLIENT", EHLO_MASK_XCLIENT,
77     "XFORWARD", EHLO_MASK_XFORWARD,
78     "STARTTLS", EHLO_MASK_STARTTLS,
79     "ENHANCEDSTATUSCODES", EHLO_MASK_ENHANCEDSTATUSCODES,
80     "DSN", EHLO_MASK_DSN,
81     "EHLO_MASK_SMTPUTF8", EHLO_MASK_SMTPUTF8,
82     "SILENT-DISCARD", EHLO_MASK_SILENT,	/* XXX In-band signaling */
83     0,
84 };
85 
86 /* ehlo_mask - string to bit mask */
87 
88 int     ehlo_mask(const char *mask_str)
89 {
90 
91     /*
92      * We allow "STARTTLS" besides "starttls, because EHLO keywords are often
93      * spelled in uppercase. We ignore non-existent EHLO keywords so people
94      * can switch between Postfix versions without trouble.
95      */
96     return (name_mask_opt("ehlo string mask", ehlo_mask_table,
97 			  mask_str, NAME_MASK_ANY_CASE | NAME_MASK_IGNORE));
98 }
99 
100 /* str_ehlo_mask - mask to string */
101 
102 const char *str_ehlo_mask(int mask_bits)
103 {
104 
105     /*
106      * We don't allow non-existent bits. Doing so makes no sense at this
107      * time.
108      */
109     return (str_name_mask("ehlo bitmask", ehlo_mask_table, mask_bits));
110 }
111 
112 #ifdef TEST
113 
114  /*
115   * Stand-alone test program.
116   */
117 #include <stdlib.h>
118 #include <vstream.h>
119 #include <vstring.h>
120 #include <vstring_vstream.h>
121 
122 int     main(int unused_argc, char **unused_argv)
123 {
124     int     mask_bits;
125     VSTRING *buf = vstring_alloc(1);
126     const char *mask_string;
127 
128     while (vstring_get_nonl(buf, VSTREAM_IN) != VSTREAM_EOF) {
129 	mask_bits = ehlo_mask(vstring_str(buf));
130 	mask_string = str_ehlo_mask(mask_bits);
131 	vstream_printf("%s -> 0x%x -> %s\n", vstring_str(buf), mask_bits,
132 		       mask_string);
133 	vstream_fflush(VSTREAM_OUT);
134     }
135     vstring_free(buf);
136     exit(0);
137 }
138 
139 #endif
140