bug-bash
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH] MAILPATH stopped working after update to Bash 4.0


From: Evgeniy Dushistov
Subject: Re: [PATCH] MAILPATH stopped working after update to Bash 4.0
Date: Mon, 26 Oct 2009 20:16:00 +0300
User-agent: Mutt/1.5.20 (2009-06-14)

On Sun, Oct 25, 2009 at 10:16:57PM -0400, Chet Ramey wrote:
> Evgeniy Dushistov wrote:
> > On Tue, May 26, 2009 at 04:11:23PM -0400, Chet Ramey wrote:
> >> Nikos Chantziaras wrote:
> >>> I have:
> >>>
> >>>   MAILPATH="/home/me/.maildir/new?You have new mail."
> >>>   MAILCHECK=60
> >>>
> >>> Bash 3.2 was correctly telling me about new mail arriving.  However,
> >>> after I updated to Bash 4.0, I constantly get a "You have new mail."
> >>> message every minute even though I actually don't have new mail.  Has
> >>> the mail notification feature changed in Bash 4.0?  I can't see anything
> >>> relevant in the man page or NEWS file.
> >> There was a small change made to the mail file initialization code, to
> >> keep from dropping the first "new mail" notification.  (In April, 2007,
> >> though, so you'd figure one of the testers would have caught a problem
> >> before now.)
> >>
> >> I don't use a maildir-aware mail program, but you can debug this by
> >> setting a breakpoint in mailcheck.c:check_mail().
> >>
> > 
> > I recently faced with the same problem, when package manager update
> > my bash from 3.x to 4.x.
> > I compared mailcheck.c from 3.2 and 4.0, and see only logic difference
> > in add_mail_file. When it function handle new file, it not read it's
> > date information as it was in 3.x, but set it to zero,
> 
> The change to use init_mail_file was intentional, but it doesn't set
> the mod time and access time to 0.  It initializes a mailpath entry,
> but doesn't call mailstat on the file until it's actually checking mail.
> Changing it back to call update_mail_file defeats the purpose of the
> change, which is to avoid calling mailstat and reading a potentially
> very large maildir until MAILCHECK is set and we need to.
> 

So, at now you see the root of problem?

mailfiles[i]->access_time = mailfiles[i]->mod_time is setted
to something: last_time_mail_checked or shell_start_time,

then in check_mail mailstat was called and then
comparission of mtime and finfo.st_mtime was done,
of course they not the same, so bash report
that you have mail in every maildir and mailbox.

The possible solutions, that works in right way in compare with
current state and also do not call mailstat on start:

Index: bash-4.0/mailcheck.c
===================================================================
--- bash-4.0.orig/mailcheck.c
+++ bash-4.0/mailcheck.c
@@ -268,7 +268,7 @@ file_mod_date_changed (i)
   mtime = mailfiles[i]->mod_time;
 
   if ((mailstat (file, &finfo) == 0) && (finfo.st_size > 0))
-    return (mtime != finfo.st_mtime);
+    return (mtime < finfo.st_mtime);
 
   if (finfo.st_size == 0 && mailfiles[i]->file_size > 0)
     UPDATE_MAIL_FILE (i, finfo);

or:

Index: bash-4.0/mailcheck.c
===================================================================
--- bash-4.0.orig/mailcheck.c
+++ bash-4.0/mailcheck.c
@@ -425,6 +425,9 @@ check_mail ()
       if (*current_mail_file == '\0')
        continue;
 
+      if (!(mailfiles[i]->flags & MBOX_INITIALIZED))
+             update_mail_file (i);
+
       if (file_mod_date_changed (i))
        {
          int file_is_bigger;


-- 
/Evgeniy





reply via email to

[Prev in Thread] Current Thread [Next in Thread]