diff options
Diffstat (limited to 'apps/app_voicemail.c')
-rw-r--r-- | apps/app_voicemail.c | 50 |
1 files changed, 46 insertions, 4 deletions
diff --git a/apps/app_voicemail.c b/apps/app_voicemail.c index ca473689b..6d3de2854 100644 --- a/apps/app_voicemail.c +++ b/apps/app_voicemail.c @@ -3923,6 +3923,8 @@ static int last_message_index(struct ast_vm_user *vmu, char *dir) DIR *msgdir; struct dirent *msgdirent; int msgdirint; + char extension[3]; + int stopcount = 0; /* Reading the entire directory into a file map scales better than * doing a stat repeatedly on a predicted sequence. I suspect this @@ -3933,14 +3935,20 @@ static int last_message_index(struct ast_vm_user *vmu, char *dir) } while ((msgdirent = readdir(msgdir))) { - if (sscanf(msgdirent->d_name, "msg%30d", &msgdirint) == 1 && msgdirint < MAXMSGLIMIT) + if (sscanf(msgdirent->d_name, "msg%30d.%3s", &msgdirint, extension) == 2 && msgdirint < MAXMSGLIMIT && !strcmp(extension, "txt")) { map[msgdirint] = 1; + stopcount++; + ast_debug(4, "%s map[%d] = %d, count = %d\n", dir, msgdirint, map[msgdirint], stopcount); + } } closedir(msgdir); for (x = 0; x < vmu->maxmsg; x++) { - if (map[x] == 0) + if (map[x] == 1) { + stopcount--; + } else if (map[x] == 0 && !stopcount) { break; + } } return x - 1; @@ -6021,6 +6029,36 @@ leave_vm_out: return res; } +#ifndef IMAP_STORAGE +static int resequence_mailbox(struct ast_vm_user *vmu, char *dir, int stopcount) +{ + /* we know the actual number of messages, so stop process when number is hit */ + + int x, dest; + char sfn[PATH_MAX]; + char dfn[PATH_MAX]; + + if (vm_lock_path(dir)) + return ERROR_LOCK_PATH; + + for (x = 0, dest = 0; dest != stopcount && x < vmu->maxmsg + 10; x++) { + make_file(sfn, sizeof(sfn), dir, x); + if (EXISTS(dir, x, sfn, NULL)) { + + if (x != dest) { + make_file(dfn, sizeof(dfn), dir, dest); + RENAME(dir, x, vmu->mailbox, vmu->context, dir, dest, sfn, dfn); + } + + dest++; + } + } + ast_unlock_path(dir); + + return dest; +} +#endif + static int say_and_wait(struct ast_channel *chan, int num, const char *language) { int d; @@ -7735,8 +7773,12 @@ static int open_mailbox(struct vm_state *vms, struct ast_vm_user *vmu, int box) if (last_msg < -1) { return last_msg; - } else if (vms->lastmsg != last_msg) { - ast_log(LOG_NOTICE, "Mailbox: %s, expected %d but found %d message(s) in box with max threshold of %d.\n", vms->curdir, last_msg + 1, vms->lastmsg + 1, vmu->maxmsg); + } +#ifndef ODBC_STORAGE + else if (vms->lastmsg != last_msg) { + ast_log(LOG_NOTICE, "Resequencing mailbox: %s, expected %d but found %d message(s) in box with max threshold of %d.\n", vms->curdir, last_msg + 1, vms->lastmsg + 1, vmu->maxmsg); + resequence_mailbox(vmu, vms->curdir, count_msg); +#endif } return 0; |