Hi everyone, I've been testing your patch with my local build of Mutt (along w/ new_mail_command) and, so far, it seems pretty stable. I'm quite happy with the fix.
Should I take a look at the code or anything of like that? How can I help to move this forward? Thanks, -Santiago. On Sat, May 02, 2015 at 01:20:25PM -0700, Yoshiki Vazquez-Baeza wrote: > Hi Allen, > > Thanks for sending this out, I've been using this since you sent it and > it is working as expected! This is awesome because I no longer have to > close my IMAP connections before closing my laptop! > > Do let me know if you need some specific testing or if there's something > else I can help with! > > Yoshiki. > > On (Apr-28-15|21:06), egbert. wrote: > > Hi all, > > > > > > There was an irritating glitch, which I have also seen mentioned a few > > > > times > > > > online. It is that if you have mutt open, pack up your laptop, and go > > > > somewhere else, mutt is completely unresponsive and needs to be killed. > > > > I > > > > tracked down what was causing this and to my satisfaction my fix works. > > > > > > > > Would you be interested in this patch? And, if the intended behaviour is > > > > that it should hang like this, then perhaps my fix could be implemented > > > > as a > > > > config variable. (It’s basically just a simple timeout + retry > > > > mechanism in > > > > the socket_connect function). > > > > > > Please go ahead and post your patch, either to this list, or perhaps to > > > a ticket. It looks like http://dev.mutt.org/trac/ticket/3369 or > > > http://dev.mutt.org/trac/ticket/3491 might be related. > > > > > > Most of the committers are quite busy right now, so it may take a while > > > to get a response. > > > > Attached is my patch for the hanging socket problem. > > > > I hope this fixes 3369 and 3491, which indeed sound very similar to the > > problem I reported. > > > > All comments welcome. > > > > I used hg export against the tip of the default branch to produce the diff; > > please let me know if you would rather have it another way. > > > > > > > > > Also, you’ve probably talked about this many times before, but is there > > > > a > > > > reason not to implement a config option to call a command when there is > > > > new > > > > mail? > > > > > > Yoshiki Vazquez Baeza posted a patch for this a couple months ago, and > > > David Champion is incorporating it into a related patch set. > > > > > > > Yours, Allen > > > # HG changeset patch > > # User misterfish <al...@netherrealm.net> > > # Date 1430247531 -7200 > > # Tue Apr 28 20:58:51 2015 +0200 > > # Node ID 65d3b99e229cefaec62e8205fec116a7c00fce72 > > # Parent 755a18da99bc0a57bd6e462f5971eba7b9f61604 > > Fix bug where mutt hangs indefinitely when, for example, you pack up your > > laptop and open it again somewhere else. > > > > Introduce a timeout on sockets ("socket_timeout" in muttrc, default 5 > > seconds) and a fixed number of retries for GNUTLS ("ssl_socket_num_tries" in > > muttrc, default is 2). > > > > Hopefully fixes #3369 and #3491. > > > > diff -r 755a18da99bc -r 65d3b99e229c globals.h > > --- a/globals.h Sat Apr 25 19:00:13 2015 -0700 > > +++ b/globals.h Tue Apr 28 20:58:51 2015 +0200 > > @@ -193,6 +193,8 @@ > > WHERE unsigned short Counter INITVAL (0); > > > > WHERE short ConnectTimeout; > > +WHERE short SocketTimeout; > > +WHERE short GNUTLSSocketNumTries; > > WHERE short HistSize; > > WHERE short MenuContext; > > WHERE short PagerContext; > > diff -r 755a18da99bc -r 65d3b99e229c init.h > > --- a/init.h Sat Apr 25 19:00:13 2015 -0700 > > +++ b/init.h Tue Apr 28 20:58:51 2015 +0200 > > @@ -2888,6 +2888,14 @@ > > ** variable. > > */ > > #endif /* USE_SMTP */ > > + { "socket_timeout", DT_NUM, R_NONE, UL &SocketTimeout, 5 }, > > + /* > > + ** .pp > > + ** Close inactive sockets after this many seconds. When set to zero or a > > + ** negative value, mutt will wait indefinitely on sockets, but be warned > > + ** that this can cause mutt to hang. If using GNUTLS, you must also set > > + ** $$ssl_socket_num_tries to a non-zero value. > > + */ > > { "sort", DT_SORT, R_INDEX|R_RESORT, UL &Sort, SORT_DATE > > }, > > /* > > ** .pp > > @@ -3025,6 +3033,15 @@ > > ** for use in any Diffie-Hellman key exchange. A value of 0 will use > > ** the default from the GNUTLS library. > > */ > > + { "ssl_socket_num_tries", DT_NUM, R_NONE, UL &GNUTLSSocketNumTries, 2 }, > > + /* > > + ** .pp > > + ** When using GNUTLS, this can be used in conjunction with > > + ** $$socket_timeout to cause the mailbox to close after the socket has > > + ** timed out this many times. If set to zero or a negative number, the > > + ** socket will wait for data indefinitely, but be aware that this can > > + ** cause mutt to hang. > > + */ > > # endif /* USE_SSL_GNUTLS */ > > { "ssl_starttls", DT_QUAD, R_NONE, OPT_SSLSTARTTLS, M_YES }, > > /* > > diff -r 755a18da99bc -r 65d3b99e229c mutt_socket.c > > --- a/mutt_socket.c Sat Apr 25 19:00:13 2015 -0700 > > +++ b/mutt_socket.c Tue Apr 28 20:58:51 2015 +0200 > > @@ -344,6 +344,7 @@ > > { > > int sa_size; > > int save_errno; > > + struct timeval socket_timeout_tv = {0}; > > > > if (sa->sa_family == AF_INET) > > sa_size = sizeof (struct sockaddr_in); > > @@ -364,6 +365,28 @@ > > > > save_errno = 0; > > > > + /* Set a timeout on the socket. > > + * Can be set to 0 for no timeout, but then, mutt can hang forever > > waiting > > + * for data. > > + * For OpenSSL this is enough to avoid hanging, but with GNUTLS, > > + * ssl_socket_num_tries must also be set in the config. > > + */ > > + > > + if (SocketTimeout > 0) { > > + socket_timeout_tv.tv_sec = SocketTimeout; > > + if (setsockopt(fd, > > + SOL_SOCKET, /* protocol level */ > > + SO_RCVTIMEO, /* optname */ > > + &socket_timeout_tv, /* const void *optval */ > > + sizeof(struct timeval) > > + )) > > + { > > + mutt_perror(_("Couldn't set socket_timeout")); > > + mutt_sleep(3); > > + return -1; > > + } > > + } > > + > > if (connect (fd, sa, sa_size) < 0) > > { > > save_errno = errno; > > diff -r 755a18da99bc -r 65d3b99e229c mutt_ssl_gnutls.c > > --- a/mutt_ssl_gnutls.c Sat Apr 25 19:00:13 2015 -0700 > > +++ b/mutt_ssl_gnutls.c Tue Apr 28 20:58:51 2015 +0200 > > @@ -131,6 +131,7 @@ > > { > > tlssockdata *data = conn->sockdata; > > int ret; > > + int try = 0; > > > > if (!data) > > { > > @@ -139,7 +140,20 @@ > > return -1; > > } > > > > + /* When the socket times out, ret is GNUTLS_E_AGAIN. > > + * When socket_timeout (SocketTimeout) is 0, the socket is set to > > + * blocking, and this will hang forever on gnutls_record_recv. > > + * If the timeout is set, but ssl_socket_num_tries (GNUTLSSocketNumTries) > > + * is equal to zero or a negative value, this will become an infinite > > loop > > + * and mutt will hang. > > + */ > > + > > do { > > + if (GNUTLSSocketNumTries > 0 && ++try > GNUTLSSocketNumTries) { > > + mutt_error(_("Timed out reading from socket, closing mailbox.")); > > + mutt_sleep(2); > > + return -1; > > + } > > ret = gnutls_record_recv (data->state, buf, len); > > if (ret < 0 && gnutls_error_is_fatal(ret) == 1) > > { > > >