This is the mail archive of the cygwin@cygwin.com mailing list for the Cygwin project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: OpenSSL problem ? (Was Re: Pine 4.58 for Cygwin takes a very long time to close a certain IMAP INBOX)


On Wed, Nov 12, 2003 at 04:15:46PM -0200, Fr?d?ric L. W. Meunier wrote:
> On Wed, 12 Nov 2003, Brian Ford wrote:
> 
> > Corinna,
> >
> > Did you get a chance to look at the strace output he posted here:
> >
> > http://pervalidus.port5.com/tmp/imap.txt.gz
> >
> > A glance there by trained eyes might save him some time.  I don't have the
> > time or the training for mine :).  It appears to be stuck in close on the
> > socket after is has shutdown?
> 
> It seems to be cause by the firewall from my SpeedStream 5200.
> 
> 'a logout' worked once I disabled filtering 'TCP NULL', but the
> Pine delays remain.
> 
> Anyway, why it worked on plain Windows and Linux is another
> story. I don't have any other firewalls enabled.

fhandler_socket::close() tries to circumvent problems with unexpected
data loss which can occur, if an application exits without having
waited for the closesocket() call being successful.  The problem with
the latter is, that there's no way to find out.  Therefore Cygwin
lingers on closesocket(), even with non-blocking sockets.  I don't
know if that helps but you could try to build a Cygwin DLL which only
lingers if shutdown hasn't been called.  I tried it with ssh and it
seems at least not to disturb ssh operation.  Patch below.

Corinna

Index: fhandler_socket.cc
===================================================================
RCS file: /cvs/src/src/winsup/cygwin/fhandler_socket.cc,v
retrieving revision 1.111
diff -u -p -r1.111 fhandler_socket.cc
--- fhandler_socket.cc	25 Sep 2003 03:51:50 -0000	1.111
+++ fhandler_socket.cc	12 Nov 2003 18:32:18 -0000
@@ -1101,14 +1101,17 @@ fhandler_socket::close ()
 {
   int res = 0;
 
-  /* HACK to allow a graceful shutdown even if shutdown() hasn't been
-     called by the application. Note that this isn't the ultimate
-     solution but it helps in many cases. */
-  struct linger linger;
-  linger.l_onoff = 1;
-  linger.l_linger = 240; /* seconds. default 2MSL value according to MSDN. */
-  setsockopt (get_socket (), SOL_SOCKET, SO_LINGER,
-	      (const char *)&linger, sizeof linger);
+  if (!saw_shutdown_write ())
+    {
+      /* HACK to allow a graceful shutdown even if shutdown() hasn't been
+	 called by the application. Note that this isn't the ultimate
+	 solution but it helps in many cases. */
+      struct linger linger;
+      linger.l_onoff = 1;
+      linger.l_linger = 240; /* secs. default 2MSL value according to MSDN. */
+      setsockopt (get_socket (), SOL_SOCKET, SO_LINGER,
+		  (const char *)&linger, sizeof linger);
+    }
 
   while ((res = closesocket (get_socket ())) != 0)
     {


-- 
Corinna Vinschen                  Please, send mails regarding Cygwin to
Cygwin Developer                                mailto:cygwin@cygwin.com
Red Hat, Inc.

--
Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple
Problem reports:       http://cygwin.com/problems.html
Documentation:         http://cygwin.com/docs.html
FAQ:                   http://cygwin.com/faq/


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]