diff options
author | seanbright <seanbright@f38db490-d61c-443f-a65b-d21fe96a405b> | 2008-12-05 16:18:52 +0000 |
---|---|---|
committer | seanbright <seanbright@f38db490-d61c-443f-a65b-d21fe96a405b> | 2008-12-05 16:18:52 +0000 |
commit | a7f4ea1bdc01a55cd8e82141edc88590962ad853 (patch) | |
tree | ff921067ee38781d897d62684905804c52d1754a | |
parent | be51e367c7a7bb7021c31f6ad0207d40ffa0806e (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
-rw-r--r-- | apps/app_voicemail.c | 101 |
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); |