quick and dirty patch for flushing seen state

John A. Tamplin jtampli at sph.emory.edu
Mon Dec 23 19:25:11 EST 2002


Here is a quick and dirty patch for flushing the seen state whenever it 
changes, relative to 2.1.11.  I have tested it on my production system 
and it seems fine, but use at your own risk.  The quick and dirty part 
is that the interface to index_check doesn't provide a way to pass the 
quiet flag to index_checkseen, so that means the client may see an extra 
untagged response giving the flags (and in fact in the case of a fetch n 
flags, multiple copies).  However, my reading of the protocol is that 
the client has to be prepared for these anyway, so I don't think it will 
be a problem.  If anyone tries it and notices any problems with any 
clients, please let me know.  The right way to fix it is to change the 
interface to index_check to include a quiet parameter, pass that 
parameter on to index_checkseen, and change all the calls to index_check 
to pass it appropriately.

-- 
John A. Tamplin
Unix Systems Administrator

-------------- next part --------------
--- /src.new/stock/cyrus-imapd-2.1.11/imap/imapd.c	Mon Nov 18 10:50:15 2002
+++ imapd.c	Mon Dec 23 19:15:46 2002
@@ -2948,8 +2948,8 @@
 
     if (usinguid) {
 	fetchitems |= FETCH_UID;
-	index_check(imapd_mailbox, 1, 0);
     }
+    index_check(imapd_mailbox, usinguid, 1);
 
     fetchargs.fetchitems = fetchitems;
     index_fetch(imapd_mailbox, sequence, usinguid, &fetchargs,
@@ -2958,6 +2958,9 @@
     if (fetchedsomething || usinguid) {
 	prot_printf(imapd_out, "%s OK %s\r\n", tag,
 		    error_message(IMAP_OK_COMPLETED));
+	if(fetchargs.fetchitems & FETCH_SETSEEN) {
+		index_check(imapd_mailbox,usinguid,1);
+	}
     } else {
 	/* normal FETCH, nothing came back */
 	prot_printf(imapd_out, "%s NO %s\r\n", tag,
@@ -3065,7 +3068,8 @@
 
     index_fetch(imapd_mailbox, msgno, 0, &fetchargs, &fetchedsomething);
 
-    index_check(imapd_mailbox, 0, 0);
+    index_check(imapd_mailbox, 0,
+	fetchedsomething && (fetchargs.fetchitems & FETCH_SETSEEN));
 
     if (fetchedsomething) {
 	prot_printf(imapd_out, "%s OK %s\r\n", tag,
@@ -3201,7 +3205,9 @@
     r = index_store(imapd_mailbox, sequence, usinguid, &storeargs,
 		    flag, nflags);
 
-    if (usinguid) {
+    if(storeargs.seen || storeargs.operation==STORE_REPLACE) {
+	index_check(imapd_mailbox, usinguid, 1);
+    } else if (usinguid) {
 	index_check(imapd_mailbox, 1, 0);
     }
 


More information about the Info-cyrus mailing list