|
|
|
@ -540,6 +540,10 @@ AST_APP_OPTIONS(vm_app_options, {
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
static int load_config(int reload);
|
|
|
|
|
#ifdef TEST_FRAMEWORK
|
|
|
|
|
static int load_config_from_memory(int reload, struct ast_config *cfg, struct ast_config *ucfg);
|
|
|
|
|
#endif
|
|
|
|
|
static int actual_load_config(int reload, struct ast_config *cfg, struct ast_config *ucfg);
|
|
|
|
|
|
|
|
|
|
/*! \page vmlang Voicemail Language Syntaxes Supported
|
|
|
|
|
|
|
|
|
@ -11767,16 +11771,9 @@ static const char *substitute_escapes(const char *value)
|
|
|
|
|
|
|
|
|
|
static int load_config(int reload)
|
|
|
|
|
{
|
|
|
|
|
struct ast_vm_user *current;
|
|
|
|
|
struct ast_config *cfg, *ucfg;
|
|
|
|
|
char *cat;
|
|
|
|
|
struct ast_variable *var;
|
|
|
|
|
const char *val;
|
|
|
|
|
char *q, *stringp, *tmp;
|
|
|
|
|
int x;
|
|
|
|
|
int tmpadsi[4];
|
|
|
|
|
struct ast_flags config_flags = { reload ? CONFIG_FLAG_FILEUNCHANGED : 0 };
|
|
|
|
|
char secretfn[PATH_MAX] = "";
|
|
|
|
|
int res;
|
|
|
|
|
|
|
|
|
|
ast_unload_realtime("voicemail");
|
|
|
|
|
ast_unload_realtime("voicemail_data");
|
|
|
|
@ -11804,6 +11801,35 @@ static int load_config(int reload)
|
|
|
|
|
ucfg = NULL;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
res = actual_load_config(reload, cfg, ucfg);
|
|
|
|
|
|
|
|
|
|
ast_config_destroy(cfg);
|
|
|
|
|
ast_config_destroy(ucfg);
|
|
|
|
|
|
|
|
|
|
return res;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#ifdef TEST_FRAMEWORK
|
|
|
|
|
static int load_config_from_memory(int reload, struct ast_config *cfg, struct ast_config *ucfg)
|
|
|
|
|
{
|
|
|
|
|
ast_unload_realtime("voicemail");
|
|
|
|
|
ast_unload_realtime("voicemail_data");
|
|
|
|
|
return actual_load_config(reload, cfg, ucfg);
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
static int actual_load_config(int reload, struct ast_config *cfg, struct ast_config *ucfg)
|
|
|
|
|
{
|
|
|
|
|
struct ast_vm_user *current;
|
|
|
|
|
char *cat;
|
|
|
|
|
struct ast_variable *var;
|
|
|
|
|
const char *val;
|
|
|
|
|
char *q, *stringp, *tmp;
|
|
|
|
|
int x;
|
|
|
|
|
int tmpadsi[4];
|
|
|
|
|
char secretfn[PATH_MAX] = "";
|
|
|
|
|
|
|
|
|
|
#ifdef IMAP_STORAGE
|
|
|
|
|
ast_copy_string(imapparentfolder, "\0", sizeof(imapparentfolder));
|
|
|
|
|
#endif
|
|
|
|
@ -12401,7 +12427,6 @@ static int load_config(int reload)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
ast_config_destroy(ucfg);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* load mailboxes from voicemail.conf */
|
|
|
|
@ -12436,7 +12461,6 @@ static int load_config(int reload)
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
AST_LIST_UNLOCK(&users);
|
|
|
|
|
ast_config_destroy(cfg);
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
var = var->next;
|
|
|
|
@ -12447,7 +12471,6 @@ static int load_config(int reload)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
AST_LIST_UNLOCK(&users);
|
|
|
|
|
ast_config_destroy(cfg);
|
|
|
|
|
|
|
|
|
|
if (poll_mailboxes && poll_thread == AST_PTHREADT_NULL)
|
|
|
|
|
start_poll_thread();
|
|
|
|
@ -12458,8 +12481,6 @@ static int load_config(int reload)
|
|
|
|
|
} else {
|
|
|
|
|
AST_LIST_UNLOCK(&users);
|
|
|
|
|
ast_log(AST_LOG_WARNING, "Failed to load configuration file.\n");
|
|
|
|
|
if (ucfg)
|
|
|
|
|
ast_config_destroy(ucfg);
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
@ -12919,6 +12940,84 @@ AST_TEST_DEFINE(test_voicemail_notify_endl)
|
|
|
|
|
fclose(file);
|
|
|
|
|
return res;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
AST_TEST_DEFINE(test_voicemail_load_config)
|
|
|
|
|
{
|
|
|
|
|
int res = AST_TEST_PASS;
|
|
|
|
|
struct ast_vm_user *vmu;
|
|
|
|
|
struct ast_config *cfg;
|
|
|
|
|
char config_filename[32] = "/tmp/voicemail.conf.XXXXXX";
|
|
|
|
|
int fd;
|
|
|
|
|
FILE *file;
|
|
|
|
|
struct ast_flags config_flags = { CONFIG_FLAG_NOCACHE };
|
|
|
|
|
|
|
|
|
|
switch (cmd) {
|
|
|
|
|
case TEST_INIT:
|
|
|
|
|
info->name = "test_voicemail_load_config";
|
|
|
|
|
info->category = "/apps/app_voicemail/";
|
|
|
|
|
info->summary = "Test loading Voicemail config";
|
|
|
|
|
info->description =
|
|
|
|
|
"Verify that configuration is loaded consistently. "
|
|
|
|
|
"This is to test regressions of ASTERISK-18838 where it was noticed that "
|
|
|
|
|
"some options were loaded after the mailboxes were instantiated, causing "
|
|
|
|
|
"those options not to be set correctly.";
|
|
|
|
|
return AST_TEST_NOT_RUN;
|
|
|
|
|
case TEST_EXECUTE:
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* build a config file by hand... */
|
|
|
|
|
if ((fd = mkstemp(config_filename)) < 0) {
|
|
|
|
|
return AST_TEST_FAIL;
|
|
|
|
|
}
|
|
|
|
|
if (!(file = fdopen(fd, "w"))) {
|
|
|
|
|
close(fd);
|
|
|
|
|
unlink(config_filename);
|
|
|
|
|
return AST_TEST_FAIL;
|
|
|
|
|
}
|
|
|
|
|
fputs("[general]\ncallback=somecontext\nlocale=de_DE.UTF-8\ntz=european\n[test]", file);
|
|
|
|
|
fputs("00000001 => 9999,Mr. Test,,,callback=othercontext|locale=nl_NL.UTF-8|tz=central\n", file);
|
|
|
|
|
fputs("00000002 => 9999,Mrs. Test\n", file);
|
|
|
|
|
fclose(file);
|
|
|
|
|
|
|
|
|
|
if (!(cfg = ast_config_load(config_filename, config_flags))) {
|
|
|
|
|
res = AST_TEST_FAIL;
|
|
|
|
|
goto cleanup;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
load_config_from_memory(1, cfg, NULL);
|
|
|
|
|
ast_config_destroy(cfg);
|
|
|
|
|
|
|
|
|
|
#define CHECK(u, attr, value) else if (strcmp(u->attr, value)) { \
|
|
|
|
|
ast_test_status_update(test, "mailbox %s should have %s '%s', but has '%s'\n", \
|
|
|
|
|
u->mailbox, #attr, value, u->attr); res = AST_TEST_FAIL; break; }
|
|
|
|
|
|
|
|
|
|
AST_LIST_LOCK(&users);
|
|
|
|
|
AST_LIST_TRAVERSE(&users, vmu, list) {
|
|
|
|
|
if (!strcmp(vmu->mailbox, "00000001")) {
|
|
|
|
|
if (0); /* trick to get CHECK to work */
|
|
|
|
|
CHECK(vmu, callback, "othercontext")
|
|
|
|
|
CHECK(vmu, locale, "nl_NL.UTF-8")
|
|
|
|
|
CHECK(vmu, zonetag, "central")
|
|
|
|
|
} else if (!strcmp(vmu->mailbox, "00000002")) {
|
|
|
|
|
if (0); /* trick to get CHECK to work */
|
|
|
|
|
CHECK(vmu, callback, "somecontext")
|
|
|
|
|
CHECK(vmu, locale, "de_DE.UTF-8")
|
|
|
|
|
CHECK(vmu, zonetag, "european")
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
AST_LIST_UNLOCK(&users);
|
|
|
|
|
|
|
|
|
|
#undef CHECK
|
|
|
|
|
|
|
|
|
|
/* restore config */
|
|
|
|
|
load_config(1); /* this might say "Failed to load configuration file." */
|
|
|
|
|
|
|
|
|
|
cleanup:
|
|
|
|
|
unlink(config_filename);
|
|
|
|
|
return res;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#endif /* defined(TEST_FRAMEWORK) */
|
|
|
|
|
|
|
|
|
|
static int reload(void)
|
|
|
|
@ -12943,6 +13042,7 @@ static int unload_module(void)
|
|
|
|
|
res |= AST_TEST_UNREGISTER(test_voicemail_msgcount);
|
|
|
|
|
res |= AST_TEST_UNREGISTER(test_voicemail_vmuser);
|
|
|
|
|
res |= AST_TEST_UNREGISTER(test_voicemail_notify_endl);
|
|
|
|
|
res |= AST_TEST_UNREGISTER(test_voicemail_load_config);
|
|
|
|
|
#endif
|
|
|
|
|
ast_cli_unregister_multiple(cli_voicemail, ARRAY_LEN(cli_voicemail));
|
|
|
|
|
ast_uninstall_vm_functions();
|
|
|
|
@ -12992,6 +13092,7 @@ static int load_module(void)
|
|
|
|
|
res |= AST_TEST_REGISTER(test_voicemail_msgcount);
|
|
|
|
|
res |= AST_TEST_REGISTER(test_voicemail_vmuser);
|
|
|
|
|
res |= AST_TEST_REGISTER(test_voicemail_notify_endl);
|
|
|
|
|
res |= AST_TEST_REGISTER(test_voicemail_load_config);
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
if (res)
|
|
|
|
|