[dovecot-cvs] dovecot/src/lib-storage/index/mbox mbox-from.c, 1.2, 1.3

cras at procontrol.fi cras at procontrol.fi
Tue Jun 15 20:13:26 EEST 2004


Update of /home/cvs/dovecot/src/lib-storage/index/mbox
In directory talvi:/tmp/cvs-serv11601/src/lib-storage/index/mbox

Modified Files:
	mbox-from.c 
Log Message:
Allow more From-line date formats.



Index: mbox-from.c
===================================================================
RCS file: /home/cvs/dovecot/src/lib-storage/index/mbox/mbox-from.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -d -r1.2 -r1.3
--- mbox-from.c	6 May 2004 01:22:25 -0000	1.2
+++ mbox-from.c	15 Jun 2004 17:13:23 -0000	1.3
@@ -1,5 +1,20 @@
 /* Copyright (C) 2002 Timo Sirainen */
 
+/*
+  Known formats to the VALID macro are:
+ 		From user Wed Dec  2 05:53 1992
+  BSD		From user Wed Dec  2 05:53:22 1992
+  SysV		From user Wed Dec  2 05:53 PST 1992
+  rn		From user Wed Dec  2 05:53:22 PST 1992
+ 		From user Wed Dec  2 05:53 -0700 1992
+  emacs	From user Wed Dec  2 05:53:22 -0700 1992
+ 		From user Wed Dec  2 05:53 1992 PST
+ 		From user Wed Dec  2 05:53:22 1992 PST
+ 		From user Wed Dec  2 05:53 1992 -0700
+  Solaris	From user Wed Dec  2 05:53:22 1992 -0700
+
+  */
+
 #include "lib.h"
 #include "str.h"
 #include "utc-mktime.h"
@@ -22,7 +37,7 @@
 {
 	const unsigned char *msg_start, *sender_end, *msg_end;
 	struct tm tm;
-	int i, timezone;
+	int i, timezone = 0, seen_timezone = FALSE;
 	time_t t;
 
 	*time_r = (time_t)-1;
@@ -44,9 +59,9 @@
 	/* next 24 chars should be in the date in asctime() format, eg.
 	   "Thu Nov 29 22:33:52 2001 +0300"
 
-	   Some also include named timezone, which we ignore:
-
-	   "Thu Nov 29 22:33:52 EEST 2001"
+	   - Some put the timezone before the year
+	   - Some use a named timezone before or after year, which we ignore
+	   - Some don't include seconds
 	*/
 	if (msg+24 > msg_end)
 		return -1;
@@ -94,16 +109,23 @@
 	msg += 3;
 
 	/* minute */
-	if (!i_isdigit(msg[0]) || !i_isdigit(msg[1]) || msg[2] != ':')
+	if (!i_isdigit(msg[0]) || !i_isdigit(msg[1]))
 		return -1;
 	tm.tm_min = (msg[0]-'0') * 10 + (msg[1]-'0');
-	msg += 3;
+	msg += 2;
 
-	/* second */
-	if (!i_isdigit(msg[0]) || !i_isdigit(msg[1]) || msg[2] != ' ')
-		return -1;
-	tm.tm_sec = (msg[0]-'0') * 10 + (msg[1]-'0');
-	msg += 3;
+	/* optional second */
+	if (msg[0] == ':') {
+		msg++;
+		if (!i_isdigit(msg[0]) || !i_isdigit(msg[1]) || msg[2] != ' ')
+			return -1;
+		tm.tm_sec = (msg[0]-'0') * 10 + (msg[1]-'0');
+		msg += 3;
+	} else {
+		if (msg[0] != ' ')
+			return -1;
+		msg++;
+	}
 
 	/* optional named timezone */
 	if (!i_isdigit(msg[0]) || !i_isdigit(msg[1]) ||
@@ -117,6 +139,15 @@
 		if (msg+5 > msg_end)
 			return -1;
 		msg++;
+	} else if ((msg[0] == '-' || msg[0] == '+') &&
+		   i_isdigit(msg[1]) && i_isdigit(msg[2]) &&
+		   i_isdigit(msg[3]) && i_isdigit(msg[4]) && msg[5] == ' ') {
+		/* numeric timezone, use it */
+                seen_timezone = TRUE;
+		timezone = (msg[1]-'0') * 1000 + (msg[2]-'0') * 100 +
+			(msg[3]-'0') * 10 +(msg[4]-'0');
+		if (msg[0] == '-') timezone = -timezone;
+		msg += 6;
 	}
 
 	/* year */
@@ -129,13 +160,17 @@
 	msg += 4;
 
 	tm.tm_isdst = -1;
-	if (msg[0] == ' ' && (msg[1] == '-' || msg[1] == '+') &&
+	if (!seen_timezone &&
+	    msg[0] == ' ' && (msg[1] == '-' || msg[1] == '+') &&
 	    i_isdigit(msg[2]) && i_isdigit(msg[3]) &&
 	    i_isdigit(msg[4]) && i_isdigit(msg[5])) {
+		seen_timezone = TRUE;
 		timezone = (msg[2]-'0') * 1000 + (msg[3]-'0') * 100 +
 			(msg[4]-'0') * 10 +(msg[5]-'0');
 		if (msg[1] == '-') timezone = -timezone;
+	}
 
+	if (seen_timezone) {
 		t = utc_mktime(&tm);
 		if (t == (time_t)-1)
 			return -1;



More information about the dovecot-cvs mailing list