isync

mailbox synchronization program
git clone https://git.code.sf.net/p/isync/isync
Log | Files | Refs | README | LICENSE

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:
MNEWS | 5+++++
Mconfig.c | 40++++++++++------------------------------
Misync.1 | 20++++++++++++++++++++
Misync.h | 7++++---
Mmain.c | 3++-
Msync.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))