1 /* $NetBSD: postconf_unused.c,v 1.1.1.1 2013/01/02 18:59:03 tron Exp $ */ 2 3 /*++ 4 /* NAME 5 /* postconf_unused 3 6 /* SUMMARY 7 /* report unused parameters 8 /* SYNOPSIS 9 /* #include <postconf.h> 10 /* 11 /* void flag_unused_main_parameters() 12 /* 13 /* void 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 -d" 18 /* which ignores user-defined main.cf settings. 19 /* 20 /* flag_unused_main_parameters() reports unused "name=value" 21 /* entries in main.cf. 22 /* 23 /* flag_unused_master_parameters() reports unused "-o name=value" 24 /* 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 /* flag_unused_parameters - warn about unused parameters */ 58 59 static void flag_unused_parameters(DICT *dict, const char *conf_name, 60 PC_MASTER_ENT *local_scope) 61 { 62 const char *myname = "flag_unused_parameters"; 63 const char *param_name; 64 const char *param_value; 65 int how; 66 67 /* 68 * Sanity checks. 69 */ 70 if (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 (PC_PARAM_TABLE_LOCATE(param_table, param_name) == 0 84 && (local_scope == 0 85 || PC_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 /* flag_unused_main_parameters - warn about unused parameters */ 94 95 void flag_unused_main_parameters(void) 96 { 97 const char *myname = "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 flag_unused_parameters(dict, MAIN_CONF_FILE, (PC_MASTER_ENT *) 0); 108 } 109 110 /* flag_unused_master_parameters - warn about unused parameters */ 111 112 void flag_unused_master_parameters(void) 113 { 114 const char *myname = "flag_unused_master_parameters"; 115 PC_MASTER_ENT *masterp; 116 DICT *dict; 117 118 /* 119 * Sanity checks. 120 */ 121 if (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 = master_table; masterp->argv != 0; masterp++) 129 if ((dict = masterp->all_params) != 0) 130 flag_unused_parameters(dict, MASTER_CONF_FILE, masterp); 131 } 132