[Asterisk-cvs] asterisk/apps app_voicemail.c,1.151.2.1,1.151.2.2

russell at lists.digium.com russell at lists.digium.com
Mon Oct 11 21:38:43 CDT 2004


Update of /usr/cvsroot/asterisk/apps
In directory mongoose.digium.com:/tmp/cvs-serv27402/apps

Modified Files:
      Tag: v1-0
	app_voicemail.c 
Log Message:
add check for incorrect voicemail sequencing (bug #2436)


Index: app_voicemail.c
===================================================================
RCS file: /usr/cvsroot/asterisk/apps/app_voicemail.c,v
retrieving revision 1.151.2.1
retrieving revision 1.151.2.2
diff -u -d -r1.151.2.1 -r1.151.2.2
--- app_voicemail.c	8 Oct 2004 00:05:36 -0000	1.151.2.1
+++ app_voicemail.c	12 Oct 2004 01:39:21 -0000	1.151.2.2
@@ -708,6 +708,18 @@
 	return snprintf(dest, len, "%s/msg%04d", dir, num);
 }
 
+static int last_message_index(char *dir)
+{
+        int x;
+        char fn[256];
+        for (x=0;x<MAXMSG;x++) {
+                make_file(fn, sizeof(fn), dir, x);
+                if (ast_fileexists(fn, NULL, NULL) < 1)
+                        break;
+        }
+        return x-1;
+}
+
 static int
 inbuf(struct baseio *bio, FILE *fi)
 {
@@ -1528,16 +1540,56 @@
 
 static int count_messages(char *dir)
 {
-	int x;
-	char fn[256];
-	for (x=0;x<MAXMSG;x++) {
-		make_file(fn, sizeof(fn), dir, x);
-		if (ast_fileexists(fn, NULL, NULL) < 1)
-			break;
+	/* Find all .txt files - even if they are not in sequence from 0000 */
+
+
+	int vmcount = 0;
+	DIR *vmdir = NULL;
+	struct dirent *vment = NULL;
+
+	if ((vmdir = opendir(dir))) {
+		while ((vment = readdir(vmdir)))
+		{
+			if (strlen(vment->d_name) > 7 && !strncmp(vment->d_name + 7,".txt",4))
+			{
+				vmcount++;
+			}
+		}
+		closedir(vmdir);
+	}
+
+	return vmcount;
+}
+
+static void resequence_mailbox(char * dir)
+{
+	/* we know max messages, so stop process when number is hit */
+
+	int x,dest;
+	char sfn[256];
+	char dfn[256];
+	char stxt[256];
+	char dtxt[256];
+
+	for (x=0,dest=0;x<MAXMSG;x++) {
+		make_file(sfn, sizeof(sfn), dir, x);
+		if (ast_fileexists(sfn, NULL, NULL) > 0) {
+
+			if(x != dest) {
+				make_file(dfn, sizeof(dfn), dir, dest);
+				ast_filerename(sfn,dfn,NULL);
+
+				snprintf(stxt, sizeof(stxt), "%s.txt", sfn);
+				snprintf(dtxt, sizeof(dtxt), "%s.txt", dfn);
+				rename(stxt, dtxt);
+			}
+
+			dest++;
+		}
 	}
-	return x;
 }
 
+
 static int say_and_wait(struct ast_channel *chan, int num, char *language)
 {
 	int d;
@@ -2548,6 +2600,20 @@
 	strncpy(vms->curbox, mbox(box), sizeof(vms->curbox) - 1);
 	make_dir(vms->curdir, sizeof(vms->curdir), vmu->context, vms->username, vms->curbox);
 	vms->lastmsg = count_messages(vms->curdir) - 1;
+
+	/*
+	The following test is needed in case sequencing gets messed up.
+	There appears to be more than one way to mess up sequence, so
+	we will not try to find all of the root causes--just fix it when
+	detected.
+	*/
+
+	if(vms->lastmsg != last_message_index(vms->curdir))
+	{
+		ast_log(LOG_NOTICE, "Resequencing Mailbox: %s\n", vms->curdir);
+		resequence_mailbox(vms->curdir);
+	}
+
 	snprintf(vms->vmbox, sizeof(vms->vmbox), "vm-%s", vms->curbox);
 }
 
@@ -3803,7 +3869,7 @@
 				if ((vmdir = opendir(dirname))) {
 					/* No matter what the format of VM, there will always be a .txt file for each message. */
 					while ((vment = readdir(vmdir)))
-						if (!strncmp(vment->d_name + 7,".txt",4))
+						if (strlen(vment->d_name) > 7 && !strncmp(vment->d_name + 7,".txt",4))
 							vmcount++;
 					closedir(vmdir);
 				}




More information about the svn-commits mailing list