1 /* $NetBSD: mail_conf_str.c,v 1.2 2017/02/14 01:16:45 christos Exp $ */ 2 3 /*++ 4 /* NAME 5 /* mail_conf_str 3 6 /* SUMMARY 7 /* string-valued global configuration parameter support 8 /* SYNOPSIS 9 /* #include <mail_conf.h> 10 /* 11 /* char *get_mail_conf_str(name, defval, min, max) 12 /* const char *name; 13 /* const char *defval; 14 /* int min; 15 /* int max; 16 /* 17 /* char *get_mail_conf_str_fn(name, defval, min, max) 18 /* const char *name; 19 /* const char *(*defval)(void); 20 /* int min; 21 /* int max; 22 /* 23 /* void set_mail_conf_str(name, value) 24 /* const char *name; 25 /* const char *value; 26 /* 27 /* void get_mail_conf_str_table(table) 28 /* const CONFIG_STR_TABLE *table; 29 /* 30 /* void get_mail_conf_str_fn_table(table) 31 /* const CONFIG_STR_TABLE *table; 32 /* AUXILIARY FUNCTIONS 33 /* char *get_mail_conf_str2(name, suffix, defval, min, max) 34 /* const char *name; 35 /* const char *suffix; 36 /* const char *defval; 37 /* int min; 38 /* int max; 39 /* 40 /* void check_mail_conf_str(name, strval, min, max) 41 /* const char *name; 42 /* const char *strval; 43 /* int min; 44 /* int max; 45 /* DESCRIPTION 46 /* This module implements support for string-valued global 47 /* configuration parameters. 48 /* 49 /* get_mail_conf_str() looks up the named entry in the global 50 /* configuration dictionary. The default value is returned when 51 /* no value was found. String results should be passed to myfree() 52 /* when no longer needed. \fImin\fR is zero or specifies a lower 53 /* bound on the string length; \fImax\fR is zero or specifies an 54 /* upper limit on the string length. 55 /* 56 /* get_mail_conf_str_fn() is similar but specifies a function that 57 /* provides the default value. The function is called only when 58 /* the default value is used. 59 /* 60 /* set_mail_conf_str() updates the named entry in the global 61 /* configuration dictionary. This has no effect on values that 62 /* have been looked up earlier via the get_mail_conf_XXX() routines. 63 /* 64 /* get_mail_conf_str_table() and get_mail_conf_str_fn_table() read 65 /* lists of variables, as directed by their table arguments. A table 66 /* must be terminated by a null entry. 67 /* 68 /* get_mail_conf_str2() concatenates the two names and is otherwise 69 /* identical to get_mail_conf_str(). 70 /* 71 /* check_mail_conf_str() exits with a fatal run-time error 72 /* when the string does not meet its length requirements. 73 /* DIAGNOSTICS 74 /* Fatal errors: bad string length. 75 /* SEE ALSO 76 /* config(3) generic config parameter support 77 /* LICENSE 78 /* .ad 79 /* .fi 80 /* The Secure Mailer license must be distributed with this software. 81 /* AUTHOR(S) 82 /* Wietse Venema 83 /* IBM T.J. Watson Research 84 /* P.O. Box 704 85 /* Yorktown Heights, NY 10598, USA 86 /*--*/ 87 88 /* System library. */ 89 90 #include <sys_defs.h> 91 #include <stdlib.h> 92 #include <string.h> 93 94 /* Utility library. */ 95 96 #include <msg.h> 97 #include <mymalloc.h> 98 #include <stringops.h> 99 100 /* Global library. */ 101 102 #include "mail_conf.h" 103 104 /* check_mail_conf_str - validate string length */ 105 106 void check_mail_conf_str(const char *name, const char *strval, 107 int min, int max) 108 { 109 ssize_t len = strlen(strval); 110 111 if (min && len < min) 112 msg_fatal("bad string length %ld < %d: %s = %s", 113 (long) len, min, name, strval); 114 if (max && len > max) 115 msg_fatal("bad string length %ld > %d: %s = %s", 116 (long) len, max, name, strval); 117 } 118 119 /* get_mail_conf_str - evaluate string-valued configuration variable */ 120 121 char *get_mail_conf_str(const char *name, const char *defval, 122 int min, int max) 123 { 124 const char *strval; 125 126 if ((strval = mail_conf_lookup_eval(name)) == 0) { 127 strval = mail_conf_eval(defval); 128 mail_conf_update(name, strval); 129 } 130 check_mail_conf_str(name, strval, min, max); 131 return (mystrdup(strval)); 132 } 133 134 /* get_mail_conf_str2 - evaluate string-valued configuration variable */ 135 136 char *get_mail_conf_str2(const char *name1, const char *name2, 137 const char *defval, 138 int min, int max) 139 { 140 const char *strval; 141 char *name; 142 143 name = concatenate(name1, name2, (char *) 0); 144 if ((strval = mail_conf_lookup_eval(name)) == 0) { 145 strval = mail_conf_eval(defval); 146 mail_conf_update(name, strval); 147 } 148 check_mail_conf_str(name, strval, min, max); 149 myfree(name); 150 return (mystrdup(strval)); 151 } 152 153 /* get_mail_conf_str_fn - evaluate string-valued configuration variable */ 154 155 typedef const char *(*stupid_indent_str) (void); 156 157 char *get_mail_conf_str_fn(const char *name, stupid_indent_str defval, 158 int min, int max) 159 { 160 const char *strval; 161 162 if ((strval = mail_conf_lookup_eval(name)) == 0) { 163 strval = mail_conf_eval(defval()); 164 mail_conf_update(name, strval); 165 } 166 check_mail_conf_str(name, strval, min, max); 167 return (mystrdup(strval)); 168 } 169 170 /* set_mail_conf_str - update string-valued configuration dictionary entry */ 171 172 void set_mail_conf_str(const char *name, const char *value) 173 { 174 mail_conf_update(name, value); 175 } 176 177 /* get_mail_conf_str_table - look up table of strings */ 178 179 void get_mail_conf_str_table(const CONFIG_STR_TABLE *table) 180 { 181 while (table->name) { 182 if (table->target[0]) 183 myfree(table->target[0]); 184 table->target[0] = get_mail_conf_str(table->name, table->defval, 185 table->min, table->max); 186 table++; 187 } 188 } 189 190 /* get_mail_conf_str_fn_table - look up strings, defaults are functions */ 191 192 void get_mail_conf_str_fn_table(const CONFIG_STR_FN_TABLE *table) 193 { 194 while (table->name) { 195 if (table->target[0]) 196 myfree(table->target[0]); 197 table->target[0] = get_mail_conf_str_fn(table->name, table->defval, 198 table->min, table->max); 199 table++; 200 } 201 } 202