aboutsummaryrefslogtreecommitdiffstats
path: root/apps
diff options
context:
space:
mode:
authorseanbright <seanbright@f38db490-d61c-443f-a65b-d21fe96a405b>2008-12-05 16:18:52 +0000
committerseanbright <seanbright@f38db490-d61c-443f-a65b-d21fe96a405b>2008-12-05 16:18:52 +0000
commita7f4ea1bdc01a55cd8e82141edc88590962ad853 (patch)
treeff921067ee38781d897d62684905804c52d1754a /apps
parentbe51e367c7a7bb7021c31f6ad0207d40ffa0806e (diff)
Merged revisions 161349-161350 via svnmerge from
https://origsvn.digium.com/svn/asterisk/trunk ........ r161349 | seanbright | 2008-12-05 10:56:15 -0500 (Fri, 05 Dec 2008) | 5 lines When using IMAP_STORAGE, it's important to convert bare newlines (\n) in emailbody and pagerbody to CR-LF so that the IMAP server doesn't spit out an error. This was informally reported on #asterisk-dev a few weeks ago. Reviewed by Mark M. on IRC. ........ r161350 | seanbright | 2008-12-05 11:04:36 -0500 (Fri, 05 Dec 2008) | 2 lines Use ast_free() instead of free(), pointed out by eliel on IRC. ........ git-svn-id: http://svn.digium.com/svn/asterisk/branches/1.6.1@161352 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'apps')
-rw-r--r--apps/app_voicemail.c101
1 files changed, 51 insertions, 50 deletions
diff --git a/apps/app_voicemail.c b/apps/app_voicemail.c
index 7e9779994..e973f717d 100644
--- a/apps/app_voicemail.c
+++ b/apps/app_voicemail.c
@@ -10092,6 +10092,51 @@ static void free_vm_zones(void)
AST_LIST_UNLOCK(&zones);
}
+static char *substitute_escapes(const char *value)
+{
+ char *current, *result;
+
+ /* Add 16 for fudge factor */
+ struct ast_str *str = ast_str_create(strlen(value) + 16);
+
+ /* Substitute strings \r, \n, and \t into the appropriate characters */
+ for (current = (char *) value; *current; current++) {
+ if (*current == '\\') {
+ current++;
+ if (!*current) {
+ ast_log(AST_LOG_NOTICE, "Incomplete escape at end of value.\n");
+ break;
+ }
+ switch (*current) {
+ case 'r':
+ ast_str_append(&str, 0, "\r");
+ break;
+ case 'n':
+#ifdef IMAP_STORAGE
+ if (!str->used || str->str[str->used - 1] != '\r') {
+ ast_str_append(&str, 0, "\r");
+ }
+#endif
+ ast_str_append(&str, 0, "\n");
+ break;
+ case 't':
+ ast_str_append(&str, 0, "\t");
+ break;
+ default:
+ ast_log(AST_LOG_NOTICE, "Substitution routine does not support this character: \\%c\n", *current);
+ break;
+ }
+ } else {
+ ast_str_append(&str, 0, "%c", *current);
+ }
+ }
+
+ result = ast_strdup(str->str);
+ ast_free(str);
+
+ return result;
+}
+
static int load_config(int reload)
{
struct ast_vm_user *current;
@@ -10682,61 +10727,17 @@ static int load_config(int reload)
adsiver = atoi(val);
}
}
- if ((val = ast_variable_retrieve(cfg, "general", "emailsubject")))
+ if ((val = ast_variable_retrieve(cfg, "general", "emailsubject"))) {
emailsubject = ast_strdup(val);
+ }
if ((val = ast_variable_retrieve(cfg, "general", "emailbody"))) {
- char *tmpread, *tmpwrite;
- emailbody = ast_strdup(val);
-
- /* substitute strings \t and \n into the appropriate characters */
- tmpread = tmpwrite = emailbody;
- while ((tmpwrite = strchr(tmpread,'\\'))) {
- switch (tmpwrite[1]) {
- case 'r':
- memmove(tmpwrite + 1, tmpwrite + 2, strlen(tmpwrite + 2) + 1);
- *tmpwrite = '\r';
- break;
- case 'n':
- memmove(tmpwrite + 1, tmpwrite + 2, strlen(tmpwrite + 2) + 1);
- *tmpwrite = '\n';
- break;
- case 't':
- memmove(tmpwrite + 1, tmpwrite + 2, strlen(tmpwrite + 2) + 1);
- *tmpwrite = '\t';
- break;
- default:
- ast_log(AST_LOG_NOTICE, "Substitution routine does not support this character: %c\n", tmpwrite[1]);
- }
- tmpread = tmpwrite + 1;
- }
+ emailbody = substitute_escapes(val);
}
- if ((val = ast_variable_retrieve(cfg, "general", "pagersubject")))
+ if ((val = ast_variable_retrieve(cfg, "general", "pagersubject"))) {
pagersubject = ast_strdup(val);
+ }
if ((val = ast_variable_retrieve(cfg, "general", "pagerbody"))) {
- char *tmpread, *tmpwrite;
- pagerbody = ast_strdup(val);
-
- /* substitute strings \t and \n into the appropriate characters */
- tmpread = tmpwrite = pagerbody;
- while ((tmpwrite = strchr(tmpread, '\\'))) {
- switch (tmpwrite[1]) {
- case 'r':
- memmove(tmpwrite + 1, tmpwrite + 2, strlen(tmpwrite + 2) + 1);
- *tmpwrite = '\r';
- break;
- case 'n':
- memmove(tmpwrite + 1, tmpwrite + 2, strlen(tmpwrite + 2) + 1);
- *tmpwrite = '\n';
- break;
- case 't':
- memmove(tmpwrite + 1, tmpwrite + 2, strlen(tmpwrite + 2) + 1);
- *tmpwrite = '\t';
- break;
- default:
- ast_log(AST_LOG_NOTICE, "Substitution routine does not support this character: %c\n", tmpwrite[1]);
- }
- tmpread = tmpwrite + 1;
- }
+ pagerbody = substitute_escapes(val);
}
AST_LIST_UNLOCK(&users);
ast_config_destroy(cfg);