diff options
author | mogorman <mogorman@f38db490-d61c-443f-a65b-d21fe96a405b> | 2006-08-31 21:00:20 +0000 |
---|---|---|
committer | mogorman <mogorman@f38db490-d61c-443f-a65b-d21fe96a405b> | 2006-08-31 21:00:20 +0000 |
commit | 73925ee14a02afb50f6c0aea3cc4e54f99493440 (patch) | |
tree | 5eac7fd790352b502dbbc4fc21ae517fe7c388ad /res | |
parent | 43c75db33e757e08cdec37b1713a0e275d9a039b (diff) |
everything that loads a config that needs a config file to run
now reports AST_MODULE_LOAD_DECLINE when loading if config file
is not there, also fixed an error in res_config_pgsql where it
had a non static function when it should.
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@41633 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'res')
-rw-r--r-- | res/res_config_pgsql.c | 93 | ||||
-rw-r--r-- | res/res_features.c | 276 | ||||
-rw-r--r-- | res/res_indications.c | 5 | ||||
-rw-r--r-- | res/res_jabber.c | 33 | ||||
-rw-r--r-- | res/res_odbc.c | 145 | ||||
-rw-r--r-- | res/res_smdi.c | 2 | ||||
-rw-r--r-- | res/res_snmp.c | 66 |
7 files changed, 316 insertions, 304 deletions
diff --git a/res/res_config_pgsql.c b/res/res_config_pgsql.c index f004bfd13..d3d11446a 100644 --- a/res/res_config_pgsql.c +++ b/res/res_config_pgsql.c @@ -553,7 +553,8 @@ static struct ast_config_engine pgsql_engine = { static int load_module(void) { - parse_config(); + if(!parse_config()) + return AST_MODULE_LOAD_DECLINE; ast_mutex_lock(&pgsql_lock); @@ -624,61 +625,63 @@ static int reload(void) return 0; } -int parse_config(void) +static int parse_config(void) { struct ast_config *config; char *s; config = ast_config_load(RES_CONFIG_PGSQL_CONF); - if (config) { - if (!(s = ast_variable_retrieve(config, "general", "dbuser"))) { - ast_log(LOG_WARNING, - "Postgresql RealTime: No database user found, using 'asterisk' as default.\n"); - strcpy(dbuser, "asterisk"); - } else { - ast_copy_string(dbuser, s, sizeof(dbuser)); - } + if (!config) { + ast_log(LOG_WARNING, "Unable to load config %s\n",RES_CONFIG_PGSQL_CONF); + return 0; + } + if (!(s = ast_variable_retrieve(config, "general", "dbuser"))) { + ast_log(LOG_WARNING, + "Postgresql RealTime: No database user found, using 'asterisk' as default.\n"); + strcpy(dbuser, "asterisk"); + } else { + ast_copy_string(dbuser, s, sizeof(dbuser)); + } - if (!(s = ast_variable_retrieve(config, "general", "dbpass"))) { - ast_log(LOG_WARNING, - "Postgresql RealTime: No database password found, using 'asterisk' as default.\n"); - strcpy(dbpass, "asterisk"); - } else { - ast_copy_string(dbpass, s, sizeof(dbpass)); - } + if (!(s = ast_variable_retrieve(config, "general", "dbpass"))) { + ast_log(LOG_WARNING, + "Postgresql RealTime: No database password found, using 'asterisk' as default.\n"); + strcpy(dbpass, "asterisk"); + } else { + ast_copy_string(dbpass, s, sizeof(dbpass)); + } - if (!(s = ast_variable_retrieve(config, "general", "dbhost"))) { - ast_log(LOG_WARNING, - "Postgresql RealTime: No database host found, using localhost via socket.\n"); - dbhost[0] = '\0'; - } else { - ast_copy_string(dbhost, s, sizeof(dbhost)); - } + if (!(s = ast_variable_retrieve(config, "general", "dbhost"))) { + ast_log(LOG_WARNING, + "Postgresql RealTime: No database host found, using localhost via socket.\n"); + dbhost[0] = '\0'; + } else { + ast_copy_string(dbhost, s, sizeof(dbhost)); + } - if (!(s = ast_variable_retrieve(config, "general", "dbname"))) { - ast_log(LOG_WARNING, - "Postgresql RealTime: No database name found, using 'asterisk' as default.\n"); - strcpy(dbname, "asterisk"); - } else { - ast_copy_string(dbname, s, sizeof(dbname)); - } + if (!(s = ast_variable_retrieve(config, "general", "dbname"))) { + ast_log(LOG_WARNING, + "Postgresql RealTime: No database name found, using 'asterisk' as default.\n"); + strcpy(dbname, "asterisk"); + } else { + ast_copy_string(dbname, s, sizeof(dbname)); + } - if (!(s = ast_variable_retrieve(config, "general", "dbport"))) { - ast_log(LOG_WARNING, - "Postgresql RealTime: No database port found, using 5432 as default.\n"); - dbport = 5432; - } else { - dbport = atoi(s); - } + if (!(s = ast_variable_retrieve(config, "general", "dbport"))) { + ast_log(LOG_WARNING, + "Postgresql RealTime: No database port found, using 5432 as default.\n"); + dbport = 5432; + } else { + dbport = atoi(s); + } - if (dbhost && !(s = ast_variable_retrieve(config, "general", "dbsock"))) { - ast_log(LOG_WARNING, - "Postgresql RealTime: No database socket found, using '/tmp/pgsql.sock' as default.\n"); - strcpy(dbsock, "/tmp/pgsql.sock"); - } else { - ast_copy_string(dbsock, s, sizeof(dbsock)); - } + if (dbhost && !(s = ast_variable_retrieve(config, "general", "dbsock"))) { + ast_log(LOG_WARNING, + "Postgresql RealTime: No database socket found, using '/tmp/pgsql.sock' as default.\n"); + strcpy(dbsock, "/tmp/pgsql.sock"); + } else { + ast_copy_string(dbsock, s, sizeof(dbsock)); } ast_config_destroy(config); diff --git a/res/res_features.c b/res/res_features.c index aba923fb8..88c728fdd 100644 --- a/res/res_features.c +++ b/res/res_features.c @@ -2113,153 +2113,155 @@ static int load_config(void) atxfernoanswertimeout = DEFAULT_NOANSWER_TIMEOUT_ATTENDED_TRANSFER; cfg = ast_config_load("features.conf"); - if (cfg) { - for (var = ast_variable_browse(cfg, "general"); var; var = var->next) { - if (!strcasecmp(var->name, "parkext")) { - ast_copy_string(parking_ext, var->value, sizeof(parking_ext)); - } else if (!strcasecmp(var->name, "context")) { - ast_copy_string(parking_con, var->value, sizeof(parking_con)); - } else if (!strcasecmp(var->name, "parkingtime")) { - if ((sscanf(var->value, "%d", &parkingtime) != 1) || (parkingtime < 1)) { - ast_log(LOG_WARNING, "%s is not a valid parkingtime\n", var->value); - parkingtime = DEFAULT_PARK_TIME; - } else - parkingtime = parkingtime * 1000; - } else if (!strcasecmp(var->name, "parkpos")) { - if (sscanf(var->value, "%d-%d", &start, &end) != 2) { - ast_log(LOG_WARNING, "Format for parking positions is a-b, where a and b are numbers at line %d of parking.conf\n", var->lineno); - } else { - parking_start = start; - parking_stop = end; - } - } else if (!strcasecmp(var->name, "findslot")) { - parkfindnext = (!strcasecmp(var->value, "next")); - } else if (!strcasecmp(var->name, "parkinghints")) { - parkaddhints = ast_true(var->value); - } else if (!strcasecmp(var->name, "adsipark")) { - adsipark = ast_true(var->value); - } else if (!strcasecmp(var->name, "transferdigittimeout")) { - if ((sscanf(var->value, "%d", &transferdigittimeout) != 1) || (transferdigittimeout < 1)) { - ast_log(LOG_WARNING, "%s is not a valid transferdigittimeout\n", var->value); - transferdigittimeout = DEFAULT_TRANSFER_DIGIT_TIMEOUT; - } else - transferdigittimeout = transferdigittimeout * 1000; - } else if (!strcasecmp(var->name, "featuredigittimeout")) { - if ((sscanf(var->value, "%d", &featuredigittimeout) != 1) || (featuredigittimeout < 1)) { - ast_log(LOG_WARNING, "%s is not a valid featuredigittimeout\n", var->value); - featuredigittimeout = DEFAULT_FEATURE_DIGIT_TIMEOUT; - } - } else if (!strcasecmp(var->name, "atxfernoanswertimeout")) { - if ((sscanf(var->value, "%d", &atxfernoanswertimeout) != 1) || (atxfernoanswertimeout < 1)) { - ast_log(LOG_WARNING, "%s is not a valid atxfernoanswertimeout\n", var->value); - atxfernoanswertimeout = DEFAULT_NOANSWER_TIMEOUT_ATTENDED_TRANSFER; - } else - atxfernoanswertimeout = atxfernoanswertimeout * 1000; - } else if (!strcasecmp(var->name, "courtesytone")) { - ast_copy_string(courtesytone, var->value, sizeof(courtesytone)); - } else if (!strcasecmp(var->name, "parkedplay")) { - if (!strcasecmp(var->value, "both")) - parkedplay = 2; - else if (!strcasecmp(var->value, "parked")) - parkedplay = 1; - else - parkedplay = 0; - } else if (!strcasecmp(var->name, "xfersound")) { - ast_copy_string(xfersound, var->value, sizeof(xfersound)); - } else if (!strcasecmp(var->name, "xferfailsound")) { - ast_copy_string(xferfailsound, var->value, sizeof(xferfailsound)); - } else if (!strcasecmp(var->name, "pickupexten")) { - ast_copy_string(pickup_ext, var->value, sizeof(pickup_ext)); - } else if (!strcasecmp(var->name, "parkedmusicclass")) { - ast_copy_string(parkmohclass, var->value, sizeof(parkmohclass)); + if (!cfg) { + ast_log(LOG_WARNING,"Could not load features.conf\n"); + return AST_MODULE_LOAD_DECLINE; + } + for (var = ast_variable_browse(cfg, "general"); var; var = var->next) { + if (!strcasecmp(var->name, "parkext")) { + ast_copy_string(parking_ext, var->value, sizeof(parking_ext)); + } else if (!strcasecmp(var->name, "context")) { + ast_copy_string(parking_con, var->value, sizeof(parking_con)); + } else if (!strcasecmp(var->name, "parkingtime")) { + if ((sscanf(var->value, "%d", &parkingtime) != 1) || (parkingtime < 1)) { + ast_log(LOG_WARNING, "%s is not a valid parkingtime\n", var->value); + parkingtime = DEFAULT_PARK_TIME; + } else + parkingtime = parkingtime * 1000; + } else if (!strcasecmp(var->name, "parkpos")) { + if (sscanf(var->value, "%d-%d", &start, &end) != 2) { + ast_log(LOG_WARNING, "Format for parking positions is a-b, where a and b are numbers at line %d of parking.conf\n", var->lineno); + } else { + parking_start = start; + parking_stop = end; + } + } else if (!strcasecmp(var->name, "findslot")) { + parkfindnext = (!strcasecmp(var->value, "next")); + } else if (!strcasecmp(var->name, "parkinghints")) { + parkaddhints = ast_true(var->value); + } else if (!strcasecmp(var->name, "adsipark")) { + adsipark = ast_true(var->value); + } else if (!strcasecmp(var->name, "transferdigittimeout")) { + if ((sscanf(var->value, "%d", &transferdigittimeout) != 1) || (transferdigittimeout < 1)) { + ast_log(LOG_WARNING, "%s is not a valid transferdigittimeout\n", var->value); + transferdigittimeout = DEFAULT_TRANSFER_DIGIT_TIMEOUT; + } else + transferdigittimeout = transferdigittimeout * 1000; + } else if (!strcasecmp(var->name, "featuredigittimeout")) { + if ((sscanf(var->value, "%d", &featuredigittimeout) != 1) || (featuredigittimeout < 1)) { + ast_log(LOG_WARNING, "%s is not a valid featuredigittimeout\n", var->value); + featuredigittimeout = DEFAULT_FEATURE_DIGIT_TIMEOUT; } + } else if (!strcasecmp(var->name, "atxfernoanswertimeout")) { + if ((sscanf(var->value, "%d", &atxfernoanswertimeout) != 1) || (atxfernoanswertimeout < 1)) { + ast_log(LOG_WARNING, "%s is not a valid atxfernoanswertimeout\n", var->value); + atxfernoanswertimeout = DEFAULT_NOANSWER_TIMEOUT_ATTENDED_TRANSFER; + } else + atxfernoanswertimeout = atxfernoanswertimeout * 1000; + } else if (!strcasecmp(var->name, "courtesytone")) { + ast_copy_string(courtesytone, var->value, sizeof(courtesytone)); + } else if (!strcasecmp(var->name, "parkedplay")) { + if (!strcasecmp(var->value, "both")) + parkedplay = 2; + else if (!strcasecmp(var->value, "parked")) + parkedplay = 1; + else + parkedplay = 0; + } else if (!strcasecmp(var->name, "xfersound")) { + ast_copy_string(xfersound, var->value, sizeof(xfersound)); + } else if (!strcasecmp(var->name, "xferfailsound")) { + ast_copy_string(xferfailsound, var->value, sizeof(xferfailsound)); + } else if (!strcasecmp(var->name, "pickupexten")) { + ast_copy_string(pickup_ext, var->value, sizeof(pickup_ext)); + } else if (!strcasecmp(var->name, "parkedmusicclass")) { + ast_copy_string(parkmohclass, var->value, sizeof(parkmohclass)); } + } - unmap_features(); - for (var = ast_variable_browse(cfg, "featuremap"); var; var = var->next) { - if (remap_feature(var->name, var->value)) - ast_log(LOG_NOTICE, "Unknown feature '%s'\n", var->name); + unmap_features(); + for (var = ast_variable_browse(cfg, "featuremap"); var; var = var->next) { + if (remap_feature(var->name, var->value)) + ast_log(LOG_NOTICE, "Unknown feature '%s'\n", var->name); + } + + /* Map a key combination to an application*/ + ast_unregister_features(); + for (var = ast_variable_browse(cfg, "applicationmap"); var; var = var->next) { + char *tmp_val = ast_strdupa(var->value); + char *exten, *activateon, *activatedby, *app, *app_args, *moh_class; + struct ast_call_feature *feature; + + /* strsep() sets the argument to NULL if match not found, and it + * is safe to use it with a NULL argument, so we don't check + * between calls. + */ + exten = strsep(&tmp_val,","); + activatedby = strsep(&tmp_val,","); + app = strsep(&tmp_val,","); + app_args = strsep(&tmp_val,","); + moh_class = strsep(&tmp_val,","); + + activateon = strsep(&activatedby, "/"); + + /*! \todo XXX var_name or app_args ? */ + if (ast_strlen_zero(app) || ast_strlen_zero(exten) || ast_strlen_zero(activateon) || ast_strlen_zero(var->name)) { + ast_log(LOG_NOTICE, "Please check the feature Mapping Syntax, either extension, name, or app aren't provided %s %s %s %s\n", + app, exten, activateon, var->name); + continue; } - /* Map a key combination to an application*/ - ast_unregister_features(); - for (var = ast_variable_browse(cfg, "applicationmap"); var; var = var->next) { - char *tmp_val = ast_strdupa(var->value); - char *exten, *activateon, *activatedby, *app, *app_args, *moh_class; - struct ast_call_feature *feature; - - /* strsep() sets the argument to NULL if match not found, and it - * is safe to use it with a NULL argument, so we don't check - * between calls. - */ - exten = strsep(&tmp_val,","); - activatedby = strsep(&tmp_val,","); - app = strsep(&tmp_val,","); - app_args = strsep(&tmp_val,","); - moh_class = strsep(&tmp_val,","); - - activateon = strsep(&activatedby, "/"); - - /*! \todo XXX var_name or app_args ? */ - if (ast_strlen_zero(app) || ast_strlen_zero(exten) || ast_strlen_zero(activateon) || ast_strlen_zero(var->name)) { - ast_log(LOG_NOTICE, "Please check the feature Mapping Syntax, either extension, name, or app aren't provided %s %s %s %s\n", - app, exten, activateon, var->name); - continue; - } + if ((feature = find_feature(var->name))) { + ast_log(LOG_WARNING, "Dynamic Feature '%s' specified more than once!\n", var->name); + continue; + } + + if (!(feature = ast_calloc(1, sizeof(*feature)))) + continue; - if ((feature = find_feature(var->name))) { - ast_log(LOG_WARNING, "Dynamic Feature '%s' specified more than once!\n", var->name); - continue; - } - - if (!(feature = ast_calloc(1, sizeof(*feature)))) - continue; + ast_copy_string(feature->sname, var->name, FEATURE_SNAME_LEN); + ast_copy_string(feature->app, app, FEATURE_APP_LEN); + ast_copy_string(feature->exten, exten, FEATURE_EXTEN_LEN); + + if (app_args) + ast_copy_string(feature->app_args, app_args, FEATURE_APP_ARGS_LEN); - ast_copy_string(feature->sname, var->name, FEATURE_SNAME_LEN); - ast_copy_string(feature->app, app, FEATURE_APP_LEN); - ast_copy_string(feature->exten, exten, FEATURE_EXTEN_LEN); + if (moh_class) + ast_copy_string(feature->moh_class, moh_class, FEATURE_MOH_LEN); - if (app_args) - ast_copy_string(feature->app_args, app_args, FEATURE_APP_ARGS_LEN); - - if (moh_class) - ast_copy_string(feature->moh_class, moh_class, FEATURE_MOH_LEN); - - ast_copy_string(feature->exten, exten, sizeof(feature->exten)); - feature->operation = feature_exec_app; - ast_set_flag(feature, AST_FEATURE_FLAG_NEEDSDTMF); - - /* Allow caller and calle to be specified for backwards compatability */ - if (!strcasecmp(activateon, "self") || !strcasecmp(activateon, "caller")) - ast_set_flag(feature, AST_FEATURE_FLAG_ONSELF); - else if (!strcasecmp(activateon, "peer") || !strcasecmp(activateon, "callee")) - ast_set_flag(feature, AST_FEATURE_FLAG_ONPEER); - else { - ast_log(LOG_NOTICE, "Invalid 'ActivateOn' specification for feature '%s'," - " must be 'self', or 'peer'\n", var->name); - continue; - } + ast_copy_string(feature->exten, exten, sizeof(feature->exten)); + feature->operation = feature_exec_app; + ast_set_flag(feature, AST_FEATURE_FLAG_NEEDSDTMF); + + /* Allow caller and calle to be specified for backwards compatability */ + if (!strcasecmp(activateon, "self") || !strcasecmp(activateon, "caller")) + ast_set_flag(feature, AST_FEATURE_FLAG_ONSELF); + else if (!strcasecmp(activateon, "peer") || !strcasecmp(activateon, "callee")) + ast_set_flag(feature, AST_FEATURE_FLAG_ONPEER); + else { + ast_log(LOG_NOTICE, "Invalid 'ActivateOn' specification for feature '%s'," + " must be 'self', or 'peer'\n", var->name); + continue; + } - if (ast_strlen_zero(activatedby)) - ast_set_flag(feature, AST_FEATURE_FLAG_BYBOTH); - else if (!strcasecmp(activatedby, "caller")) - ast_set_flag(feature, AST_FEATURE_FLAG_BYCALLER); - else if (!strcasecmp(activatedby, "callee")) - ast_set_flag(feature, AST_FEATURE_FLAG_BYCALLEE); - else if (!strcasecmp(activatedby, "both")) - ast_set_flag(feature, AST_FEATURE_FLAG_BYBOTH); - else { - ast_log(LOG_NOTICE, "Invalid 'ActivatedBy' specification for feature '%s'," - " must be 'caller', or 'callee', or 'both'\n", var->name); - continue; - } + if (ast_strlen_zero(activatedby)) + ast_set_flag(feature, AST_FEATURE_FLAG_BYBOTH); + else if (!strcasecmp(activatedby, "caller")) + ast_set_flag(feature, AST_FEATURE_FLAG_BYCALLER); + else if (!strcasecmp(activatedby, "callee")) + ast_set_flag(feature, AST_FEATURE_FLAG_BYCALLEE); + else if (!strcasecmp(activatedby, "both")) + ast_set_flag(feature, AST_FEATURE_FLAG_BYBOTH); + else { + ast_log(LOG_NOTICE, "Invalid 'ActivatedBy' specification for feature '%s'," + " must be 'caller', or 'callee', or 'both'\n", var->name); + continue; + } - ast_register_feature(feature); - - if (option_verbose >= 1) - ast_verbose(VERBOSE_PREFIX_2 "Mapping Feature '%s' to app '%s(%s)' with code '%s'\n", var->name, app, app_args, exten); - } - } + ast_register_feature(feature); + + if (option_verbose >= 1) + ast_verbose(VERBOSE_PREFIX_2 "Mapping Feature '%s' to app '%s(%s)' with code '%s'\n", var->name, app, app_args, exten); + } ast_config_destroy(cfg); /* Remove the old parking extension */ diff --git a/res/res_indications.c b/res/res_indications.c index 18e79e2de..d12868d9c 100644 --- a/res/res_indications.c +++ b/res/res_indications.c @@ -238,7 +238,7 @@ static int ind_load_module(void) /* yup, checked it out. It is NOT written to. */ cfg = ast_config_load((char *)config); if (!cfg) - return 0; + return -1; /* Use existing config to populate the Indication table */ cxt = ast_category_browse(cfg, NULL); @@ -381,8 +381,7 @@ static int unload_module(void) static int load_module(void) { if (ind_load_module()) - return -1; - + return AST_MODULE_LOAD_DECLINE; ast_cli_register(&add_indication_cli); ast_cli_register(&remove_indication_cli); ast_cli_register(&show_indications_cli); diff --git a/res/res_jabber.c b/res/res_jabber.c index ed6d37321..0a98d2693 100644 --- a/res/res_jabber.c +++ b/res/res_jabber.c @@ -80,7 +80,7 @@ static int aji_show_clients(int fd, int argc, char *argv[]); static int aji_create_client(char *label, struct ast_variable *var, int debug); static int aji_create_buddy(char *label, struct aji_client *client); static int aji_create_transport(char *label, struct aji_client *client); -static void aji_reload(void); +static int aji_reload(void); static int aji_load_config(void); static void aji_pruneregister(struct aji_client *client); static int aji_register_transport(void *data, ikspak *pak); @@ -2263,23 +2263,25 @@ static int manager_jabber_send( struct mansession *s, struct message *m ) } -static void aji_reload() +static int aji_reload() { ASTOBJ_CONTAINER_MARKALL(&clients); - if (!aji_load_config()) + if (!aji_load_config()) { ast_log(LOG_ERROR, "JABBER: Failed to load config.\n"); - else { - ASTOBJ_CONTAINER_PRUNE_MARKED(&clients, aji_client_destroy); - ASTOBJ_CONTAINER_TRAVERSE(&clients, 1, { - ASTOBJ_RDLOCK(iterator); - if(iterator->state == AJI_DISCONNECTED) { - if (!iterator->thread) - ast_pthread_create(&iterator->thread, NULL, aji_recv_loop, iterator); - } else if (iterator->state == AJI_CONNECTING) - aji_get_roster(iterator); - ASTOBJ_UNLOCK(iterator); - }); + return 0; } + ASTOBJ_CONTAINER_PRUNE_MARKED(&clients, aji_client_destroy); + ASTOBJ_CONTAINER_TRAVERSE(&clients, 1, { + ASTOBJ_RDLOCK(iterator); + if(iterator->state == AJI_DISCONNECTED) { + if (!iterator->thread) + ast_pthread_create(&iterator->thread, NULL, aji_recv_loop, iterator); + } else if (iterator->state == AJI_CONNECTING) + aji_get_roster(iterator); + ASTOBJ_UNLOCK(iterator); + }); + + return 1; } static int unload_module(void) @@ -2307,7 +2309,8 @@ static int unload_module(void) static int load_module(void) { ASTOBJ_CONTAINER_INIT(&clients); - aji_reload(); + if(!aji_reload()) + return AST_MODULE_LOAD_DECLINE; ast_manager_register2("JabberSend", EVENT_FLAG_SYSTEM, manager_jabber_send, "Sends a message to a Jabber Client", mandescr_jabber_send); ast_register_application(app_ajisend, aji_send_exec, ajisend_synopsis, ajisend_descrip); diff --git a/res/res_odbc.c b/res/res_odbc.c index 3d927b9a3..1d4f9b5af 100644 --- a/res/res_odbc.c +++ b/res/res_odbc.c @@ -216,89 +216,91 @@ static int load_odbc_config(void) struct odbc_class *new; config = ast_config_load(cfg); - if (config) { - for (cat = ast_category_browse(config, NULL); cat; cat=ast_category_browse(config, cat)) { - if (!strcasecmp(cat, "ENV")) { - for (v = ast_variable_browse(config, cat); v; v = v->next) { - setenv(v->name, v->value, 1); - ast_log(LOG_NOTICE, "Adding ENV var: %s=%s\n", v->name, v->value); - } - } else { - /* Reset all to defaults for each class of odbc connections */ - dsn = username = password = NULL; - enabled = 1; - connect = 0; - pooling = 0; - limit = 0; - for (v = ast_variable_browse(config, cat); v; v = v->next) { - if (!strcasecmp(v->name, "pooling")) { - pooling = 1; - } else if (!strcasecmp(v->name, "limit")) { - sscanf(v->value, "%d", &limit); - if (ast_true(v->value) && !limit) { - ast_log(LOG_WARNING, "Limit should be a number, not a boolean: '%s'. Setting limit to 1023 for ODBC class '%s'.\n", v->value, cat); - limit = 1023; - } else if (ast_false(v->value)) { - ast_log(LOG_WARNING, "Limit should be a number, not a boolean: '%s'. Disabling ODBC class '%s'.\n", v->value, cat); - enabled = 0; - break; - } - } else if (!strcasecmp(v->name, "enabled")) { - enabled = ast_true(v->value); - } else if (!strcasecmp(v->name, "pre-connect")) { - connect = ast_true(v->value); - } else if (!strcasecmp(v->name, "dsn")) { - dsn = v->value; - } else if (!strcasecmp(v->name, "username")) { - username = v->value; - } else if (!strcasecmp(v->name, "password")) { - password = v->value; + if (!config) { + ast_log(LOG_WARNING, "Unable to load config file res_odbc.conf\n"); + return -1; + } + for (cat = ast_category_browse(config, NULL); cat; cat=ast_category_browse(config, cat)) { + if (!strcasecmp(cat, "ENV")) { + for (v = ast_variable_browse(config, cat); v; v = v->next) { + setenv(v->name, v->value, 1); + ast_log(LOG_NOTICE, "Adding ENV var: %s=%s\n", v->name, v->value); + } + } else { + /* Reset all to defaults for each class of odbc connections */ + dsn = username = password = NULL; + enabled = 1; + connect = 0; + pooling = 0; + limit = 0; + for (v = ast_variable_browse(config, cat); v; v = v->next) { + if (!strcasecmp(v->name, "pooling")) { + pooling = 1; + } else if (!strcasecmp(v->name, "limit")) { + sscanf(v->value, "%d", &limit); + if (ast_true(v->value) && !limit) { + ast_log(LOG_WARNING, "Limit should be a number, not a boolean: '%s'. Setting limit to 1023 for ODBC class '%s'.\n", v->value, cat); + limit = 1023; + } else if (ast_false(v->value)) { + ast_log(LOG_WARNING, "Limit should be a number, not a boolean: '%s'. Disabling ODBC class '%s'.\n", v->value, cat); + enabled = 0; + break; } + } else if (!strcasecmp(v->name, "enabled")) { + enabled = ast_true(v->value); + } else if (!strcasecmp(v->name, "pre-connect")) { + connect = ast_true(v->value); + } else if (!strcasecmp(v->name, "dsn")) { + dsn = v->value; + } else if (!strcasecmp(v->name, "username")) { + username = v->value; + } else if (!strcasecmp(v->name, "password")) { + password = v->value; } + } - if (enabled && !ast_strlen_zero(dsn)) { - new = ast_calloc(1, sizeof(*new)); + if (enabled && !ast_strlen_zero(dsn)) { + new = ast_calloc(1, sizeof(*new)); - if (!new) { - res = -1; - break; - } + if (!new) { + res = -1; + break; + } - if (cat) - ast_copy_string(new->name, cat, sizeof(new->name)); - if (dsn) - ast_copy_string(new->dsn, dsn, sizeof(new->dsn)); - if (username) - ast_copy_string(new->username, username, sizeof(new->username)); - if (password) - ast_copy_string(new->password, password, sizeof(new->password)); + if (cat) + ast_copy_string(new->name, cat, sizeof(new->name)); + if (dsn) + ast_copy_string(new->dsn, dsn, sizeof(new->dsn)); + if (username) + ast_copy_string(new->username, username, sizeof(new->username)); + if (password) + ast_copy_string(new->password, password, sizeof(new->password)); - SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &new->env); - res = SQLSetEnvAttr(new->env, SQL_ATTR_ODBC_VERSION, (void *) SQL_OV_ODBC3, 0); + SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &new->env); + res = SQLSetEnvAttr(new->env, SQL_ATTR_ODBC_VERSION, (void *) SQL_OV_ODBC3, 0); - if ((res != SQL_SUCCESS) && (res != SQL_SUCCESS_WITH_INFO)) { - ast_log(LOG_WARNING, "res_odbc: Error SetEnv\n"); - SQLFreeHandle(SQL_HANDLE_ENV, new->env); - return res; - } + if ((res != SQL_SUCCESS) && (res != SQL_SUCCESS_WITH_INFO)) { + ast_log(LOG_WARNING, "res_odbc: Error SetEnv\n"); + SQLFreeHandle(SQL_HANDLE_ENV, new->env); + return res; + } - if (pooling) { - new->haspool = pooling; - if (limit) { - new->limit = limit; - } else { - ast_log(LOG_WARNING, "Pooling without also setting a limit is pointless. Changing limit from 0 to 5.\n"); - new->limit = 5; - } + if (pooling) { + new->haspool = pooling; + if (limit) { + new->limit = limit; + } else { + ast_log(LOG_WARNING, "Pooling without also setting a limit is pointless. Changing limit from 0 to 5.\n"); + new->limit = 5; } - - odbc_register_class(new, connect); - ast_log(LOG_NOTICE, "Registered ODBC class '%s' dsn->[%s]\n", cat, dsn); } + + odbc_register_class(new, connect); + ast_log(LOG_NOTICE, "Registered ODBC class '%s' dsn->[%s]\n", cat, dsn); } } - ast_config_destroy(config); } + ast_config_destroy(config); return res; } @@ -664,7 +666,8 @@ static int unload_module(void) static int load_module(void) { - load_odbc_config(); + if(load_odbc_config() == -1) + return AST_MODULE_LOAD_DECLINE; ast_cli_register(&odbc_show_struct); ast_log(LOG_NOTICE, "res_odbc loaded.\n"); return 0; diff --git a/res/res_smdi.c b/res/res_smdi.c index 5bb213bca..c939aba27 100644 --- a/res/res_smdi.c +++ b/res/res_smdi.c @@ -720,7 +720,7 @@ static int load_module(void) return res; } else if (res == 1) { ast_log(LOG_WARNING, "No SMDI interfaces are available to listen on, not starting SDMI listener.\n"); - return 0; + return AST_MODULE_LOAD_DECLINE;; } else return 0; } diff --git a/res/res_snmp.c b/res/res_snmp.c index d52329372..fbef97f0a 100644 --- a/res/res_snmp.c +++ b/res/res_snmp.c @@ -46,49 +46,51 @@ static int load_config(void) res_snmp_enabled = 0; res_snmp_agentx_subagent = 1; cfg = ast_config_load("res_snmp.conf"); - if (cfg) { - cat = ast_category_browse(cfg, NULL); - while (cat) { - var = ast_variable_browse(cfg, cat); - - if (strcasecmp(cat, "general") == 0) { - while (var) { - if (strcasecmp(var->name, "subagent") == 0) { - if (ast_true(var->value)) - res_snmp_agentx_subagent = 1; - else if (ast_false(var->value)) - res_snmp_agentx_subagent = 0; - else { - ast_log(LOG_ERROR, "Value '%s' does not evaluate to true or false.\n", var->value); - ast_config_destroy(cfg); - return 1; - } - } else if (strcasecmp(var->name, "enabled") == 0) { - res_snmp_enabled = ast_true(var->value); - } else { - ast_log(LOG_ERROR, "Unrecognized variable '%s' in category '%s'\n", var->name, cat); + if (!cfg) { + ast_log(LOG_WARNING, "Could not load res_snmp.conf\n"); + return 0; + } + cat = ast_category_browse(cfg, NULL); + while (cat) { + var = ast_variable_browse(cfg, cat); + + if (strcasecmp(cat, "general") == 0) { + while (var) { + if (strcasecmp(var->name, "subagent") == 0) { + if (ast_true(var->value)) + res_snmp_agentx_subagent = 1; + else if (ast_false(var->value)) + res_snmp_agentx_subagent = 0; + else { + ast_log(LOG_ERROR, "Value '%s' does not evaluate to true or false.\n", var->value); ast_config_destroy(cfg); return 1; } - var = var->next; + } else if (strcasecmp(var->name, "enabled") == 0) { + res_snmp_enabled = ast_true(var->value); + } else { + ast_log(LOG_ERROR, "Unrecognized variable '%s' in category '%s'\n", var->name, cat); + ast_config_destroy(cfg); + return 1; } - } else { - ast_log(LOG_ERROR, "Unrecognized category '%s'\n", cat); - ast_config_destroy(cfg); - return 1; + var = var->next; } - - cat = ast_category_browse(cfg, cat); + } else { + ast_log(LOG_ERROR, "Unrecognized category '%s'\n", cat); + ast_config_destroy(cfg); + return 1; } - ast_config_destroy(cfg); - } - return 0; + cat = ast_category_browse(cfg, cat); + } + ast_config_destroy(cfg); + return 1; } static int load_module(void) { - load_config(); + if(!load_config()) + return AST_MODULE_LOAD_DECLINE; ast_verbose(VERBOSE_PREFIX_1 "Loading [Sub]Agent Module\n"); |