Home | History | Annotate | Line # | Download | only in global
      1 /*	$NetBSD: mail_conf_nbool.c,v 1.1.1.1 2011/03/02 19:32:15 tron Exp $	*/
      2 
      3 /*++
      4 /* NAME
      5 /*	mail_conf_nbool 3
      6 /* SUMMARY
      7 /*	boolean-valued configuration parameter support
      8 /* SYNOPSIS
      9 /*	#include <mail_conf.h>
     10 /*
     11 /*	int	get_mail_conf_nbool(name, defval)
     12 /*	const char *name;
     13 /*	const char *defval;
     14 /*
     15 /*	int	get_mail_conf_nbool_fn(name, defval)
     16 /*	const char *name;
     17 /*	const char *(*defval)();
     18 /*
     19 /*	void	set_mail_conf_nbool(name, value)
     20 /*	const char *name;
     21 /*	const char *value;
     22 /*
     23 /*	void	get_mail_conf_nbool_table(table)
     24 /*	const CONFIG_NBOOL_TABLE *table;
     25 /*
     26 /*	void	get_mail_conf_nbool_fn_table(table)
     27 /*	const CONFIG_NBOOL_TABLE *table;
     28 /* DESCRIPTION
     29 /*	This module implements configuration parameter support for
     30 /*	boolean values. The internal representation is zero (false)
     31 /*	and non-zero (true). The external representation is "no"
     32 /*	(false) and "yes" (true). The conversion from external
     33 /*	representation is case insensitive. Unlike mail_conf_bool(3)
     34 /*	the default is a string value which is subject to macro expansion.
     35 /*
     36 /*	get_mail_conf_nbool() looks up the named entry in the global
     37 /*	configuration dictionary. The specified default value is
     38 /*	returned when no value was found.
     39 /*
     40 /*	get_mail_conf_nbool_fn() is similar but specifies a function that
     41 /*	provides the default value. The function is called only
     42 /*	when the default value is needed.
     43 /*
     44 /*	set_mail_conf_nbool() updates the named entry in the global
     45 /*	configuration dictionary. This has no effect on values that
     46 /*	have been looked up earlier via the get_mail_conf_XXX() routines.
     47 /*
     48 /*	get_mail_conf_nbool_table() and get_mail_conf_int_fn_table() initialize
     49 /*	lists of variables, as directed by their table arguments. A table
     50 /*	must be terminated by a null entry.
     51 /* DIAGNOSTICS
     52 /*	Fatal errors: malformed boolean value.
     53 /* SEE ALSO
     54 /*	config(3) general configuration
     55 /*	mail_conf_str(3) string-valued configuration parameters
     56 /*	mail_conf_int(3) integer-valued configuration parameters
     57 /* LICENSE
     58 /* .ad
     59 /* .fi
     60 /*	The Secure Mailer license must be distributed with this software.
     61 /* AUTHOR(S)
     62 /*	Wietse Venema
     63 /*	IBM T.J. Watson Research
     64 /*	P.O. Box 704
     65 /*	Yorktown Heights, NY 10598, USA
     66 /*--*/
     67 
     68 /* System library. */
     69 
     70 #include <sys_defs.h>
     71 #include <stdlib.h>
     72 #include <string.h>
     73 
     74 #ifdef STRCASECMP_IN_STRINGS_H
     75 #include <strings.h>
     76 #endif
     77 
     78 /* Utility library. */
     79 
     80 #include <msg.h>
     81 #include <dict.h>
     82 
     83 /* Global library. */
     84 
     85 #include "mail_conf.h"
     86 
     87 /* convert_mail_conf_nbool - look up and convert boolean parameter value */
     88 
     89 static int convert_mail_conf_nbool(const char *name, int *intval)
     90 {
     91     const char *strval;
     92 
     93     if ((strval = mail_conf_lookup_eval(name)) == 0) {
     94 	return (0);
     95     } else {
     96 	if (strcasecmp(strval, CONFIG_BOOL_YES) == 0) {
     97 	    *intval = 1;
     98 	} else if (strcasecmp(strval, CONFIG_BOOL_NO) == 0) {
     99 	    *intval = 0;
    100 	} else {
    101 	    msg_fatal("bad boolean configuration: %s = %s", name, strval);
    102 	}
    103 	return (1);
    104     }
    105 }
    106 
    107 /* get_mail_conf_nbool - evaluate boolean-valued configuration variable */
    108 
    109 int     get_mail_conf_nbool(const char *name, const char *defval)
    110 {
    111     int     intval;
    112 
    113     if (convert_mail_conf_nbool(name, &intval) == 0)
    114 	set_mail_conf_nbool(name, defval);
    115     if (convert_mail_conf_nbool(name, &intval) == 0)
    116 	msg_panic("get_mail_conf_nbool: parameter not found: %s", name);
    117     return (intval);
    118 }
    119 
    120 /* get_mail_conf_nbool_fn - evaluate boolean-valued configuration variable */
    121 
    122 typedef const char *(*stupid_indent_int) (void);
    123 
    124 int     get_mail_conf_nbool_fn(const char *name, stupid_indent_int defval)
    125 {
    126     int     intval;
    127 
    128     if (convert_mail_conf_nbool(name, &intval) == 0)
    129 	set_mail_conf_nbool(name, defval());
    130     if (convert_mail_conf_nbool(name, &intval) == 0)
    131 	msg_panic("get_mail_conf_nbool_fn: parameter not found: %s", name);
    132     return (intval);
    133 }
    134 
    135 /* set_mail_conf_nbool - update boolean-valued configuration dictionary entry */
    136 
    137 void    set_mail_conf_nbool(const char *name, const char *value)
    138 {
    139     mail_conf_update(name, value);
    140 }
    141 
    142 /* get_mail_conf_nbool_table - look up table of booleans */
    143 
    144 void    get_mail_conf_nbool_table(const CONFIG_NBOOL_TABLE *table)
    145 {
    146     while (table->name) {
    147 	table->target[0] = get_mail_conf_nbool(table->name, table->defval);
    148 	table++;
    149     }
    150 }
    151 
    152 /* get_mail_conf_nbool_fn_table - look up booleans, defaults are functions */
    153 
    154 void    get_mail_conf_nbool_fn_table(const CONFIG_NBOOL_FN_TABLE *table)
    155 {
    156     while (table->name) {
    157 	table->target[0] = get_mail_conf_nbool_fn(table->name, table->defval);
    158 	table++;
    159     }
    160 }
    161