some bugfixes ... socket stuff still not working

git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/base/trunk@22694 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
rfm 2006-03-21 16:22:42 +00:00
parent fa5f31547f
commit dd73a2c387

View file

@ -82,7 +82,7 @@ typedef int socklen_t;
@protected @protected
GSSocketOutputStream *_sibling; GSSocketOutputStream *_sibling;
BOOL _passive; /* YES means already connected */ BOOL _passive; /* YES means already connected */
WSAEVENT _event; SOCKET _sock;
} }
/** /**
@ -105,10 +105,8 @@ typedef int socklen_t;
*/ */
- (void) setPassive: (BOOL)passive; - (void) setPassive: (BOOL)passive;
/**
* setter for event
*/
- (void) setEvent: (WSAEVENT)event; - (void) setEvent: (WSAEVENT)event;
- (void) setSock: (SOCKET)sock;
@end @end
@ -160,7 +158,7 @@ typedef int socklen_t;
@protected @protected
GSSocketInputStream *_sibling; GSSocketInputStream *_sibling;
BOOL _passive; /* YES means already connected */ BOOL _passive; /* YES means already connected */
WSAEVENT _event; SOCKET _sock;
} }
/** /**
@ -187,6 +185,7 @@ typedef int socklen_t;
* setter for event * setter for event
*/ */
- (void) setEvent: (WSAEVENT)event; - (void) setEvent: (WSAEVENT)event;
- (void) setSock: (SOCKET)sock;
@end @end
@ -208,7 +207,7 @@ typedef int socklen_t;
*/ */
@interface GSSocketServerStream : GSAbstractServerStream @interface GSSocketServerStream : GSAbstractServerStream
{ {
WSAEVENT _event; SOCKET _sock;
} }
/** /**
* Return the class of the inputStream associated with this * Return the class of the inputStream associated with this
@ -592,7 +591,12 @@ static void setNonblocking(SOCKET fd)
- (void) setEvent: (WSAEVENT)event - (void) setEvent: (WSAEVENT)event
{ {
_event = event; _loopID = event;
}
- (void) setSock: (SOCKET)sock
{
_sock = sock;
} }
- (id) init - (id) init
@ -601,7 +605,7 @@ static void setNonblocking(SOCKET fd)
{ {
_sibling = nil; _sibling = nil;
_passive = NO; _passive = NO;
_event = WSA_INVALID_EVENT; _loopID = WSA_INVALID_EVENT;
} }
return self; return self;
} }
@ -629,7 +633,7 @@ static void setNonblocking(SOCKET fd)
} }
else else
{ {
int connectReturn = connect((SOCKET)_loopID, [self peerAddr], [self sockLen]); int connectReturn = connect(_sock, [self peerAddr], [self sockLen]);
if (connectReturn == SOCKET_ERROR if (connectReturn == SOCKET_ERROR
&& WSAGetLastError() != WSAEWOULDBLOCK) && WSAGetLastError() != WSAEWOULDBLOCK)
@ -642,10 +646,10 @@ static void setNonblocking(SOCKET fd)
{ {
unsigned i = [_modes count]; unsigned i = [_modes count];
WSAEventSelect((SOCKET)_loopID, _event, FD_ALL_EVENTS); WSAEventSelect(_sock, _loopID, FD_ALL_EVENTS);
while (i-- > 0) while (i-- > 0)
{ {
[_runloop addStream: self mode: [_modes objectAtIndex: 1]]; [_runloop addStream: self mode: [_modes objectAtIndex: i]];
} }
} }
[self _setStatus: NSStreamStatusOpening]; [self _setStatus: NSStreamStatusOpening];
@ -654,22 +658,22 @@ static void setNonblocking(SOCKET fd)
open_ok: open_ok:
[super open]; [super open];
setNonblocking((SOCKET)_loopID); setNonblocking(_sock);
WSAEventSelect((SOCKET)_loopID, _event, FD_ALL_EVENTS); WSAEventSelect(_sock, _loopID, FD_ALL_EVENTS);
} }
- (void) close - (void) close
{ {
// read shutdown is ignored, because the other side may shutdown first. // read shutdown is ignored, because the other side may shutdown first.
if (_sibling && [_sibling streamStatus]!=NSStreamStatusClosed) if (_sibling && [_sibling streamStatus]!=NSStreamStatusClosed)
shutdown((SOCKET)_loopID, SD_RECEIVE); shutdown(_sock, SD_RECEIVE);
else else
{ {
WSACloseEvent(_event); WSACloseEvent(_loopID);
closesocket((SOCKET)_loopID); closesocket(_sock);
} }
// safety against double close // safety against double close
_event = WSA_INVALID_EVENT; _loopID = WSA_INVALID_EVENT;
[super close]; [super close];
} }
@ -677,7 +681,7 @@ static void setNonblocking(SOCKET fd)
{ {
int readLen; int readLen;
readLen = recv((SOCKET)_loopID, buffer, len, 0); readLen = recv(_sock, buffer, len, 0);
if (readLen == SOCKET_ERROR) if (readLen == SOCKET_ERROR)
{ {
errno = WSAGetLastError(); errno = WSAGetLastError();
@ -724,7 +728,7 @@ static void setNonblocking(SOCKET fd)
return; return;
} }
if (WSAEnumNetworkEvents((SOCKET)_loopID, _event, &ocurredEvents) == SOCKET_ERROR) if (WSAEnumNetworkEvents(_sock, _loopID, &ocurredEvents) == SOCKET_ERROR)
{ {
errno = WSAGetLastError(); errno = WSAGetLastError();
[self _recordError]; [self _recordError];
@ -737,7 +741,7 @@ static void setNonblocking(SOCKET fd)
{ {
[_runloop removeStream: self mode: [_modes objectAtIndex: i]]; [_runloop removeStream: self mode: [_modes objectAtIndex: i]];
} }
getReturn = getsockopt((SOCKET)_loopID, SOL_SOCKET, SO_ERROR, getReturn = getsockopt(_sock, SOL_SOCKET, SO_ERROR,
(char*)&error, &len); (char*)&error, &len);
if (getReturn >= 0 && !error if (getReturn >= 0 && !error
@ -792,16 +796,6 @@ static void setNonblocking(SOCKET fd)
default: default:
break; break;
} }
// status may change now
myStatus = [self streamStatus];
if (myStatus == NSStreamStatusOpen)
{
[_runloop performSelector: @selector(_dispatch)
target: self
argument: nil
order: 0
modes: _modes];
}
if (_sibling && [_sibling _isOpened]) if (_sibling && [_sibling _isOpened])
[_sibling _dispatch]; [_sibling _dispatch];
} }
@ -1133,7 +1127,12 @@ static void setNonblocking(SOCKET fd)
- (void) setEvent: (WSAEVENT)event - (void) setEvent: (WSAEVENT)event
{ {
_event = event; _loopID = event;
}
- (void) setSock: (SOCKET)sock
{
_sock = sock;
} }
- (id) init - (id) init
@ -1142,7 +1141,7 @@ static void setNonblocking(SOCKET fd)
{ {
_sibling = nil; _sibling = nil;
_passive = NO; _passive = NO;
_event = WSA_INVALID_EVENT; _loopID = WSA_INVALID_EVENT;
} }
return self; return self;
} }
@ -1159,7 +1158,7 @@ static void setNonblocking(SOCKET fd)
{ {
int writeLen; int writeLen;
writeLen = send((SOCKET)_loopID, buffer, len, 0); writeLen = send(_sock, buffer, len, 0);
if (writeLen == SOCKET_ERROR) if (writeLen == SOCKET_ERROR)
{ {
errno = WSAGetLastError(); errno = WSAGetLastError();
@ -1195,7 +1194,7 @@ static void setNonblocking(SOCKET fd)
} }
else else
{ {
int connectReturn = connect((SOCKET)_loopID, [self peerAddr], [self sockLen]); int connectReturn = connect(_sock, [self peerAddr], [self sockLen]);
if (connectReturn == SOCKET_ERROR if (connectReturn == SOCKET_ERROR
&& WSAGetLastError() != WSAEWOULDBLOCK) && WSAGetLastError() != WSAEWOULDBLOCK)
@ -1208,11 +1207,11 @@ static void setNonblocking(SOCKET fd)
{ {
unsigned i = [_modes count]; unsigned i = [_modes count];
WSAEventSelect((SOCKET)_loopID, _event, FD_ALL_EVENTS); WSAEventSelect(_sock, _loopID, FD_ALL_EVENTS);
while (i-- > 0) while (i-- > 0)
{ {
[_runloop addStream: self mode: [_modes objectAtIndex: 1]]; [_runloop addStream: self mode: [_modes objectAtIndex: i]];
} }
} }
[self _setStatus: NSStreamStatusOpening]; [self _setStatus: NSStreamStatusOpening];
@ -1220,8 +1219,8 @@ static void setNonblocking(SOCKET fd)
} }
open_ok: open_ok:
setNonblocking((SOCKET)_loopID); setNonblocking(_sock);
WSAEventSelect((SOCKET)_loopID, _event, FD_ALL_EVENTS); WSAEventSelect(_sock, _loopID, FD_ALL_EVENTS);
[super open]; [super open];
} }
@ -1230,16 +1229,16 @@ static void setNonblocking(SOCKET fd)
// shutdown may fail (broken pipe). Record it. // shutdown may fail (broken pipe). Record it.
int closeReturn; int closeReturn;
if (_sibling && [_sibling streamStatus]!=NSStreamStatusClosed) if (_sibling && [_sibling streamStatus]!=NSStreamStatusClosed)
closeReturn = shutdown((SOCKET)_loopID, SD_SEND); closeReturn = shutdown(_sock, SD_SEND);
else else
{ {
WSACloseEvent(_event); WSACloseEvent(_loopID);
closeReturn = closesocket((SOCKET)_loopID); closeReturn = closesocket(_sock);
} }
if (closeReturn < 0) if (closeReturn < 0)
[self _recordError]; [self _recordError];
// safety against double close // safety against double close
_event = WSA_INVALID_EVENT; _loopID = WSA_INVALID_EVENT;
[super close]; [super close];
} }
@ -1262,7 +1261,7 @@ static void setNonblocking(SOCKET fd)
return; return;
} }
if (WSAEnumNetworkEvents((SOCKET)_loopID, _event, &ocurredEvents) == SOCKET_ERROR) if (WSAEnumNetworkEvents(_sock, _loopID, &ocurredEvents) == SOCKET_ERROR)
{ {
errno = WSAGetLastError(); errno = WSAGetLastError();
[self _recordError]; [self _recordError];
@ -1275,7 +1274,7 @@ static void setNonblocking(SOCKET fd)
{ {
[_runloop removeStream: self mode: [_modes objectAtIndex: i]]; [_runloop removeStream: self mode: [_modes objectAtIndex: i]];
} }
getReturn = getsockopt((SOCKET)_loopID, SOL_SOCKET, SO_ERROR, getReturn = getsockopt(_sock, SOL_SOCKET, SO_ERROR,
(char*)&error, &len); (char*)&error, &len);
if (getReturn >= 0 && !error if (getReturn >= 0 && !error
@ -1328,16 +1327,6 @@ static void setNonblocking(SOCKET fd)
default: default:
break; break;
} }
// status may change now
myStatus = [self streamStatus];
if (myStatus == NSStreamStatusOpen)
{
[_runloop performSelector: @selector(_dispatch)
target: self
argument: nil
order: 0
modes: _modes];
}
if (_sibling && [_sibling _isOpened]) if (_sibling && [_sibling _isOpened])
[_sibling _dispatch]; [_sibling _dispatch];
} }
@ -1396,8 +1385,8 @@ static void setNonblocking(SOCKET fd)
event = CreateEvent(NULL, NO, NO, NULL); event = CreateEvent(NULL, NO, NO, NULL);
NSAssert(sock >= 0, @"Cannot open socket"); NSAssert(sock >= 0, @"Cannot open socket");
[ins _setLoopID: (void*)(intptr_t)sock]; [ins setSock: sock];
[outs _setLoopID: (void*)(intptr_t)sock]; [outs setSock: sock];
[ins setEvent: event]; [ins setEvent: event];
[outs setEvent: event]; [outs setEvent: event];
@ -1712,7 +1701,7 @@ static void setNonblocking(SOCKET fd)
- (id) init - (id) init
{ {
if ((self = [super init]) != nil) if ((self = [super init]) != nil)
_event = WSA_INVALID_EVENT; _loopID = WSA_INVALID_EVENT;
return self; return self;
} }
- (void) dealloc - (void) dealloc
@ -1738,25 +1727,25 @@ static void setNonblocking(SOCKET fd)
- (void) open - (void) open
{ {
int bindReturn = bind((SOCKET)_loopID, [self serverAddr], [self sockLen]); int bindReturn = bind(_sock, [self serverAddr], [self sockLen]);
int listenReturn = listen((SOCKET)_loopID, SOCKET_BACKLOG); int listenReturn = listen(_sock, SOCKET_BACKLOG);
if (bindReturn < 0 || listenReturn) if (bindReturn < 0 || listenReturn)
{ {
[self _recordError]; [self _recordError];
return; return;
} }
setNonblocking((SOCKET)_loopID); setNonblocking(_sock);
_event = CreateEvent(NULL, NO, NO, NULL); _loopID = CreateEvent(NULL, NO, NO, NULL);
WSAEventSelect((SOCKET)_loopID, _event, FD_ALL_EVENTS); WSAEventSelect(_sock, _loopID, FD_ALL_EVENTS);
[super open]; [super open];
} }
- (void) close - (void) close
{ {
WSACloseEvent(_event); WSACloseEvent(_loopID);
// close a server socket is safe // close a server socket is safe
closesocket((SOCKET)_loopID); closesocket(_sock);
[super close]; [super close];
} }
@ -1766,7 +1755,7 @@ static void setNonblocking(SOCKET fd)
GSSocketInputStream *ins = AUTORELEASE([[self _inputStreamClass] new]); GSSocketInputStream *ins = AUTORELEASE([[self _inputStreamClass] new]);
GSSocketOutputStream *outs = AUTORELEASE([[self _outputStreamClass] new]); GSSocketOutputStream *outs = AUTORELEASE([[self _outputStreamClass] new]);
socklen_t len = [ins sockLen]; socklen_t len = [ins sockLen];
int acceptReturn = accept((SOCKET)_loopID, [ins peerAddr], &len); int acceptReturn = accept(_sock, [ins peerAddr], &len);
if (acceptReturn == INVALID_SOCKET) if (acceptReturn == INVALID_SOCKET)
{ {
@ -1787,8 +1776,8 @@ static void setNonblocking(SOCKET fd)
[outs setPassive: YES]; [outs setPassive: YES];
// copy the addr to outs // copy the addr to outs
memcpy([outs peerAddr], [ins peerAddr], len); memcpy([outs peerAddr], [ins peerAddr], len);
[ins _setLoopID: (void*)(intptr_t)acceptReturn]; [ins setSock: acceptReturn];
[outs _setLoopID: (void*)(intptr_t)acceptReturn]; [outs setSock: acceptReturn];
[ins setEvent: event]; [ins setEvent: event];
[outs setEvent: event]; [outs setEvent: event];
} }
@ -1808,7 +1797,7 @@ static void setNonblocking(SOCKET fd)
{ {
WSANETWORKEVENTS ocurredEvents; WSANETWORKEVENTS ocurredEvents;
if (WSAEnumNetworkEvents((SOCKET)_loopID, _event, &ocurredEvents) == SOCKET_ERROR) if (WSAEnumNetworkEvents(_sock, _loopID, &ocurredEvents) == SOCKET_ERROR)
{ {
errno = WSAGetLastError(); errno = WSAGetLastError();
[self _recordError]; [self _recordError];
@ -1854,7 +1843,7 @@ static void setNonblocking(SOCKET fd)
_serverAddr.sin_family = AF_INET; _serverAddr.sin_family = AF_INET;
_serverAddr.sin_port = htons(port); _serverAddr.sin_port = htons(port);
_serverAddr.sin_addr.s_addr = inet_addr(addr_c); _serverAddr.sin_addr.s_addr = inet_addr(addr_c);
_loopID = (void*)socket(AF_INET, SOCK_STREAM, 0); _sock = socket(AF_INET, SOCK_STREAM, 0);
if (_serverAddr.sin_addr.s_addr == INADDR_NONE || _loopID < 0) // error if (_serverAddr.sin_addr.s_addr == INADDR_NONE || _loopID < 0) // error
{ {
RELEASE(self); RELEASE(self);