[dovecot-cvs] dovecot/src/lib-index/mbox mbox-from.c,1.12,1.13

cras at procontrol.fi cras at procontrol.fi
Fri Jul 11 14:48:02 EEST 2003


Update of /home/cvs/dovecot/src/lib-index/mbox
In directory danu:/tmp/cvs-serv1911/mbox

Modified Files:
	mbox-from.c 
Log Message:
Support numeric timezones in From-line



Index: mbox-from.c
===================================================================
RCS file: /home/cvs/dovecot/src/lib-index/mbox/mbox-from.c,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -d -r1.12 -r1.13
--- mbox-from.c	20 May 2003 18:05:32 -0000	1.12
+++ mbox-from.c	11 Jul 2003 10:47:59 -0000	1.13
@@ -2,6 +2,7 @@
 
 #include "lib.h"
 #include "str.h"
+#include "utc-mktime.h"
 #include "mbox-index.h"
 
 #include <time.h>
@@ -20,7 +21,8 @@
 {
 	const unsigned char *msg_end;
 	struct tm tm;
-	int i;
+	int i, timezone;
+	time_t t;
 
 	/* <sender> <date> <moreinfo> */
 	msg_end = msg + size;
@@ -33,10 +35,10 @@
 	}
 	while (msg < msg_end && *msg == ' ') msg++;
 
-	/* next 24 chars should be in the date in asctime() format,
-	   eg. "Thu Nov 29 22:33:52 2001"
+	/* next 24 chars should be in the date in asctime() format, eg.
+	   "Thu Nov 29 22:33:52 2001 +0300"
 
-	   Some some also include timezone:
+	   Some also include named timezone, which we ignore:
 
 	   "Thu Nov 29 22:33:52 EEST 2001"
 	*/
@@ -97,7 +99,7 @@
 	tm.tm_sec = (msg[0]-'0') * 10 + (msg[1]-'0');
 	msg += 3;
 
-	/* optional timezone */
+	/* optional named timezone */
 	if (!i_isdigit(msg[0]) || !i_isdigit(msg[1]) ||
 	    !i_isdigit(msg[2]) || !i_isdigit(msg[3])) {
 		/* skip to next space */
@@ -118,9 +120,26 @@
 
 	tm.tm_year = (msg[0]-'0') * 1000 + (msg[1]-'0') * 100 +
 		(msg[2]-'0') * 10 + (msg[3]-'0') - 1900;
+	msg += 4;
 
 	tm.tm_isdst = -1;
-	return mktime(&tm);
+	if ((msg[0] == '-' || msg[0] == '+') &&
+	    i_isdigit(msg[1]) && i_isdigit(msg[2]) &&
+	    i_isdigit(msg[3]) && i_isdigit(msg[4])) {
+		timezone = (msg[1]-'0') * 1000 + (msg[2]-'0') * 100 +
+			(msg[3]-'0') * 10 +(msg[4]-'0');
+		if (msg[0] == '-') timezone = -timezone;
+
+		t = utc_mktime(&tm);
+		if (t == (time_t)-1)
+			return (time_t)-1;
+
+		t -= timezone * 60;
+		return t;
+	} else {
+		/* assume local timezone */
+		return mktime(&tm);
+	}
 }
 
 const char *mbox_from_create(const char *sender, time_t time)



More information about the dovecot-cvs mailing list