[svn-commits] jpeeler: trunk r303679 - in /trunk: ./ apps/app_voicemail.c
SVN commits to the Digium repositories
svn-commits at lists.digium.com
Tue Jan 25 11:06:03 CST 2011
Author: jpeeler
Date: Tue Jan 25 11:05:56 2011
New Revision: 303679
URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=303679
Log:
Merged revisions 303678 via svnmerge from
https://origsvn.digium.com/svn/asterisk/branches/1.8
................
r303678 | jpeeler | 2011-01-25 11:02:38 -0600 (Tue, 25 Jan 2011) | 33 lines
Merged revisions 303677 via svnmerge from
https://origsvn.digium.com/svn/asterisk/branches/1.6.2
................
r303677 | jpeeler | 2011-01-25 10:59:28 -0600 (Tue, 25 Jan 2011) | 26 lines
Merged revisions 303676 via svnmerge from
https://origsvn.digium.com/svn/asterisk/branches/1.4
........
r303676 | jpeeler | 2011-01-25 10:58:29 -0600 (Tue, 25 Jan 2011) | 20 lines
Fix voicemail sequencing for file based storage.
A previous change was made to account for when the number of voicemail messages
exceeds the max limit to be handled properly, but it caused gaps in the messages
to not be properly handled. This has now been resolved.
In later non 1.4 branches, it appears that resequencing wasn't even occurring
due from what appears and accidental code removal.
(closes issue #18498)
Reported by: JJCinAZ
Patches:
bug18498v2.patch uploaded by jpeeler (license 325)
(closes issue #18486)
Reported by: bluefox
Patches:
bug18486.patch uploaded by jpeeler (license 325)
........
................
................
Modified:
trunk/ (props changed)
trunk/apps/app_voicemail.c
Propchange: trunk/
------------------------------------------------------------------------------
Binary property 'branch-1.8-merged' - no diff available.
Modified: trunk/apps/app_voicemail.c
URL: http://svnview.digium.com/svn/asterisk/trunk/apps/app_voicemail.c?view=diff&rev=303679&r1=303678&r2=303679
==============================================================================
--- trunk/apps/app_voicemail.c (original)
+++ trunk/apps/app_voicemail.c Tue Jan 25 11:05:56 2011
@@ -3923,6 +3923,8 @@
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 @@
}
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 @@
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 @@
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;
More information about the svn-commits
mailing list