|
@@ -42,7 +42,7 @@ find_msg (message_t * list, unsigned int uid)
|
|
|
|
|
|
int
|
|
|
sync_mailbox (mailbox_t * mbox, imap_t * imap, int flags,
|
|
|
- unsigned int max_size)
|
|
|
+ unsigned int max_size, unsigned int max_msgs)
|
|
|
{
|
|
|
message_t *cur;
|
|
|
message_t *tmp;
|
|
@@ -54,6 +54,7 @@ sync_mailbox (mailbox_t * mbox, imap_t * imap, int flags,
|
|
|
int ret;
|
|
|
int fetched = 0;
|
|
|
int upload = 0;
|
|
|
+ unsigned int msg_count;
|
|
|
|
|
|
if (mbox->uidvalidity > 0)
|
|
|
{
|
|
@@ -113,7 +114,8 @@ sync_mailbox (mailbox_t * mbox, imap_t * imap, int flags,
|
|
|
|
|
|
continue; /* not fatal */
|
|
|
}
|
|
|
- if (imap->box->max_size > 0 && sb.st_size > imap->box->max_size)
|
|
|
+ if (imap->box->max_size > 0
|
|
|
+ && sb.st_size > imap->box->max_size)
|
|
|
{
|
|
|
if ((flags & SYNC_QUIET) == 0)
|
|
|
printf
|
|
@@ -214,13 +216,41 @@ sync_mailbox (mailbox_t * mbox, imap_t * imap, int flags,
|
|
|
if (upload)
|
|
|
fprintf (stdout, " %d messages.\n", upload);
|
|
|
|
|
|
-
|
|
|
if ((flags & SYNC_QUIET) == 0)
|
|
|
{
|
|
|
fputs ("Fetching new messages", stdout);
|
|
|
fflush (stdout);
|
|
|
}
|
|
|
- for (cur = imap->msgs; cur; cur = cur->next)
|
|
|
+
|
|
|
+ if (max_msgs == 0)
|
|
|
+ max_msgs = UINT_MAX;
|
|
|
+ else
|
|
|
+ {
|
|
|
+ /* expire messages in excess of the max-count for this mailbox.
|
|
|
+ * flagged mails are considered sacrosant and not deleted.
|
|
|
+ * we have already done the upload to the server, so messing with
|
|
|
+ * the flags variable do not have remote side effects.
|
|
|
+ */
|
|
|
+ for (cur = imap->msgs, msg_count = 0;
|
|
|
+ cur && msg_count < max_msgs; cur = cur->next, msg_count++)
|
|
|
+ {
|
|
|
+ tmp = find_msg (mbox->msgs, cur->uid);
|
|
|
+ if (tmp)
|
|
|
+ tmp->wanted = 1;
|
|
|
+ }
|
|
|
+ for (cur = mbox->msgs; cur; cur = cur->next)
|
|
|
+ {
|
|
|
+ if (!cur->wanted && !(cur->flags & D_FLAGGED))
|
|
|
+ {
|
|
|
+ cur->flags |= D_DELETED;
|
|
|
+ cur->dead = 1;
|
|
|
+ mbox->deleted++;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ for (cur = imap->msgs, msg_count = 0;
|
|
|
+ cur && msg_count < max_msgs; cur = cur->next, msg_count++)
|
|
|
{
|
|
|
if (!cur->processed)
|
|
|
{
|
|
@@ -289,7 +319,7 @@ sync_mailbox (mailbox_t * mbox, imap_t * imap, int flags,
|
|
|
|
|
|
if (fsync (fd))
|
|
|
{
|
|
|
- perror ("fsync");
|
|
|
+ perror ("fsync");
|
|
|
close (fd);
|
|
|
}
|
|
|
else if (close (fd))
|