commit e02975e88890f5bc98591e52be562311ecd4b5de
parent 06a5edb452a3806cb79a514a4e4d2f6f314efb94
Author: Michael Elkins <me@mutt.org>
Date: Thu, 15 Nov 2001 23:59:27 +0000
Added MaxMessages patch from Eivind Eklund <eivind@FreeBSD.org>.
config_defaults() can just use memcpy() instead of assigning each struct
member individually.
config_defaults() can be declared static
Diffstat:
M | NEWS | | | 5 | +++++ |
M | config.c | | | 40 | ++++++++++------------------------------ |
M | isync.1 | | | 20 | ++++++++++++++++++++ |
M | isync.h | | | 7 | ++++--- |
M | main.c | | | 3 | ++- |
M | sync.c | | | 40 | +++++++++++++++++++++++++++++++++++----- |
6 files changed, 76 insertions(+), 39 deletions(-)
diff --git a/NEWS b/NEWS
@@ -1,3 +1,8 @@
+[0.7]
+
+Added `MaxMessages' configuration option to allow tracking of only the most
+recently added message in the local mailbox.
+
[0.6]
Added `Delete' configuration option to correspond to the -d command line
diff --git a/config.c b/config.c
@@ -33,28 +33,10 @@
config_t *boxes = 0;
/* set defaults from the global configuration section */
-void
+static void
config_defaults (config_t * conf)
{
- conf->user = global.user;
- conf->pass = global.pass;
- conf->port = global.port;
- conf->box = global.box;
- conf->host = global.host;
- conf->max_size = global.max_size;
- conf->copy_deleted_to = global.copy_deleted_to;
- conf->use_namespace = global.use_namespace;
- conf->expunge = global.expunge;
- conf->delete = global.delete;
- conf->poll = global.poll;
-#if HAVE_LIBSSL
- conf->require_ssl = global.require_ssl;
- conf->use_imaps = global.use_imaps;
- conf->cert_file = global.cert_file;
- conf->use_sslv2 = global.use_sslv2;
- conf->use_sslv3 = global.use_sslv3;
- conf->use_tlsv1 = global.use_tlsv1;
-#endif
+ memcpy (conf, &global, sizeof (config_t));
}
#ifndef HAVE_STRNDUP
@@ -231,6 +213,13 @@ load_config (const char *where)
else
global.max_size = atol (val);
}
+ else if (!strcasecmp ("MaxMessages", cmd))
+ {
+ if (*cur)
+ (*cur)->max_messages = atol (val);
+ else
+ global.max_messages = atol (val);
+ }
else if (!strcasecmp ("UseNamespace", cmd))
{
if (*cur)
@@ -259,15 +248,6 @@ load_config (const char *where)
else
global.delete = (strcasecmp (val, "yes") == 0);
}
-#if 0
- else if (!strcasecmp ("Poll", cmd))
- {
- if (*cur)
- (*cur)->poll = atoi (val);
- else
- global.poll = atoi (val);
- }
-#endif
#if HAVE_LIBSSL
else if (!strcasecmp ("CertificateFile", cmd))
{
@@ -313,7 +293,7 @@ load_config (const char *where)
}
#endif
else if (buf[0])
- printf ("%s:%d:unknown command:%s\n", path, line, cmd);
+ printf ("%s:%d:unknown keyword:%s\n", path, line, cmd);
}
fclose (fp);
}
diff --git a/isync.1 b/isync.1
@@ -189,6 +189,26 @@ This directive is only meaningful the in
section (see below).
..
.TP
+\fBMaxMessages\fR \fIcount\fR
+Sets the number of messages
+.B isync
+should keep in a mailbox.
+This is useful for mailboxes where you keep a complete archive on the
+server, but want to mirror only the last messages (for instance, for mailing
+lists.)
+The messages that were the first to arrive in the mailbox (independent of the
+actual date of the message) will automatically be deleted if you tell
+pass
+.B isync
+the delete (-d, --delete) flag.
+Messages that are flagged (marked as important) will not be automatically
+deleted.
+If
+.I count
+is 0, the maximum number of messages is
+.B unlimited (Default: 0).
+..
+.TP
\fBMaxSize\fR \fIbytes\fR
Sets a threshold for the maximum message size (in bytes) for which
.B isync
diff --git a/isync.h b/isync.h
@@ -57,7 +57,7 @@ struct config
char *box;
char *alias;
char *copy_deleted_to;
- int poll; /* how often to poll (in seconds) 0 = OFF */
+ unsigned int max_messages;
off_t max_size;
config_t *next;
#if HAVE_LIBSSL
@@ -72,6 +72,7 @@ struct config
unsigned int use_namespace:1;
unsigned int expunge:1;
unsigned int delete:1;
+ unsigned int wanted:1;
};
/* struct representing local mailbox file */
@@ -106,6 +107,7 @@ struct message
unsigned int new:1; /* message is in the new/ subdir */
unsigned int changed:1; /* flags changed */
unsigned int dead:1; /* message doesn't exist on the server */
+ unsigned int wanted:1; /* when using MaxMessages, keep this message */
};
/* struct used for parsing IMAP lists */
@@ -166,9 +168,8 @@ char *cram (const char *, const char *, const char *);
char *next_arg (char **);
-int sync_mailbox (mailbox_t *, imap_t *, int, unsigned int);
+int sync_mailbox (mailbox_t *, imap_t *, int, unsigned int, unsigned int);
-void config_defaults (config_t *);
void load_config (const char *);
char * expand_strdup (const char *s);
config_t *find_box (const char *);
diff --git a/main.c b/main.c
@@ -151,6 +151,7 @@ main (int argc, char **argv)
global.user = strdup (pw->pw_name);
global.maildir = strdup (pw->pw_dir);
global.max_size = 0;
+ global.max_messages = 0;
global.use_namespace = 1;
#if HAVE_LIBSSL
/* this will probably annoy people, but its the best default just in
@@ -291,7 +292,7 @@ main (int argc, char **argv)
i |= SYNC_QUIET;
i |= (delete || box->delete) ? SYNC_DELETE : 0;
i |= (expunge || box->expunge) ? SYNC_EXPUNGE : 0;
- if (sync_mailbox (mail, imap, i, box->max_size))
+ if (sync_mailbox (mail, imap, i, box->max_size, box->max_messages))
exit (1);
if (!fast)
diff --git a/sync.c b/sync.c
@@ -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))