1/* $NetBSD$ */ 2 3/*++ 4/* NAME 5/* postconf_unused 3 6/* SUMMARY 7/* report unused parameters 8/* SYNOPSIS 9/* #include <postconf.h> 10/* 11/* void pcf_flag_unused_main_parameters() 12/* 13/* void pcf_flag_unused_master_parameters() 14/* DESCRIPTION 15/* These functions must be called after all parameter information 16/* is initialized: built-ins, service-defined and user-defined. 17/* In other words, don't call these functions with "postconf 18/* -d" which ignores user-defined main.cf settings. 19/* 20/* pcf_flag_unused_main_parameters() reports unused "name=value" 21/* entries in main.cf. 22/* 23/* pcf_flag_unused_master_parameters() reports unused "-o 24/* name=value" entries in master.cf. 25/* DIAGNOSTICS 26/* Problems are reported to the standard error stream. 27/* LICENSE 28/* .ad 29/* .fi 30/* The Secure Mailer license must be distributed with this software. 31/* AUTHOR(S) 32/* Wietse Venema 33/* IBM T.J. Watson Research 34/* P.O. Box 704 35/* Yorktown Heights, NY 10598, USA 36/*--*/ 37 38/* System library. */ 39 40#include <sys_defs.h> 41 42/* Utility library. */ 43 44#include <msg.h> 45#include <dict.h> 46#include <vstream.h> 47 48/* Global library. */ 49 50#include <mail_params.h> 51#include <mail_conf.h> 52 53/* Application-specific. */ 54 55#include <postconf.h> 56 57/* pcf_flag_unused_parameters - warn about unused parameters */ 58 59static void pcf_flag_unused_parameters(DICT *dict, const char *conf_name, 60 PCF_MASTER_ENT *local_scope) 61{ 62 const char *myname = "pcf_flag_unused_parameters"; 63 const char *param_name; 64 const char *param_value; 65 int how; 66 67 /* 68 * Sanity checks. 69 */ 70 if (pcf_param_table == 0) 71 msg_panic("%s: global parameter table is not initialized", myname); 72 73 /* 74 * Iterate over all entries, and flag parameter names that aren't used 75 * anywhere. Show the warning message at the end of the output. 76 */ 77 if (dict->sequence == 0) 78 msg_panic("%s: parameter dictionary %s has no iterator", 79 myname, conf_name); 80 for (how = DICT_SEQ_FUN_FIRST; 81 dict->sequence(dict, how, ¶m_name, ¶m_value) == 0; 82 how = DICT_SEQ_FUN_NEXT) { 83 if (PCF_PARAM_TABLE_LOCATE(pcf_param_table, param_name) == 0 84 && (local_scope == 0 85 || PCF_PARAM_TABLE_LOCATE(local_scope->valid_names, param_name) == 0)) { 86 vstream_fflush(VSTREAM_OUT); 87 msg_warn("%s/%s: unused parameter: %s=%s", 88 var_config_dir, conf_name, param_name, param_value); 89 } 90 } 91} 92 93/* pcf_flag_unused_main_parameters - warn about unused parameters */ 94 95void pcf_flag_unused_main_parameters(void) 96{ 97 const char *myname = "pcf_flag_unused_main_parameters"; 98 DICT *dict; 99 100 /* 101 * Iterate over all main.cf entries, and flag parameter names that aren't 102 * used anywhere. 103 */ 104 if ((dict = dict_handle(CONFIG_DICT)) == 0) 105 msg_panic("%s: parameter dictionary %s not found", 106 myname, CONFIG_DICT); 107 pcf_flag_unused_parameters(dict, MAIN_CONF_FILE, (PCF_MASTER_ENT *) 0); 108} 109 110/* pcf_flag_unused_master_parameters - warn about unused parameters */ 111 112void pcf_flag_unused_master_parameters(void) 113{ 114 const char *myname = "pcf_flag_unused_master_parameters"; 115 PCF_MASTER_ENT *masterp; 116 DICT *dict; 117 118 /* 119 * Sanity checks. 120 */ 121 if (pcf_master_table == 0) 122 msg_panic("%s: master table is not initialized", myname); 123 124 /* 125 * Iterate over all master.cf entries, and flag parameter names that 126 * aren't used anywhere. 127 */ 128 for (masterp = pcf_master_table; masterp->argv != 0; masterp++) 129 if ((dict = masterp->all_params) != 0) 130 pcf_flag_unused_parameters(dict, MASTER_CONF_FILE, masterp); 131} 132