/*++ /* NAME /* ehlo_mask 3 /* SUMMARY /* map EHLO keywords to bit mask /* SYNOPSIS /* #include /* /* #define EHLO_MASK_8BITMIME (1<<0) /* #define EHLO_MASK_PIPELINING (1<<1) /* #define EHLO_MASK_SIZE (1<<2) /* #define EHLO_MASK_VRFY (1<<3) /* #define EHLO_MASK_ETRN (1<<4) /* #define EHLO_MASK_AUTH (1<<5) /* #define EHLO_MASK_VERP (1<<6) /* #define EHLO_MASK_STARTTLS (1<<7) /* #define EHLO_MASK_XCLIENT (1<<8) /* #define EHLO_MASK_XFORWARD (1<<9) /* #define EHLO_MASK_ENHANCEDSTATUSCODES (1<<10) /* #define EHLO_MASK_DSN (1<<11) /* #define EHLO_MASK_SMTPUTF8 (1<<12) /* #define EHLO_MASK_CHUNKING (1<<13) /* #define EHLO_MASK_SILENT (1<<15) /* /* int ehlo_mask(keyword_list) /* const char *keyword_list; /* /* const char *str_ehlo_mask(bitmask) /* int bitmask; /* DESCRIPTION /* ehlo_mask() computes the bit-wise OR of the masks that correspond /* to the names listed in the \fIkeyword_list\fR argument, separated by /* comma and/or whitespace characters. Undefined names are silently /* ignored. /* /* str_ehlo_mask() translates a mask into its equivalent names. /* The result is written to a static buffer that is overwritten /* upon each call. Undefined bits cause a fatal run-time error. /* DIAGNOSTICS /* Fatal: str_ehlo_mask() found an undefined bit. /* LICENSE /* .ad /* .fi /* The Secure Mailer license must be distributed with this software. /* AUTHOR(S) /* Wietse Venema /* IBM T.J. Watson Research /* P.O. Box 704 /* Yorktown Heights, NY 10598, USA /* /* Wietse Venema /* Google, Inc. /* 111 8th Avenue /* New York, NY 10011, USA /*--*/ /* System library.*/ #include /* Utility library. */ #include /* Global library. */ #include /* * The lookup table. */ static const NAME_MASK ehlo_mask_table[] = { "8BITMIME", EHLO_MASK_8BITMIME, "AUTH", EHLO_MASK_AUTH, "ETRN", EHLO_MASK_ETRN, "PIPELINING", EHLO_MASK_PIPELINING, "SIZE", EHLO_MASK_SIZE, "VERP", EHLO_MASK_VERP, "VRFY", EHLO_MASK_VRFY, "XCLIENT", EHLO_MASK_XCLIENT, "XFORWARD", EHLO_MASK_XFORWARD, "STARTTLS", EHLO_MASK_STARTTLS, "ENHANCEDSTATUSCODES", EHLO_MASK_ENHANCEDSTATUSCODES, "DSN", EHLO_MASK_DSN, "EHLO_MASK_SMTPUTF8", EHLO_MASK_SMTPUTF8, "SMTPUTF8", EHLO_MASK_SMTPUTF8, "CHUNKING", EHLO_MASK_CHUNKING, "SILENT-DISCARD", EHLO_MASK_SILENT, /* XXX In-band signaling */ 0, }; /* ehlo_mask - string to bit mask */ int ehlo_mask(const char *mask_str) { /* * We allow "STARTTLS" besides "starttls, because EHLO keywords are often * spelled in uppercase. We ignore non-existent EHLO keywords so people * can switch between Postfix versions without trouble. */ return (name_mask_opt("ehlo string mask", ehlo_mask_table, mask_str, NAME_MASK_ANY_CASE | NAME_MASK_IGNORE)); } /* str_ehlo_mask - mask to string */ const char *str_ehlo_mask(int mask_bits) { /* * We don't allow non-existent bits. Doing so makes no sense at this * time. */ return (str_name_mask("ehlo bitmask", ehlo_mask_table, mask_bits)); } #ifdef TEST /* * Stand-alone test program. */ #include #include #include #include int main(int unused_argc, char **unused_argv) { int mask_bits; VSTRING *buf = vstring_alloc(1); const char *mask_string; while (vstring_get_nonl(buf, VSTREAM_IN) != VSTREAM_EOF) { mask_bits = ehlo_mask(vstring_str(buf)); mask_string = str_ehlo_mask(mask_bits); vstream_printf("%s -> 0x%x -> %s\n", vstring_str(buf), mask_bits, mask_string); vstream_fflush(VSTREAM_OUT); } vstring_free(buf); exit(0); } #endif