Author: rfm
Date: Tue Jun 14 09:10:44 2016
New Revision: 39862

URL: http://svn.gna.org/viewcvs/gnustep?rev=39862&view=rev
Log:
Fixes for failure of connect() system call

Modified:
    libs/base/trunk/ChangeLog
    libs/base/trunk/Source/GSSocketStream.m
    libs/base/trunk/Source/GSStream.m
    libs/base/trunk/Tests/base/NSURLConnection/test01.m

Modified: libs/base/trunk/ChangeLog
URL: 
http://svn.gna.org/viewcvs/gnustep/libs/base/trunk/ChangeLog?rev=39862&r1=39861&r2=39862&view=diff
==============================================================================
--- libs/base/trunk/ChangeLog   (original)
+++ libs/base/trunk/ChangeLog   Tue Jun 14 09:10:44 2016
@@ -1,3 +1,29 @@
+2016-06-14  Richard Frith-Macdonald <[email protected]>
+
+       * Source/GSSocketStream.m: Fix for failure of connect() call.
+       * Source/GSStream.m: Fix event handling for failed streams.
+       * Tests/NSURLConnection/test01.m: Add testcases, fix reset of delegate.
+       Fixes for kfreebsd network stack being clever enough to fail the
+       connect() call if the remote port is on the same machine and has
+       no process listening on it.  Reported by Heintzmann
+
+2016-06-08  Richard Frith-Macdonald <[email protected]>
+
+       * Documentation/Base.gsdoc:
+       * Documentation/ReleaseNotes.gsdoc:
+       * Documentation/news.texi:
+       Documentation/release notes preparation for next release.
+
+       * Source/Makefile.postamble:
+       * Source/NSBundle.m:
+       * Source/NSPathUtilities.m:
+       * Source/NSString.m:
+       * Source/NSTask.m:
+       * configure.ac:
+       Changes to use the new multiarch path component cpu-host rather
+       than a host subdirectory inside a cpu directory.
+       * configure: Regenerate
+
 2016-06-07  Richard Frith-Macdonald <[email protected]>
 
        * Source/Additions/GSMime.m:

Modified: libs/base/trunk/Source/GSSocketStream.m
URL: 
http://svn.gna.org/viewcvs/gnustep/libs/base/trunk/Source/GSSocketStream.m?rev=39862&r1=39861&r2=39862&view=diff
==============================================================================
--- libs/base/trunk/Source/GSSocketStream.m     (original)
+++ libs/base/trunk/Source/GSSocketStream.m     Tue Jun 14 09:10:44 2016
@@ -1714,17 +1714,17 @@
   // could be opened because of sibling
   if ([self _isOpened])
     return;
+  if (_sibling && [_sibling streamStatus] == NSStreamStatusError)
+    {
+      [self _setStatus: NSStreamStatusError];
+      return;
+    }
   if (_passive || (_sibling && [_sibling _isOpened]))
     goto open_ok;
   // check sibling status, avoid double connect
   if (_sibling && [_sibling streamStatus] == NSStreamStatusOpening)
     {
       [self _setStatus: NSStreamStatusOpening];
-      return;
-    }
-  else if (_sibling && [_sibling streamStatus] == NSStreamStatusError)
-    {
-      [self _setStatus: NSStreamStatusError];
       return;
     }
   else
@@ -1771,13 +1771,10 @@
             }
           else
             {
-              /* Had an immediate connect error, so record it and remove
-               * any handlers because we want higher level code to be
-               * told about it.
+              /* Had an immediate connect error.
                */
-              [self _setHandler: nil];
-              [_sibling _setHandler: nil];
               [self _recordError];
+              [_sibling _recordError];
             }
 #if    defined(_WIN32)
           WSAEventSelect(_sock, _loopID, FD_ALL_EVENTS);
@@ -1787,7 +1784,7 @@
              [self _schedule];
              return;
            }
-          else
+          else if (NSStreamStatusOpening == _currentStatus)
             {
               NSRunLoop *r;
               NSDate    *d;
@@ -1976,6 +1973,10 @@
        @"Received event for closed stream");
       [_sibling _dispatch];
     }
+  else if ([self streamStatus] == NSStreamStatusError)
+    {
+      [self _sendEvent: NSStreamEventErrorOccurred];
+    }
   else
     {
       WSANETWORKEVENTS events;
@@ -2103,6 +2104,10 @@
     {
       myEvent = NSStreamEventEndEncountered;
     }
+  else if ([self streamStatus] == NSStreamStatusError)
+    {
+      myEvent = NSStreamEventErrorOccurred;
+    }
   else
     {
       [self _setStatus: NSStreamStatusOpen];
@@ -2196,17 +2201,17 @@
   // could be opened because of sibling
   if ([self _isOpened])
     return;
+  if (_sibling && [_sibling streamStatus] == NSStreamStatusError)
+    {
+      [self _setStatus: NSStreamStatusError];
+      return;
+    }
   if (_passive || (_sibling && [_sibling _isOpened]))
     goto open_ok;
   // check sibling status, avoid double connect
   if (_sibling && [_sibling streamStatus] == NSStreamStatusOpening)
     {
       [self _setStatus: NSStreamStatusOpening];
-      return;
-    }
-  else if (_sibling && [_sibling streamStatus] == NSStreamStatusError)
-    {
-      [self _setStatus: NSStreamStatusError];
       return;
     }
   else
@@ -2254,13 +2259,10 @@
             }
           else
             {
-              /* Had an immediate connect error, so record it and remove
-               * any handlers because we want higher level code to be
-               * told about it.
+              /* Had an immediate connect error.
                */
-              [self _setHandler: nil];
-              [_sibling _setHandler: nil];
               [self _recordError];
+              [_sibling _recordError];
             }
 #if    defined(_WIN32)
           WSAEventSelect(_sock, _loopID, FD_ALL_EVENTS);
@@ -2270,7 +2272,7 @@
              [self _schedule];
              return;
            }
