Postfix3.3.1
mail_conf_long.c
[詳解]
1 /*++
2 /* NAME
3 /* mail_conf_long 3
4 /* SUMMARY
5 /* long integer-valued configuration parameter support
6 /* SYNOPSIS
7 /* #include <mail_conf.h>
8 /*
9 /* int get_mail_conf_long(name, defval, min, max);
10 /* const char *name;
11 /* long defval;
12 /* long min;
13 /* long max;
14 /*
15 /* int get_mail_conf_long_fn(name, defval, min, max);
16 /* const char *name;
17 /* long (*defval)(void);
18 /* long min;
19 /* long max;
20 /*
21 /* void set_mail_conf_long(name, value)
22 /* const char *name;
23 /* long value;
24 /*
25 /* void get_mail_conf_long_table(table)
26 /* const CONFIG_LONG_TABLE *table;
27 /*
28 /* void get_mail_conf_long_fn_table(table)
29 /* const CONFIG_LONG_TABLE *table;
30 /* AUXILIARY FUNCTIONS
31 /* int get_mail_conf_long2(name1, name2, defval, min, max);
32 /* const char *name1;
33 /* const char *name2;
34 /* long defval;
35 /* long min;
36 /* long max;
37 /* DESCRIPTION
38 /* This module implements configuration parameter support
39 /* for long integer values.
40 /*
41 /* get_mail_conf_long() looks up the named entry in the global
42 /* configuration dictionary. The default value is returned
43 /* when no value was found.
44 /* \fImin\fR is zero or specifies a lower limit on the long
45 /* integer value; \fImax\fR is zero or specifies an upper limit
46 /* on the long integer value.
47 /*
48 /* get_mail_conf_long_fn() is similar but specifies a function that
49 /* provides the default value. The function is called only
50 /* when the default value is needed.
51 /*
52 /* set_mail_conf_long() updates the named entry in the global
53 /* configuration dictionary. This has no effect on values that
54 /* have been looked up earlier via the get_mail_conf_XXX() routines.
55 /*
56 /* get_mail_conf_long_table() and get_mail_conf_long_fn_table() initialize
57 /* lists of variables, as directed by their table arguments. A table
58 /* must be terminated by a null entry.
59 /*
60 /* get_mail_conf_long2() concatenates the two names and is otherwise
61 /* identical to get_mail_conf_long().
62 /* DIAGNOSTICS
63 /* Fatal errors: malformed numerical value.
64 /* SEE ALSO
65 /* config(3) general configuration
66 /* mail_conf_str(3) string-valued configuration parameters
67 /* LICENSE
68 /* .ad
69 /* .fi
70 /* The Secure Mailer license must be distributed with this software.
71 /* AUTHOR(S)
72 /* Wietse Venema
73 /* IBM T.J. Watson Research
74 /* P.O. Box 704
75 /* Yorktown Heights, NY 10598, USA
76 /*--*/
77 
78 /* System library. */
79 
80 #include <sys_defs.h>
81 #include <stdlib.h>
82 #include <stdio.h> /* BUFSIZ */
83 #include <errno.h>
84 
85 /* Utility library. */
86 
87 #include <msg.h>
88 #include <mymalloc.h>
89 #include <dict.h>
90 #include <stringops.h>
91 
92 /* Global library. */
93 
94 #include "mail_conf.h"
95 
96 /* convert_mail_conf_long - look up and convert integer parameter value */
97 
98 static int convert_mail_conf_long(const char *name, long *longval)
99 {
100  const char *strval;
101  char *end;
102 
103  if ((strval = mail_conf_lookup_eval(name)) != 0) {
104  errno = 0;
105  *longval = strtol(strval, &end, 10);
106  if (*strval == 0 || *end != 0 || errno == ERANGE)
107  msg_fatal("bad numerical configuration: %s = %s", name, strval);
108  return (1);
109  }
110  return (0);
111 }
112 
113 /* check_mail_conf_long - validate integer value */
114 
115 static void check_mail_conf_long(const char *name, long longval, long min, long max)
116 {
117  if (min && longval < min)
118  msg_fatal("invalid %s parameter value %ld < %ld", name, longval, min);
119  if (max && longval > max)
120  msg_fatal("invalid %s parameter value %ld > %ld", name, longval, max);
121 }
122 
123 /* get_mail_conf_long - evaluate integer-valued configuration variable */
124 
125 long get_mail_conf_long(const char *name, long defval, long min, long max)
126 {
127  long longval;
128 
129  if (convert_mail_conf_long(name, &longval) == 0)
130  set_mail_conf_long(name, longval = defval);
131  check_mail_conf_long(name, longval, min, max);
132  return (longval);
133 }
134 
135 /* get_mail_conf_long2 - evaluate integer-valued configuration variable */
136 
137 long get_mail_conf_long2(const char *name1, const char *name2, long defval,
138  long min, long max)
139 {
140  long longval;
141  char *name;
142 
143  name = concatenate(name1, name2, (char *) 0);
144  if (convert_mail_conf_long(name, &longval) == 0)
145  set_mail_conf_long(name, longval = defval);
146  check_mail_conf_long(name, longval, min, max);
147  myfree(name);
148  return (longval);
149 }
150 
151 /* get_mail_conf_long_fn - evaluate integer-valued configuration variable */
152 
153 typedef long (*stupid_indent_long) (void);
154 
155 long get_mail_conf_long_fn(const char *name, stupid_indent_long defval,
156  long min, long max)
157 {
158  long longval;
159 
160  if (convert_mail_conf_long(name, &longval) == 0)
161  set_mail_conf_long(name, longval = defval());
162  check_mail_conf_long(name, longval, min, max);
163  return (longval);
164 }
165 
166 /* set_mail_conf_long - update integer-valued configuration dictionary entry */
167 
168 void set_mail_conf_long(const char *name, long value)
169 {
170  char buf[BUFSIZ]; /* yeah! crappy code! */
171 
172  sprintf(buf, "%ld", value); /* yeah! more crappy code! */
173  mail_conf_update(name, buf);
174 }
175 
176 /* get_mail_conf_long_table - look up table of integers */
177 
179 {
180  while (table->name) {
181  table->target[0] = get_mail_conf_long(table->name, table->defval,
182  table->min, table->max);
183  table++;
184  }
185 }
186 
187 /* get_mail_conf_long_fn_table - look up integers, defaults are functions */
188 
190 {
191  while (table->name) {
192  table->target[0] = get_mail_conf_long_fn(table->name, table->defval,
193  table->min, table->max);
194  table++;
195  }
196 }
void myfree(void *ptr)
Definition: mymalloc.c:207
void set_mail_conf_long(const char *name, long value)
long(* defval)(void)
Definition: mail_conf.h:199
const char * name
Definition: mail_conf.h:198
void const char long
Definition: opened.h:22
long get_mail_conf_long_fn(const char *name, stupid_indent_long defval, long min, long max)
long get_mail_conf_long2(const char *name1, const char *name2, long defval, long min, long max)
void get_mail_conf_long_table(const CONFIG_LONG_TABLE *table)
NORETURN msg_fatal(const char *fmt,...)
Definition: msg.c:249
const char * mail_conf_lookup_eval(const char *name)
Definition: mail_conf.c:262
char * concatenate(const char *arg0,...)
Definition: concatenate.c:42
const char * name
Definition: mail_conf.h:125
long get_mail_conf_long(const char *name, long defval, long min, long max)
long(* stupid_indent_long)(void)
void mail_conf_update(const char *key, const char *value)
Definition: mail_conf.c:275
void get_mail_conf_long_fn_table(const CONFIG_LONG_FN_TABLE *table)