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