Postfix3.3.1
cleanup_strflags.c
[詳解]
1 /*++
2 /* NAME
3 /* cleanup_strflags 3
4 /* SUMMARY
5 /* cleanup flags code to string
6 /* SYNOPSIS
7 /* #include <cleanup_user.h>
8 /*
9 /* const char *cleanup_strflags(code)
10 /* int code;
11 /* DESCRIPTION
12 /* cleanup_strflags() maps a CLEANUP_FLAGS code to printable string.
13 /* The result is for read purposes only. The result is overwritten
14 /* upon each call.
15 /* LICENSE
16 /* .ad
17 /* .fi
18 /* The Secure Mailer license must be distributed with this software.
19 /* AUTHOR(S)
20 /* Wietse Venema
21 /* IBM T.J. Watson Research
22 /* P.O. Box 704
23 /* Yorktown Heights, NY 10598, USA
24 /*--*/
25 
26 /* System library. */
27 
28 #include <sys_defs.h>
29 
30 /* Utility library. */
31 
32 #include <msg.h>
33 #include <vstring.h>
34 
35 /* Global library. */
36 
37 #include "cleanup_user.h"
38 
39  /*
40  * Mapping from flags code to printable string.
41  */
43  unsigned flag;
44  const char *text;
45 };
46 
47 static struct cleanup_flag_map cleanup_flag_map[] = {
48  CLEANUP_FLAG_BOUNCE, "enable_bad_mail_bounce",
49  CLEANUP_FLAG_FILTER, "enable_header_body_filter",
50  CLEANUP_FLAG_HOLD, "hold_message",
51  CLEANUP_FLAG_DISCARD, "discard_message",
52  CLEANUP_FLAG_BCC_OK, "enable_automatic_bcc",
53  CLEANUP_FLAG_MAP_OK, "enable_address_mapping",
54  CLEANUP_FLAG_MILTER, "enable_milters",
55  CLEANUP_FLAG_SMTP_REPLY, "enable_smtp_reply",
56  CLEANUP_FLAG_SMTPUTF8, "smtputf8_requested",
57  CLEANUP_FLAG_AUTOUTF8, "smtputf8_autodetect",
58 };
59 
60 /* cleanup_strflags - map flags code to printable string */
61 
62 const char *cleanup_strflags(unsigned flags)
63 {
64  static VSTRING *result;
65  unsigned i;
66 
67  if (flags == 0)
68  return ("none");
69 
70  if (result == 0)
71  result = vstring_alloc(20);
72  else
73  VSTRING_RESET(result);
74 
75  for (i = 0; i < sizeof(cleanup_flag_map) / sizeof(cleanup_flag_map[0]); i++) {
76  if (cleanup_flag_map[i].flag & flags) {
77  vstring_sprintf_append(result, "%s ", cleanup_flag_map[i].text);
78  flags &= ~cleanup_flag_map[i].flag;
79  }
80  }
81 
82  if (flags != 0 || VSTRING_LEN(result) == 0)
83  msg_panic("cleanup_strflags: unrecognized flag value(s) 0x%x", flags);
84 
85  vstring_truncate(result, VSTRING_LEN(result) - 1);
86  VSTRING_TERMINATE(result);
87 
88  return (vstring_str(result));
89 }
#define CLEANUP_FLAG_SMTPUTF8
Definition: cleanup_user.h:26
#define CLEANUP_FLAG_MAP_OK
Definition: cleanup_user.h:23
NORETURN msg_panic(const char *fmt,...)
Definition: msg.c:295
#define vstring_str(vp)
Definition: vstring.h:71
#define CLEANUP_FLAG_BOUNCE
Definition: cleanup_user.h:18
#define CLEANUP_FLAG_FILTER
Definition: cleanup_user.h:19
VSTRING * vstring_truncate(VSTRING *vp, ssize_t len)
Definition: vstring.c:415
#define CLEANUP_FLAG_MILTER
Definition: cleanup_user.h:24
#define CLEANUP_FLAG_DISCARD
Definition: cleanup_user.h:21
#define VSTRING_LEN(vp)
Definition: vstring.h:72
#define CLEANUP_FLAG_HOLD
Definition: cleanup_user.h:20
#define VSTRING_TERMINATE(vp)
Definition: vstring.h:74
VSTRING * vstring_sprintf_append(VSTRING *vp, const char *format,...)
Definition: vstring.c:624
const char * text
#define VSTRING_RESET(vp)
Definition: vstring.h:77
#define CLEANUP_FLAG_AUTOUTF8
Definition: cleanup_user.h:27
VSTRING * vstring_alloc(ssize_t len)
Definition: vstring.c:353
const char * cleanup_strflags(unsigned flags)
#define CLEANUP_FLAG_BCC_OK
Definition: cleanup_user.h:22
#define CLEANUP_FLAG_SMTP_REPLY
Definition: cleanup_user.h:25