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