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
This commit is contained in:
parent
06a5edb452
commit
e02975e888
5
NEWS
5
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
|
||||
|
|
40
config.c
40
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);
|
||||
}
|
||||
|
|
20
isync.1
20
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
|
||||
|
|
7
isync.h
7
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 *);
|
||||
|
|
3
main.c
3
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)
|
||||
|
|
38
sync.c
38
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)
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue
Block a user