From 4f4bd237c8cd5939a76695779c62507d10c433a3 Mon Sep 17 00:00:00 2001 From: Rocco Rutte Date: Thu, 18 Jun 2009 14:45:55 +0200 Subject: [PATCH] UPDATING: add note about -a and -- --- UPDATING | 1 + mbox.c | 48 +++++++++++++++++++++++++++++++++--------------- 2 files changed, 34 insertions(+), 15 deletions(-) diff --git a/UPDATING b/UPDATING index 36a2fb7a..a41c54f8 100644 --- a/UPDATING +++ b/UPDATING @@ -30,6 +30,7 @@ hg tip: 1.5.19 (2009-01-05): + ! command-line arguments: -a now mandates -- at end of file list + support for SSL certificate chains + function works in pager, too + support for tokyocabinet (qdbm successor) diff --git a/mbox.c b/mbox.c index 36d496c8..730ba2e0 100644 --- a/mbox.c +++ b/mbox.c @@ -681,22 +681,32 @@ 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; + else + utimebuf.actime = utimebuf.modtime; + + utime (ctx->path, &utimebuf); } /* return values: @@ -712,6 +722,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 +914,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 +992,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 +1021,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 */ -- 2.40.0