-          else
+          else if (NSStreamStatusOpening == _currentStatus)
             {
               NSRunLoop *r;
               NSDate    *d;
@@ -2300,7 +2302,6 @@
   WSAEventSelect(_sock, _loopID, FD_ALL_EVENTS);
 #endif
   [super open];
-
 }
 
 
@@ -2409,6 +2410,10 @@
        @"Received event for closed stream");
       [_sibling _dispatch];
     }
+  else if ([self streamStatus] == NSStreamStatusError)
+    {
+      [self _sendEvent: NSStreamEventErrorOccurred];
+    }
   else
     {
       WSANETWORKEVENTS events;
@@ -2534,6 +2539,10 @@
     {
       myEvent = NSStreamEventEndEncountered;
     }
+  else if ([self streamStatus] == NSStreamStatusError)
+    {
+      myEvent = NSStreamEventErrorOccurred;
+    }
   else
     {
       [self _setStatus: NSStreamStatusOpen];

Modified: libs/base/trunk/Source/GSStream.m
URL: 
http://svn.gna.org/viewcvs/gnustep/libs/base/trunk/Source/GSStream.m?rev=39862&r1=39861&r2=39862&view=diff
==============================================================================
--- libs/base/trunk/Source/GSStream.m   (original)
+++ libs/base/trunk/Source/GSStream.m   Tue Jun 14 09:10:44 2016
@@ -88,29 +88,22 @@
  */
 static RunLoopEventType typeForStream(NSStream *aStream)
 {
+  NSStreamStatus        status = [aStream streamStatus];
+
+  if (NSStreamStatusError == status
+    || [aStream _loopID] == (void*)aStream)
+    {
+      return ET_TRIGGER;
+    }
 #if    defined(_WIN32)
-  if ([aStream _loopID] == (void*)aStream)
-    {
-      return ET_TRIGGER;
-    }
-  else
-    {
-      return ET_HANDLE;
-    }
+  return ET_HANDLE;
 #else
-  if ([aStream _loopID] == (void*)aStream)
-    {
-      return ET_TRIGGER;
-    }
-  else if ([aStream isKindOfClass: [NSOutputStream class]] == NO
-    && [aStream  streamStatus] != NSStreamStatusOpening)
+  if ([aStream isKindOfClass: [NSOutputStream class]] == NO
+    && status != NSStreamStatusOpening)
     {
       return ET_RDESC;
     }
-  else
-    {
-      return ET_WDESC; 
-    }
+  return ET_WDESC;     
 #endif
 }
 

Modified: libs/base/trunk/Tests/base/NSURLConnection/test01.m
URL: 
http://svn.gna.org/viewcvs/gnustep/libs/base/trunk/Tests/base/NSURLConnection/test01.m?rev=39862&r1=39861&r2=39862&view=diff
==============================================================================
--- libs/base/trunk/Tests/base/NSURLConnection/test01.m (original)
+++ libs/base/trunk/Tests/base/NSURLConnection/test01.m Tue Jun 14 09:10:44 2016
@@ -62,7 +62,6 @@
   urlString = @"http://127.0.0.1:19750";;
   req = [NSURLRequest requestWithURL: [NSURL URLWithString: urlString]];
   del = [[Delegate new] autorelease];
-  [del reset];
   [NSURLConnection connectionWithRequest: req
                                delegate: del];
   while (![del done] && duration < 3.0)
@@ -71,23 +70,26 @@
         runUntilDate: [NSDate dateWithTimeIntervalSinceNow: timing]];
       duration += timing;
     }
+  PASS([del done], "http test completes");
   PASS([del done] && nil != [del error],
     "connection to dead(not-listening) HTTP service");
+  [del reset];
 
   duration = 0.0;
   urlString = @"https://127.0.0.1:19750";;
   req = [NSURLRequest requestWithURL: [NSURL URLWithString: urlString]];
   [NSURLConnection connectionWithRequest: req
                                delegate: del];
-  [del reset];
   while (![del done] && duration < 3.0)
     {
       [[NSRunLoop currentRunLoop]
         runUntilDate: [NSDate dateWithTimeIntervalSinceNow: timing]];
       duration += timing;
     }
+  PASS([del done], "https test completes");
   PASS([del done] && nil != [del error],
     "connection to dead(not-listening) HTTPS service");
+  [del reset];
 
   [arp release]; arp = nil;
 


_______________________________________________
Gnustep-cvs mailing list
[email protected]
https://mail.gna.org/listinfo/gnustep-cvs

Reply via email to