]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
Fixes to commands after mails have been deleted. Patch by Nic Bellamy.
authorTimo Sirainen <tss@iki.fi>
Mon, 10 May 2004 01:28:19 +0000 (04:28 +0300)
committerTimo Sirainen <tss@iki.fi>
Mon, 10 May 2004 01:28:19 +0000 (04:28 +0300)
--HG--
branch : HEAD

src/pop3/client.c
src/pop3/client.h
src/pop3/commands.c

index 9ce47048d31140a1b71ef19a0e213cce3112de03..3ac77d4cbaefff51cf5f027c0454bc88b9dcc28f 100644 (file)
@@ -55,6 +55,7 @@ static int init_mailbox(struct client *client)
        }
 
        client->messages_count = status.messages;
+       client->deleted_size = 0;
        client->uidvalidity = status.uidvalidity;
 
        if (client->messages_count == 0)
@@ -76,6 +77,7 @@ static int init_mailbox(struct client *client)
                }
 
                client->total_size = 0;
+               client->deleted_size = 0;
                failed = FALSE;
                while ((mail = mailbox_search_next(ctx)) != NULL) {
                        uoff_t size = mail->get_size(mail);
index 74c51e4da997ff4e2f9fd4948a3cd13203d2096f..ee7d019b964be61e84f1bbba9aa313f535ad6f68 100644 (file)
@@ -16,9 +16,11 @@ struct client {
        unsigned int bad_counter;
 
        unsigned int messages_count;
+       unsigned int deleted_count;
        unsigned int uidvalidity;
        uoff_t *message_sizes;
        uoff_t total_size;
+       uoff_t deleted_size;
 
        unsigned char *deleted_bitmask;
 
index 62272bf59256c0aacd8ee6d647a11b5faa92959c..828f1d5fe22afe1a2ab0ae55b557a25322451047 100644 (file)
@@ -105,6 +105,8 @@ static int cmd_dele(struct client *client, const char *args)
        }
 
        client->deleted_bitmask[msgnum / CHAR_BIT] |= 1 << (msgnum % CHAR_BIT);
+       client->deleted_count++;
+       client->deleted_size += client->message_sizes[msgnum];
        client_send_line(client, "+OK Marked to be deleted.");
        return TRUE;
 }
@@ -115,8 +117,13 @@ static int cmd_list(struct client *client, const char *args)
 
        if (*args == '\0') {
                client_send_line(client, "+OK %u messages:",
-                                client->messages_count);
+                                client->messages_count - client->deleted_count);
                for (i = 0; i < client->messages_count; i++) {
+                       if (client->deleted) {
+                               if (client->deleted_bitmask[i / CHAR_BIT] &
+                                   (1 << (i % CHAR_BIT)))
+                                       continue;
+                       }
                        client_send_line(client, "%u %"PRIuUOFF_T,
                                         i+1, client->message_sizes[i]);
                }
@@ -321,6 +328,8 @@ static int cmd_rset(struct client *client, const char *args __attr_unused__)
        if (client->deleted) {
                client->deleted = FALSE;
                memset(client->deleted_bitmask, 0, MSGS_BITMASK_SIZE(client));
+               client->deleted_count = 0;
+               client->deleted_size = 0;
        }
 
        client_send_line(client, "+OK");
@@ -330,7 +339,8 @@ static int cmd_rset(struct client *client, const char *args __attr_unused__)
 static int cmd_stat(struct client *client, const char *args __attr_unused__)
 {
        client_send_line(client, "+OK %u %"PRIuUOFF_T, client->
-                        messages_count, client->total_size);
+                        messages_count - client->deleted_count,
+                        client->total_size - client->deleted_size);
        return TRUE;
 }
 
@@ -379,6 +389,13 @@ static void list_uids(struct client *client, unsigned int message)
        }
 
        while ((mail = mailbox_search_next(ctx)) != NULL) {
+               if (client->deleted) {
+                       uint32_t idx = mail->seq - 1;
+                       if (client->deleted_bitmask[idx / CHAR_BIT] &
+                           (1 << (idx % CHAR_BIT)))
+                               continue;
+               }
+
                client_send_line(client, message == 0 ?
                                 "%u %u.%u" : "+OK %u %u.%u",
                                 mail->seq, client->uidvalidity, mail->uid);