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