Home | History | Annotate | Line # | Download | only in global
      1 /*	$NetBSD: mail_conf_str.c,v 1.3 2025/02/25 19:15: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