mirror of
https://github.com/asterisk/asterisk.git
synced 2025-10-12 15:45:18 +00:00
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: https://origsvn.digium.com/svn/asterisk/trunk@41633 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
@@ -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);
|
||||
|
||||
|
@@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
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);
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
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);
|
||||
}
|
||||
|
||||
/* 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;
|
||||
|
||||
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);
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
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_config_destroy(cfg);
|
||||
|
||||
/* Remove the old parking extension */
|
||||
|
@@ -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);
|
||||
|
@@ -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);
|
||||
|
159
res/res_odbc.c
159
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 (enabled && !ast_strlen_zero(dsn)) {
|
||||
new = ast_calloc(1, sizeof(*new));
|
||||
|
||||
if (!new) {
|
||||
res = -1;
|
||||
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;
|
||||
}
|
||||
|
||||
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);
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
odbc_register_class(new, connect);
|
||||
ast_log(LOG_NOTICE, "Registered ODBC class '%s' dsn->[%s]\n", cat, dsn);
|
||||
} 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 (!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));
|
||||
|
||||
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 (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);
|
||||
}
|
||||
}
|
||||
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;
|
||||
|
@@ -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;
|
||||
}
|
||||
|
@@ -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 (!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;
|
||||
}
|
||||
} 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 (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");
|
||||
|
||||
|
Reference in New Issue
Block a user