Эх сурвалжийг харах

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
Michael Elkins 23 жил өмнө
parent
commit
e02975e888
6 өөрчлөгдсөн 76 нэмэгдсэн , 39 устгасан
  1. 5 0
      NEWS
  2. 10 30
      config.c
  3. 20 0
      isync.1
  4. 4 3
      isync.h
  5. 2 1
      main.c
  6. 35 5
      sync.c

+ 5 - 0
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

+ 10 - 30
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 - 0
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

+ 4 - 3
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 *);

+ 2 - 1
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)

+ 35 - 5
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))