From: Timo Sirainen Date: Mon, 10 May 2004 01:28:19 +0000 (+0300) Subject: Fixes to commands after mails have been deleted. Patch by Nic Bellamy. X-Git-Tag: 1.1.alpha1~4112 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b6a11913502f0ff3fb00883dfc0d567a8e3a8903;p=thirdparty%2Fdovecot%2Fcore.git Fixes to commands after mails have been deleted. Patch by Nic Bellamy. --HG-- branch : HEAD --- diff --git a/src/pop3/client.c b/src/pop3/client.c index 9ce47048d3..3ac77d4cba 100644 --- a/src/pop3/client.c +++ b/src/pop3/client.c @@ -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); diff --git a/src/pop3/client.h b/src/pop3/client.h index 74c51e4da9..ee7d019b96 100644 --- a/src/pop3/client.h +++ b/src/pop3/client.h @@ -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; diff --git a/src/pop3/commands.c b/src/pop3/commands.c index 62272bf592..828f1d5fe2 100644 --- a/src/pop3/commands.c +++ b/src/pop3/commands.c @@ -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);