windows socket fixes

This commit is contained in:
rfm 2024-02-13 15:09:43 +00:00
parent 90e0460466
commit d444f1fb3f
3 changed files with 54 additions and 12 deletions

View file

@ -1,7 +1,17 @@
2024-02-13 Richard Frith-Macdonald <rfm@gnu.org>
* Source/GSFileHandle.m:
* Source/GSNetwork.h:
* Source/GSSocketStream.m:
* Source/GSStream.m:
* Source/NSMessagePort.m:
* Source/NSSocketPort.m:
Improve handling of error responses from socket operations and tweak
behavior in windows to try to recognise end of connection more reliably.
2024-02-13 Richard Frith-Macdonald <rfm@gnu.org>
* Source/NSError.m: Make -description and -localizedDescription formats
match those used by OSX (14.3.1).
2024-02-12 Richard Frith-Macdonald <rfm@gnu.org>

View file

@ -2247,6 +2247,14 @@ setNonBlocking(SOCKET fd)
}
else
{
#if defined(_WIN32)
if (WSAECONNABORTED == eno)
{
readLen = 0; // Read end of file
readLen = -1;
}
else
#endif
if (socketWouldBlock(eno))
{
/* We need an event from the operating system
@ -2259,8 +2267,8 @@ setNonBlocking(SOCKET fd)
NSError *e = [NSError _systemError: eno];
[self _recordError: e];
readLen = -1;
}
readLen = -1;
}
}
else if (readLen == 0)
@ -2301,6 +2309,10 @@ setNonBlocking(SOCKET fd)
@"Received event for closed stream");
[_sibling _dispatch];
}
else if ([self streamStatus] == NSStreamStatusAtEnd)
{
[self _sendEvent: NSStreamEventEndEncountered];
}
else if ([self streamStatus] == NSStreamStatusError)
{
[self _sendEvent: NSStreamEventErrorOccurred];
@ -2529,20 +2541,29 @@ setNonBlocking(SOCKET fd)
}
else
{
#if defined(_WIN32)
if (WSAECONNABORTED == eno)
{
[_sibling _setStatus: NSStreamStatusAtEnd];
writeLen = 0;
}
else
#endif
if (socketWouldBlock(eno))
{
/* We need an event from the operating system
* to tell us we can start writing again.
*/
[self _setStatus: NSStreamStatusWriting];
writeLen = -1;
}
else
{
NSError *e = [NSError _systemError: eno];
[self _recordError: e];
writeLen = -1;
}
writeLen = -1;
}
}
else
@ -2794,6 +2815,10 @@ setNonBlocking(SOCKET fd)
@"Received event for closed stream");
[_sibling _dispatch];
}
else if ([self streamStatus] == NSStreamStatusAtEnd)
{
[self _sendEvent: NSStreamEventEndEncountered];
}
else if ([self streamStatus] == NSStreamStatusError)
{
[self _sendEvent: NSStreamEventErrorOccurred];
@ -3182,7 +3207,7 @@ setNonBlocking(SOCKET fd)
[outs _setSibling: ins];
*outputStream = (NSOutputStream*)outs;
}
/* Now the streams are redy to be opened.
/* Now the streams are ready to be opened.
*/
}

View file

@ -113,8 +113,7 @@ static RunLoopEventType typeForStream(NSStream *aStream)
RunLoopEventType type = typeForStream(aStream);
void *event = [aStream _loopID];
NSDebugMLLog(@"NSStream", @"%@ (type %d) to %@ mode %@",
aStream, type, self, mode);
NSDebugMLLog(@"NSStream", @"%@ %@, %@ (type %d)", self, aStream, mode, type);
[self addEvent: event
type: type
watcher: (id<RunLoopEvents>)aStream
@ -126,8 +125,7 @@ static RunLoopEventType typeForStream(NSStream *aStream)
RunLoopEventType type = typeForStream(aStream);
void *event = [aStream _loopID];
NSDebugMLLog(@"NSStream", @"%@ (desc %d,%d) from %@ mode %@",
aStream, (int)(intptr_t)event, type, self, mode);
NSDebugMLLog(@"NSStream", @"%@ %@, %@ (type %d)", self, aStream, mode, type);
/* We may have added the stream more than once (eg if the stream -open
* method was called more than once, so we need to remove all event
* registrations.
@ -226,7 +224,7 @@ static RunLoopEventType typeForStream(NSStream *aStream)
extra: (void*)extra
forMode: (NSString*)mode
{
NSDebugMLLog(@"NSStream", @"receivedEvent for %@ - %d", self, type);
NSDebugMLLog(@"NSStream", @"%@ %p, %d, %p, %@", self, data, type, extra, mode);
[self _dispatch];
}
@ -568,11 +566,11 @@ static RunLoopEventType typeForStream(NSStream *aStream)
@"%@ event:%@ delegate: %@", self, [self stringFromEvent: event], delegate);
if (event == NSStreamEventNone)
{
return;
// do nothing
}
else if (event == NSStreamEventOpenCompleted)
{
if ((_events & event) == 0)
if ((_events & NSStreamEventOpenCompleted) == 0)
{
_events |= NSStreamEventOpenCompleted;
if (delegate != nil)
@ -580,6 +578,15 @@ static RunLoopEventType typeForStream(NSStream *aStream)
[delegate stream: self
handleEvent: NSStreamEventOpenCompleted];
}
if ([self isKindOfClass: [NSOutputStream class]])
{
_events |= NSStreamEventHasSpaceAvailable;
if (delegate != nil)
{
[delegate stream: self
handleEvent: NSStreamEventHasSpaceAvailable];
}
}
}
}
else if (event == NSStreamEventHasBytesAvailable)
@ -616,11 +623,11 @@ static RunLoopEventType typeForStream(NSStream *aStream)
}
if ((_events & NSStreamEventHasSpaceAvailable) == 0)
{
_events |= NSStreamEventHasSpaceAvailable;
if (_currentStatus == NSStreamStatusWriting)
{
[self _setStatus: NSStreamStatusOpen];
}
_events |= NSStreamEventHasSpaceAvailable;
if (delegate != nil)
{
[delegate stream: self