From: Rocco Rutte Date: Fri, 19 Jun 2009 17:27:37 +0000 (+0200) Subject: Don't mangle atime/mtime for mbox folders without new mail upon sync. Closes #1362... X-Git-Tag: mutt-1-5-21-rel~225 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=0e031d4e0e5979db958651fc4a62fa9abae70e09;p=mutt Don't mangle atime/mtime for mbox folders without new mail upon sync. Closes #1362, #3271. --- diff --git a/ChangeLog b/ChangeLog index 32f9cc4b..61862adb 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,22 @@ +2009-06-19 19:23 +0200 Rocco Rutte (0fd362c870b8) + + * doc/manual.xml.head: Manual: Add note and example for type + conversions with my_vars + +2009-06-19 18:49 +0200 Rocco Rutte (9656d94b83b2) + + * .hgignore: Ignore files from manual.pdf generation + +2009-06-19 18:46 +0200 Rocco Rutte (439274e8eca4) + + * sendlib.c: Enforce 998 char length limit on header lines when + sending. + +2009-06-18 15:06 +0200 Antonio Radici (c6fe0bb8cf11) + + * .hgignore, ChangeLog, doc/Makefile.am, doc/smime_keys.man: Provide + smime_keys(1). Closes #3272. + 2009-06-18 14:56 +0200 Rocco Rutte (508bfe4a2e23) * mbox.c: Backout experimental patch diff --git a/mbox.c b/mbox.c index 36d496c8..ecd63f9d 100644 --- a/mbox.c +++ b/mbox.c @@ -681,22 +681,30 @@ int mbox_check_mailbox (CONTEXT *ctx, int *index_hint) /* if mailbox has at least 1 new message, sets mtime > atime of mailbox * so buffy check reports new mail */ -static void reset_atime (CONTEXT *ctx) +static void reset_atime (CONTEXT *ctx, struct stat *st) { struct utimbuf utimebuf; - int i; - time_t now = time (NULL); + int i, found = 0; + struct stat _st; - for (i = 0; i < ctx->msgcount; i++) + if (!st) { - if (!ctx->hdrs[i]->deleted && !ctx->hdrs[i]->read && !ctx->hdrs[i]->old) - { - utimebuf.actime = now - 1; - utimebuf.modtime = now; - utime (ctx->path, &utimebuf); + if (stat (ctx->path, &_st) < 0) return; - } + st = &_st; } + + utimebuf.actime = st->st_atime; + utimebuf.modtime = st->st_mtime; + + for (i = 0; !found && i < ctx->msgcount; i++) + if (!ctx->hdrs[i]->deleted && !ctx->hdrs[i]->read && !ctx->hdrs[i]->old) + found = 1; + + if (found && utimebuf.actime >= utimebuf.modtime) + utimebuf.actime = utimebuf.modtime - 1; + + utime (ctx->path, &utimebuf); } /* return values: @@ -712,6 +720,7 @@ int mbox_sync_mailbox (CONTEXT *ctx, int *index_hint) int need_sort = 0; /* flag to resort mailbox if new mail arrives */ int first = -1; /* first message to be written */ LOFF_T offset; /* location in mailbox to write changed messages */ + struct stat statbuf; struct m_update_t *newOffset = NULL; struct m_update_t *oldOffset = NULL; FILE *fp = NULL; @@ -903,6 +912,15 @@ int mbox_sync_mailbox (CONTEXT *ctx, int *index_hint) } fp = NULL; + /* Save the state of this folder. */ + if (stat (ctx->path, &statbuf) == -1) + { + mutt_perror (ctx->path); + mutt_sleep (5); + unlink (tempfile); + goto bail; + } + if ((fp = fopen (tempfile, "r")) == NULL) { mutt_unblock_signals (); @@ -972,6 +990,9 @@ int mbox_sync_mailbox (CONTEXT *ctx, int *index_hint) return (-1); } + /* Restore the previous access/modification times */ + reset_atime (ctx, &statbuf); + /* reopen the mailbox in read-only mode */ if ((ctx->fp = fopen (ctx->path, "r")) == NULL) { @@ -998,11 +1019,6 @@ int mbox_sync_mailbox (CONTEXT *ctx, int *index_hint) unlink (tempfile); /* remove partial copy of the mailbox */ mutt_unblock_signals (); - /* if mailbox has new mail, mangle atime+mtime to make buffy check - * report new mail for it */ - if (!option (OPTCHECKMBOXSIZE)) - reset_atime (ctx); - return (0); /* signal success */ bail: /* Come here in case of disaster */