mirror of
https://github.com/gnustep/libs-base.git
synced 2025-04-23 09:04:13 +00:00
windows socket fixes
This commit is contained in:
parent
90e0460466
commit
d444f1fb3f
3 changed files with 54 additions and 12 deletions
12
ChangeLog
12
ChangeLog
|
@ -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>
|
||||
|
||||
|
|
|
@ -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.
|
||||
*/
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue