Postfix3.3.1
mail_conf_raw.c
[詳解]
1 /*++
2 /* NAME
3 /* mail_conf_raw 3
4 /* SUMMARY
5 /* raw string-valued global configuration parameter support
6 /* SYNOPSIS
7 /* #include <mail_conf.h>
8 /*
9 /* char *get_mail_conf_raw(name, defval, min, max)
10 /* const char *name;
11 /* const char *defval;
12 /* int min;
13 /* int max;
14 /*
15 /* char *get_mail_conf_raw_fn(name, defval, min, max)
16 /* const char *name;
17 /* const char *(*defval)(void);
18 /* int min;
19 /* int max;
20 /*
21 /* void get_mail_conf_raw_table(table)
22 /* const CONFIG_RAW_TABLE *table;
23 /*
24 /* void get_mail_conf_raw_fn_table(table)
25 /* const CONFIG_RAW_TABLE *table;
26 /* DESCRIPTION
27 /* This module implements support for string-valued global
28 /* configuration parameters that are loaded without $name expansion.
29 /*
30 /* get_mail_conf_raw() looks up the named entry in the global
31 /* configuration dictionary. The default value is returned when
32 /* no value was found. String results should be passed to myfree()
33 /* when no longer needed. \fImin\fR is zero or specifies a lower
34 /* bound on the string length; \fImax\fR is zero or specifies an
35 /* upper limit on the string length.
36 /*
37 /* get_mail_conf_raw_fn() is similar but specifies a function that
38 /* provides the default value. The function is called only when
39 /* the default value is used.
40 /*
41 /* get_mail_conf_raw_table() and get_mail_conf_raw_fn_table() read
42 /* lists of variables, as directed by their table arguments. A table
43 /* must be terminated by a null entry.
44 /* DIAGNOSTICS
45 /* Fatal errors: bad string length.
46 /* SEE ALSO
47 /* config(3) generic config parameter support
48 /* LICENSE
49 /* .ad
50 /* .fi
51 /* The Secure Mailer license must be distributed with this software.
52 /* AUTHOR(S)
53 /* Wietse Venema
54 /* IBM T.J. Watson Research
55 /* P.O. Box 704
56 /* Yorktown Heights, NY 10598, USA
57 /*--*/
58 
59 /* System library. */
60 
61 #include <sys_defs.h>
62 #include <stdlib.h>
63 #include <string.h>
64 
65 /* Utility library. */
66 
67 #include <msg.h>
68 #include <mymalloc.h>
69 
70 /* Global library. */
71 
72 #include "mail_conf.h"
73 
74 /* check_mail_conf_raw - validate string length */
75 
76 static void check_mail_conf_raw(const char *name, const char *strval,
77  int min, int max)
78 {
79  ssize_t len = strlen(strval);
80 
81  if (min && len < min)
82  msg_fatal("bad string length (%ld < %d): %s = %s",
83  (long) len, min, name, strval);
84  if (max && len > max)
85  msg_fatal("bad string length (%ld > %d): %s = %s",
86  (long) len, max, name, strval);
87 }
88 
89 /* get_mail_conf_raw - evaluate string-valued configuration variable */
90 
91 char *get_mail_conf_raw(const char *name, const char *defval,
92  int min, int max)
93 {
94  const char *strval;
95 
96  if ((strval = mail_conf_lookup(name)) == 0) {
97  strval = defval;
98  mail_conf_update(name, strval);
99  }
100  check_mail_conf_raw(name, strval, min, max);
101  return (mystrdup(strval));
102 }
103 
104 /* get_mail_conf_raw_fn - evaluate string-valued configuration variable */
105 
106 typedef const char *(*stupid_indent_str) (void);
107 
108 char *get_mail_conf_raw_fn(const char *name, stupid_indent_str defval,
109  int min, int max)
110 {
111  const char *strval;
112 
113  if ((strval = mail_conf_lookup(name)) == 0) {
114  strval = defval();
115  mail_conf_update(name, strval);
116  }
117  check_mail_conf_raw(name, strval, min, max);
118  return (mystrdup(strval));
119 }
120 
121 /* get_mail_conf_raw_table - look up table of strings */
122 
124 {
125  while (table->name) {
126  if (table->target[0])
127  myfree(table->target[0]);
128  table->target[0] = get_mail_conf_raw(table->name, table->defval,
129  table->min, table->max);
130  table++;
131  }
132 }
133 
134 /* get_mail_conf_raw_fn_table - look up strings, defaults are functions */
135 
137 {
138  while (table->name) {
139  if (table->target[0])
140  myfree(table->target[0]);
141  table->target[0] = get_mail_conf_raw_fn(table->name, table->defval,
142  table->min, table->max);
143  table++;
144  }
145 }
void myfree(void *ptr)
Definition: mymalloc.c:207
char * mystrdup(const char *str)
Definition: mymalloc.c:225
void get_mail_conf_raw_table(const CONFIG_RAW_TABLE *table)
const char * mail_conf_lookup(const char *name)
Definition: mail_conf.c:255
void get_mail_conf_raw_fn_table(const CONFIG_RAW_FN_TABLE *table)
const char * name
Definition: mail_conf.h:109
char ** target
Definition: mail_conf.h:111
const char *(* stupid_indent_str)(void)
char * get_mail_conf_raw_fn(const char *name, stupid_indent_str defval, int min, int max)
NORETURN msg_fatal(const char *fmt,...)
Definition: msg.c:249
char * get_mail_conf_raw(const char *name, const char *defval, int min, int max)
Definition: mail_conf_raw.c:91
const char * name
Definition: mail_conf.h:182
const char * defval
Definition: mail_conf.h:110
void mail_conf_update(const char *key, const char *value)
Definition: mail_conf.c:275
const char *(* defval)(void)
Definition: mail_conf.h:183