--- a/Socket.st Thu Apr 03 15:21:31 2014 +0200
+++ b/Socket.st Thu Apr 03 15:23:44 2014 +0200
@@ -44,7 +44,6 @@
// linger.onoff=off linger.time= *irrelevant*
//# define SET_LINGER_WHEN_CREATING_SOCKET
-
# ifdef __MINGW__
extern HANDLE _get_osfhandle();
# endif
@@ -678,7 +677,7 @@
"create a socket for a specific type
and bind it to aSocketAddress.
Type must be:
- #stream, #datagram or #raw
+ #stream, #datagram or #raw
Neither connect nor connect-wait is done."
@@ -686,16 +685,16 @@
newSock := self domain:aSocketAddress domain type:aTypeSymbol.
[
- newSock bindTo:aSocketAddress reuseAddress:true.
+ newSock bindTo:aSocketAddress reuseAddress:true.
] ifCurtailed:[
- newSock close.
+ newSock close.
].
^ newSock
"
- Socket bindTo:(IPSocketAddress anyHost port:8081) type:#stream.
- Socket bindTo:(IPv6SocketAddress anyHost port:8081) type:#datagram.
+ Socket bindTo:(IPSocketAddress anyHost port:8081) type:#stream.
+ Socket bindTo:(IPv6SocketAddress anyHost port:8081) type:#datagram.
"
!
@@ -703,9 +702,9 @@
"create a socket for domain and type -
neither any connect nor binding is done.
Domain must be one of the symbols:
- #inet, #unix, #appletalk, #decnet, #xns, ...;
+ #inet, #unix, #appletalk, #decnet, #xns, ...;
Type must be:
- #stream, #datagram or #raw
+ #stream, #datagram or #raw
XXX: currently only the #AF_INET and #AF_INET6 and #AF_UNIX domains are supported"
@@ -739,21 +738,21 @@
newSock := self newTCP.
(newSock notNil and:[aServiceOrNil notNil]) ifTrue:[
- [
- socketAddressClass := newSock socketAddressClass.
- socketAddress := socketAddressClass hostName:nil serviceName:aServiceOrNil type:#stream.
- socketAddress hostAddress:socketAddressClass anyAddress.
- newSock bindTo:socketAddress reuseAddress:true.
- ] ifCurtailed:[
- newSock close.
- ]
+ [
+ socketAddressClass := newSock socketAddressClass.
+ socketAddress := socketAddressClass hostName:nil serviceName:aServiceOrNil type:#stream.
+ socketAddress hostAddress:socketAddressClass anyAddress.
+ newSock bindTo:socketAddress reuseAddress:true.
+ ] ifCurtailed:[
+ newSock close.
+ ]
].
^ newSock
"
- Socket newTCP:'http-alt'.
- Socket newTCP:9996.
+ Socket newTCP:'http-alt'.
+ Socket newTCP:9996.
"
!
@@ -776,18 +775,18 @@
|port socketAddress|
aService isString ifTrue:[
- port := self portOfService:aService protocol:#tcp.
+ port := self portOfService:aService protocol:#tcp.
] ifFalse:[
- port := aService.
+ port := aService.
].
- socketAddress := aSocketAddressOrByteArray isSocketAddress
- ifTrue:[aSocketAddressOrByteArray]
- ifFalse:[
- "Passing ByteArrays is obsolete and only supported for IPv4"
- IPSocketAddress hostAddress:aSocketAddressOrByteArray
- ].
+ socketAddress := aSocketAddressOrByteArray isSocketAddress
+ ifTrue:[aSocketAddressOrByteArray]
+ ifFalse:[
+ "Passing ByteArrays is obsolete and only supported for IPv4"
+ IPSocketAddress hostAddress:aSocketAddressOrByteArray
+ ].
port notNil ifTrue:[
- socketAddress port:port.
+ socketAddress port:port.
].
^ self newTCPclientToAddress:socketAddress withTimeout:millis
!
@@ -802,13 +801,13 @@
socket := self domain:aSocketAddress domain type:#stream.
(socket connectTo:aSocketAddress withTimeout:millis) ifFalse:[
- socket close.
- ^ nil
+ socket close.
+ ^ nil
].
^ socket.
"
- self newTCPclientToAddress:(IPv6SocketAddress hostName:'www.exept.de' port:80) withTimeout:nil
+ self newTCPclientToAddress:(IPv6SocketAddress hostName:'www.exept.de' port:80) withTimeout:nil
"
!
@@ -842,34 +841,34 @@
|socket addressInfoList|
hostNameOrAddress isString ifFalse:[
- ^ self newTCPclientToAddress:hostNameOrAddress port:aPortOrServiceName withTimeout:millis.
+ ^ self newTCPclientToAddress:hostNameOrAddress port:aPortOrServiceName withTimeout:millis.
].
- addressInfoList := SocketAddress
- getAddressInfo:hostNameOrAddress
- serviceName:aPortOrServiceName
- domain:aDomainSymbolOrNil
- type:#stream
- protocol:nil
- flags:0.
+ addressInfoList := SocketAddress
+ getAddressInfo:hostNameOrAddress
+ serviceName:aPortOrServiceName
+ domain:aDomainSymbolOrNil
+ type:#stream
+ protocol:nil
+ flags:0.
addressInfoList do:[:eachAddressInfo|
- |domainSymbol lastDomainSymbol|
-
- domainSymbol := eachAddressInfo domain.
- domainSymbol ~~ lastDomainSymbol ifTrue:[
- socket notNil ifTrue:[
- socket close.
- ].
- socket := self new domain:domainSymbol type:#stream.
- lastDomainSymbol := domainSymbol.
- ].
- (socket connectTo:eachAddressInfo socketAddress withTimeout:millis) ifTrue:[
- ^ socket.
- ].
+ |domainSymbol lastDomainSymbol|
+
+ domainSymbol := eachAddressInfo domain.
+ domainSymbol ~~ lastDomainSymbol ifTrue:[
+ socket notNil ifTrue:[
+ socket close.
+ ].
+ socket := self new domain:domainSymbol type:#stream.
+ lastDomainSymbol := domainSymbol.
+ ].
+ (socket connectTo:eachAddressInfo socketAddress withTimeout:millis) ifTrue:[
+ ^ socket.
+ ].
].
socket notNil ifTrue:[
- socket close.
+ socket close.
].
^ nil.
@@ -883,19 +882,19 @@
"Modified: / 16.1.1998 / 09:47:06 / stefan"
!
-newTCPclientToHost:hostNameOrAddress port:aPortOrServiceName withTimeout:millis
+newTCPclientToHost:hostNameOrAddress port:aPortOrServiceName withTimeout:millis
"create a new TCP client socket connecting to a service on hostNameOrAddress.
If hostNameOrAddress is a string, try all the resolved adresses regardless
whether fpr IPv4 or IPv6.
Return a socket instance if ok, nil on failure.
If the millis arg is nonNil, stop trying to connect after that many milliseconds
and return nil."
-
- ^ self
- newTCPclientToHost:hostNameOrAddress
- port:aPortOrServiceName
- domain:self defaultIpDomainForConnect
- withTimeout:millis
+
+ ^ self
+ newTCPclientToHost:hostNameOrAddress
+ port:aPortOrServiceName
+ domain:self defaultIpDomainForConnect
+ withTimeout:millis
!
newTCPserverAtAnonymousPort
@@ -929,20 +928,20 @@
newSock := self newUDP.
(newSock notNil and:[aServiceOrNil notNil]) ifTrue:[
- [
- socketAddressClass := newSock socketAddressClass.
- socketAddress := socketAddressClass hostName:nil serviceName:aServiceOrNil type:#stream.
- socketAddress hostAddress:socketAddressClass anyAddress.
- newSock bindTo:socketAddress reuseAddress:true.
- ] ifCurtailed:[
- newSock close.
- ]
+ [
+ socketAddressClass := newSock socketAddressClass.
+ socketAddress := socketAddressClass hostName:nil serviceName:aServiceOrNil type:#stream.
+ socketAddress hostAddress:socketAddressClass anyAddress.
+ newSock bindTo:socketAddress reuseAddress:true.
+ ] ifCurtailed:[
+ newSock close.
+ ]
].
^ newSock
"
- Socket newUDP:4444.
- Socket newUDP:'activesync'.
+ Socket newUDP:4444.
+ Socket newUDP:'activesync'.
"
!
@@ -990,15 +989,15 @@
newSock := self newUNIX.
newSock notNil ifTrue:[
- (newSock connectTo:(UDSocketAddress name:pathName) withTimeout:millis) ifFalse:[
- newSock close.
- ^ nil
- ]
+ (newSock connectTo:(UDSocketAddress name:pathName) withTimeout:millis) ifFalse:[
+ newSock close.
+ ^ nil
+ ]
].
^ newSock
"
- Socket newUNIXclientTo:'/tmp/foo'
+ Socket newUNIXclientTo:'/tmp/foo'
"
!
@@ -1115,9 +1114,9 @@
defaultIpDomainForConnect
"answer the domain used to look up host names for connect:
- #AF_INET use only IPv4
- #AF_INET6 use only IPv6
- nil use both IPv4 and IPv6"
+ #AF_INET use only IPv4
+ #AF_INET6 use only IPv6
+ nil use both IPv4 and IPv6"
^ #AF_INET
! !
@@ -1711,9 +1710,9 @@
A free port will be allocated"
^ self
- bindTo:0
- address:aSocketAddress
- reuseAddress:false
+ bindTo:0
+ address:aSocketAddress
+ reuseAddress:false
"
self newTCP bindAnonymouslyToAddress:IPSocketAddress localHost; listenFor:1; yourself
@@ -1733,15 +1732,15 @@
- returns true if ok, false otherwise.
The interpretation of hostOrPathNameOrSocketAddrOrNil portNrOrName depends on the domain:
- Best use a SocketAddress
- For backward compatibility:
- AF_INET domain can also use (4byte) byteArray like internet numbers,
- AF_UNIX domain cab use pathname strings."
+ Best use a SocketAddress
+ For backward compatibility:
+ AF_INET domain can also use (4byte) byteArray like internet numbers,
+ AF_UNIX domain cab use pathname strings."
^ self
- bindTo:portNrOrNameString
- address:addressString
- reuseAddress:true
+ bindTo:portNrOrNameString
+ address:addressString
+ reuseAddress:true
!
bindTo:portNrOrNameOrNil address:hostOrPathNameOrSocketAddrOrNil reuseAddress:reuse
@@ -1749,10 +1748,10 @@
- returns true if ok, false otherwise.
The interpretation of hostOrPathNameOrSocketAddrOrNil portNrOrName depends on the domain:
- Best use a SocketAddress
- For backward compatibility:
- AF_INET domain can also use (4byte) byteArray like internet numbers,
- AF_UNIX domain can use pathname strings.
+ Best use a SocketAddress
+ For backward compatibility:
+ AF_INET domain can also use (4byte) byteArray like internet numbers,
+ AF_UNIX domain can use pathname strings.
The reuse boolean argument controls if the SO_REUSEADDR socket option
is to be set (to avoid the 'bind: address in use' error).
@@ -1761,35 +1760,35 @@
|socketAddress|
handle isNil ifTrue:[
- ^ self errorNotOpen
+ ^ self errorNotOpen
].
hostOrPathNameOrSocketAddrOrNil isNil ifTrue:[
- socketAddress := self socketAddressClass anyHost.
+ socketAddress := self socketAddressClass anyHost.
] ifFalse:[
- (hostOrPathNameOrSocketAddrOrNil isSocketAddress) ifTrue:[
- socketAddress := hostOrPathNameOrSocketAddrOrNil.
- ] ifFalse:[
- "backward compatibility: support for byteArray and string arg"
- hostOrPathNameOrSocketAddrOrNil isString ifTrue:[
- socketAddress := self socketAddressClass hostName:hostOrPathNameOrSocketAddrOrNil.
- ] ifFalse:[
- hostOrPathNameOrSocketAddrOrNil isByteCollection ifFalse:[
- ^ self error:'bindTo: bad host (socketAddress) argument'
- ].
- socketAddress := self socketAddressClass hostAddress:hostOrPathNameOrSocketAddrOrNil.
- ].
- ].
+ (hostOrPathNameOrSocketAddrOrNil isSocketAddress) ifTrue:[
+ socketAddress := hostOrPathNameOrSocketAddrOrNil.
+ ] ifFalse:[
+ "backward compatibility: support for byteArray and string arg"
+ hostOrPathNameOrSocketAddrOrNil isString ifTrue:[
+ socketAddress := self socketAddressClass hostName:hostOrPathNameOrSocketAddrOrNil.
+ ] ifFalse:[
+ hostOrPathNameOrSocketAddrOrNil isByteCollection ifFalse:[
+ ^ self error:'bindTo: bad host (socketAddress) argument'
+ ].
+ socketAddress := self socketAddressClass hostAddress:hostOrPathNameOrSocketAddrOrNil.
+ ].
+ ].
].
portNrOrNameOrNil notNil ifTrue:[
- socketAddress port:portNrOrNameOrNil.
+ socketAddress port:portNrOrNameOrNil.
].
^ self bindTo:socketAddress reuseAddress:reuse.
"
(Socket domain:#'AF_INET' type:#stream)
- bindTo:2144 address:nil; yourself
+ bindTo:2144 address:nil; yourself
"
!
@@ -1804,13 +1803,13 @@
|ok error socketAddress|
handle isNil ifTrue:[
- ^ self errorNotOpen
+ ^ self errorNotOpen
].
socketAddress := aSocketAddress.
socketAddress isNil ifTrue:[
- "ok, get a all zero socket address, so it is for anyHost
- and the port will be assigned"
- socketAddress := self socketAddressClass new.
+ "ok, get a all zero socket address, so it is for anyHost
+ and the port will be assigned"
+ socketAddress := self socketAddressClass new.
].
ok := false.
@@ -1824,52 +1823,52 @@
int sockAddrOffs;
if (fp == nil) {
- goto getOutOfHere;
+ goto getOutOfHere;
}
if (! __isBytes(socketAddress)) {
- error = __mkSmallInteger(-1);
- goto getOutOfHere;
+ error = __mkSmallInteger(-1);
+ goto getOutOfHere;
}
/* get the socket-address */
if (__isNonNilObject(socketAddress)){
- int nIndex;
- OBJ cls = __qClass(socketAddress);
-
- sockAddrOffs = __OBJS2BYTES__(__intVal(__ClassInstPtr(cls)->c_ninstvars));
- nIndex = __qSize(socketAddress) - OHDR_SIZE;
- sockaddr_size = nIndex - sockAddrOffs;
- if (sockaddr_size > sizeof(sa)) {
- error=__mkSmallInteger(-2);
- goto getOutOfHere;
- }
- memcpy(&sa, __byteArrayVal(socketAddress) + sockAddrOffs, sockaddr_size);
+ int nIndex;
+ OBJ cls = __qClass(socketAddress);
+
+ sockAddrOffs = __OBJS2BYTES__(__intVal(__ClassInstPtr(cls)->c_ninstvars));
+ nIndex = __qSize(socketAddress) - OHDR_SIZE;
+ sockaddr_size = nIndex - sockAddrOffs;
+ if (sockaddr_size > sizeof(sa)) {
+ error=__mkSmallInteger(-2);
+ goto getOutOfHere;
+ }
+ memcpy(&sa, __byteArrayVal(socketAddress) + sockAddrOffs, sockaddr_size);
}
sock = SOCKET_FROM_FILE_OBJECT(fp);
# ifdef SO_REUSEADDR
if (reuse == true) {
- int on = 1;
- if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char *) &on, sizeof (on)) < 0) {
- DBGPRINTF(("SOCKET: setsockopt - SO_REUSEADDR failed\n"));
- }
+ int on = 1;
+ if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char *) &on, sizeof (on)) < 0) {
+ DBGPRINTF(("SOCKET: setsockopt - SO_REUSEADDR failed\n"));
+ }
}
# endif /* SO_REUSEADDR */
# ifdef BIND_BLOCKS
# ifdef DO_WRAP_CALLS
do {
- __threadErrno = 0;
- ret = STX_WSA_NOINT_CALL3("bind", bind, sock, &sa, sockaddr_size);
+ __threadErrno = 0;
+ ret = STX_WSA_NOINT_CALL3("bind", bind, sock, &sa, sockaddr_size);
} while ((ret < 0) && (__threadErrno == EINTR));
if (ret < 0) {
- errno = __threadErrno;
+ errno = __threadErrno;
}
# else
__BEGIN_INTERRUPTABLE__
do {
- ret = bind(sock, (struct sockaddr *)&sa, sockaddr_size);
+ ret = bind(sock, (struct sockaddr *)&sa, sockaddr_size);
} while ((ret < 0) && (errno == EINTR));
__END_INTERRUPTABLE__
# endif
@@ -1879,68 +1878,68 @@
# endif
if (ret < 0) {
# ifdef WIN32
- if (errno == 0) {
- errno = WSAGetLastError();
- }
+ if (errno == 0) {
+ errno = WSAGetLastError();
+ }
# endif
- DBGPRINTF(("SOCKET: bind failed errno=%d\n", errno));
- error = __INST(lastErrorNumber) = __MKSMALLINT(errno);
- goto getOutOfHere;
+ DBGPRINTF(("SOCKET: bind failed errno=%d\n", errno));
+ error = __INST(lastErrorNumber) = __MKSMALLINT(errno);
+ goto getOutOfHere;
} else {
- ok = true;
+ ok = true;
}
#endif /* NO_SOCKET */
getOutOfHere: ;
%}.
ok ~~ true ifTrue:[
- |errorHolder errorString|
-
- error isInteger ifTrue:[
- errorHolder := OperatingSystem errorHolderForNumber:error.
- errorString := errorHolder errorString.
- ] ifFalse:[
- errorString := error.
- ].
- OpenError newException
- errorString:('cannot bind socket to address: %1 (%2)'
- bindWith:socketAddress
- with:errorString);
- errorCode:error;
- osErrorHolder:errorHolder;
- parameter:self;
- raiseRequest.
- "maybe someone catches the error and binds to some other port..."
- ^ true.
+ |errorHolder errorString|
+
+ error isInteger ifTrue:[
+ errorHolder := OperatingSystem errorHolderForNumber:error.
+ errorString := errorHolder errorString.
+ ] ifFalse:[
+ errorString := error.
+ ].
+ OpenError newException
+ errorString:('cannot bind socket to address: %1 (%2)'
+ bindWith:socketAddress
+ with:errorString);
+ errorCode:error;
+ osErrorHolder:errorHolder;
+ parameter:self;
+ raiseRequest.
+ "maybe someone catches the error and binds to some other port..."
+ ^ true.
].
port := socketAddress port.
port == 0 ifTrue:[
- "this is a bind to a random port, now we can get the real port"
- port := self getFullSocketAddress port.
+ "this is a bind to a random port, now we can get the real port"
+ port := self getFullSocketAddress port.
].
^ true
"
(Socket domain:#'AF_INET' type:#stream)
- bindTo:(IPSocketAddress anyHost port:445) reuseAddress:false;
- yourself.
+ bindTo:(IPSocketAddress anyHost port:445) reuseAddress:false;
+ yourself.
(Socket domain:#'AF_INET' type:#stream)
- bindTo:139 reuseAddress:false;
- yourself.
+ bindTo:139 reuseAddress:false;
+ yourself.
(Socket domain:#'AF_INET6' type:#stream)
- bindTo:nil reuseAddress:false;
- yourself.
+ bindTo:nil reuseAddress:false;
+ yourself.
(Socket domain:#'AF_INET' type:#stream)
- bindTo:(IPSocketAddress localHost port:2122) reuseAddress:false;
- yourself.
+ bindTo:(IPSocketAddress localHost port:2122) reuseAddress:false;
+ yourself.
(Socket domain:#'AF_UNIX' type:#stream)
- bindTo:nil reuseAddress:false;
- yourself.
+ bindTo:nil reuseAddress:false;
+ yourself.
"
!
@@ -1949,7 +1948,7 @@
aNumber is the number of connect requests, that may be queued on the socket"
handle isNil ifTrue:[
- ^ self errorNotOpen
+ ^ self errorNotOpen
].
%{
#ifndef NO_SOCKET
@@ -1958,8 +1957,8 @@
int ret;
if (! __isSmallInteger(aNumber)) {
- DBGPRINTF(("SOCKET: invalid arg\n"));
- RETURN (false);
+ DBGPRINTF(("SOCKET: invalid arg\n"));
+ RETURN (false);
}
sock = SOCKET_FROM_FILE_OBJECT(fp);
@@ -1967,16 +1966,16 @@
#ifdef LISTEN_BLOCKS
# ifdef DO_WRAP_CALLS
do {
- __threadErrno = 0;
- ret = STX_WSA_NOINT_CALL2("listen", listen, sock, __intVal(aNumber));
+ __threadErrno = 0;
+ ret = STX_WSA_NOINT_CALL2("listen", listen, sock, __intVal(aNumber));
} while ((ret < 0) && (__threadErrno == EINTR));
if (ret < 0) {
- errno = __threadErrno;
+ errno = __threadErrno;
}
# else
__BEGIN_INTERRUPTABLE__
do {
- ret = listen(sock, __intVal(aNumber));
+ ret = listen(sock, __intVal(aNumber));
} while ((ret < 0) && (errno == EINTR));
__END_INTERRUPTABLE__
# endif
@@ -1987,13 +1986,13 @@
if (ret < 0) {
# ifdef WIN32
- if (errno == 0) {
- errno = WSAGetLastError();
- }
+ if (errno == 0) {
+ errno = WSAGetLastError();
+ }
# endif
- DBGPRINTF(("SOCKET: listen call failed errno=%d\n", errno));
- __INST(lastErrorNumber) = __MKSMALLINT(errno);
- RETURN (false);
+ DBGPRINTF(("SOCKET: listen call failed errno=%d\n", errno));
+ __INST(lastErrorNumber) = __MKSMALLINT(errno);
+ RETURN (false);
}
#else
RETURN (false);
@@ -2060,26 +2059,26 @@
|domainClass socketAddress|
(hostOrPathNameOrSocketAddr isSocketAddress) ifTrue:[
- socketAddress := hostOrPathNameOrSocketAddr.
- portNrOrNameOrNil notNil ifTrue:[
- socketAddress port:portNrOrNameOrNil.
- ].
+ socketAddress := hostOrPathNameOrSocketAddr.
+ portNrOrNameOrNil notNil ifTrue:[
+ socketAddress port:portNrOrNameOrNil.
+ ].
] ifFalse:[
- "backward compatibility: support for byteArray and string arg"
- domainClass := self class socketAddressClassForDomain:domain.
- domainClass isNil ifTrue:[
- ^ self error:'invalid (unsupported) domain'.
- ].
-
- hostOrPathNameOrSocketAddr isString ifTrue:[
- socketAddress := domainClass hostName:hostOrPathNameOrSocketAddr serviceName:portNrOrNameOrNil type:#SOCK_STREAM.
- peerName := hostOrPathNameOrSocketAddr.
- ] ifFalse:[
- hostOrPathNameOrSocketAddr isByteCollection ifFalse:[
- ^ self error:'connectTo: bad host (socketAddress) argument'
- ].
- socketAddress := domainClass hostAddress:hostOrPathNameOrSocketAddr port:portNrOrNameOrNil.
- ].
+ "backward compatibility: support for byteArray and string arg"
+ domainClass := self class socketAddressClassForDomain:domain.
+ domainClass isNil ifTrue:[
+ ^ self error:'invalid (unsupported) domain'.
+ ].
+
+ hostOrPathNameOrSocketAddr isString ifTrue:[
+ socketAddress := domainClass hostName:hostOrPathNameOrSocketAddr serviceName:portNrOrNameOrNil type:#SOCK_STREAM.
+ peerName := hostOrPathNameOrSocketAddr.
+ ] ifFalse:[
+ hostOrPathNameOrSocketAddr isByteCollection ifFalse:[
+ ^ self error:'connectTo: bad host (socketAddress) argument'
+ ].
+ socketAddress := domainClass hostAddress:hostOrPathNameOrSocketAddr port:portNrOrNameOrNil.
+ ].
].
^ self connectTo:socketAddress withTimeout:timeout.
@@ -2107,7 +2106,7 @@
|isAsync err|
handle isNil ifTrue:[
- ^ self errorNotOpen
+ ^ self errorNotOpen
].
%{ /* STACK: 100000 */
@@ -2123,25 +2122,25 @@
int sockaddr_size;
if (!__isNonNilObject(aSocketAddress) || !__isBytes(aSocketAddress)) {
- DBGPRINTF(("SOCKET: invalid socketAddress\n"));
- err = @symbol(argumentError);
- goto out;
+ DBGPRINTF(("SOCKET: invalid socketAddress\n"));
+ err = @symbol(argumentError);
+ goto out;
}
{
- int sockAddrOffs = 0;
- int nIndex =__byteArraySize(aSocketAddress);
- OBJ cls = __qClass(aSocketAddress);
-
- //if (cls != @global(ByteArray))
- // sockAddrOffs = __OBJS2BYTES__(__intVal(__ClassInstPtr(cls)->c_ninstvars));
- sockaddr_size = nIndex - sockAddrOffs;
- if (sockaddr_size > sizeof(sa)) {
- DBGPRINTF(("SOCKET: invalid (short) socketAddress\n"));
- err = @symbol(argumentError);
- goto out;
- }
- memcpy(&sa, __byteArrayVal(aSocketAddress) + sockAddrOffs, sockaddr_size);
+ int sockAddrOffs = 0;
+ int nIndex =__byteArraySize(aSocketAddress);
+ OBJ cls = __qClass(aSocketAddress);
+
+ //if (cls != @global(ByteArray))
+ // sockAddrOffs = __OBJS2BYTES__(__intVal(__ClassInstPtr(cls)->c_ninstvars));
+ sockaddr_size = nIndex - sockAddrOffs;
+ if (sockaddr_size > sizeof(sa)) {
+ DBGPRINTF(("SOCKET: invalid (short) socketAddress\n"));
+ err = @symbol(argumentError);
+ goto out;
+ }
+ memcpy(&sa, __byteArrayVal(aSocketAddress) + sockAddrOffs, sockaddr_size);
}
sock = SOCKET_FROM_FILE_OBJECT(fp);
@@ -2160,22 +2159,22 @@
*/
# if defined(DO_WRAP_CALLS)
- // __setWrapCallDebugging(1,1);
+ // __setWrapCallDebugging(1,1);
do {
- DBGFPRINTF((stderr, "SOCKET: (sock=%d) connect...\n", sock));
- ret = STX_WSA_NOINT_CALL3("connect", connect, sock, &sa, (INT)sockaddr_size);
- DBGFPRINTF((stderr, "SOCKET: connect(%d) -> %"_ld_" (%d)\n", sock, (INT)ret, __threadErrno));
+ DBGFPRINTF((stderr, "SOCKET: (sock=%d) connect...\n", sock));
+ ret = STX_WSA_NOINT_CALL3("connect", connect, sock, &sa, (INT)sockaddr_size);
+ DBGFPRINTF((stderr, "SOCKET: connect(%d) -> %"_ld_" (%d)\n", sock, (INT)ret, __threadErrno));
} while ((ret < 0) && (__threadErrno == EINTR));
if (ret < 0) {
- int optLen = sizeof(errno);
- errno = __threadErrno;
+ int optLen = sizeof(errno);
+ errno = __threadErrno;
#if 0
- if (getsockopt(sock, SOL_SOCKET, SO_ERROR, &errno, &optLen) == SOCKET_ERROR) {
- DBGFPRINTF((stderr, "SOCKET: getsockopt(SO_ERROR) failed: %d\n", WSAGetLastError()));
- }
+ if (getsockopt(sock, SOL_SOCKET, SO_ERROR, &errno, &optLen) == SOCKET_ERROR) {
+ DBGFPRINTF((stderr, "SOCKET: getsockopt(SO_ERROR) failed: %d\n", WSAGetLastError()));
+ }
#endif
}
@@ -2183,50 +2182,50 @@
# else
__BEGIN_INTERRUPTABLE__
do {
- ret = connect(sock, (struct sockaddr *)&sa, sockaddr_size);
+ ret = connect(sock, (struct sockaddr *)&sa, sockaddr_size);
} while ((ret < 0)
- && ((errno == EINTR)
+ && ((errno == EINTR)
# ifdef EAGAIN
- || (errno == EAGAIN)
+ || (errno == EAGAIN)
# endif
- ));
+ ));
__END_INTERRUPTABLE__
#endif
if (ret < 0) {
# if defined(EINPROGRESS) || defined(EALREADY)
- if (0
+ if (0
# ifdef EINPROGRESS
- || (errno == EINPROGRESS)
+ || (errno == EINPROGRESS)
# endif
# ifdef EALREADY
- || (errno == EALREADY)
+ || (errno == EALREADY)
# endif
- ) {
- /*
- * This was a nonblocking operation that will take some time.
- * Do a select on read to get informed when the operation is ready.
- */
- DBGFPRINTF((stderr, "SOCKET: isAsync is true\n"));
- isAsync = true;
- } else
+ ) {
+ /*
+ * This was a nonblocking operation that will take some time.
+ * Do a select on read to get informed when the operation is ready.
+ */
+ DBGFPRINTF((stderr, "SOCKET: isAsync is true\n"));
+ isAsync = true;
+ } else
# endif /* EINPROGRESS or EALREADY */
- {
- DBGFPRINTF((stderr, "SOCKET: connect failed ret=%"_ld_" errno=%d __threadErrno=%d\n",
- (INT)ret, errno, __threadErrno ));
+ {
+ DBGFPRINTF((stderr, "SOCKET: connect failed ret=%"_ld_" errno=%d __threadErrno=%d\n",
+ (INT)ret, errno, __threadErrno ));
# ifdef DUMP_ADDRESS
- {
- unsigned char *cp = (unsigned char *)(&sa);
- int i;
-
- console_printf("address data:\n");
- for (i=0; i<sockaddr_size; i++) {
- console_printf(" %02x\n", *cp++);
- }
- }
+ {
+ unsigned char *cp = (unsigned char *)(&sa);
+ int i;
+
+ console_printf("address data:\n");
+ for (i=0; i<sockaddr_size; i++) {
+ console_printf(" %02x\n", *cp++);
+ }
+ }
# endif
- err = __MKSMALLINT(errno);
- }
+ err = __MKSMALLINT(errno);
+ }
}
# if defined(O_NONBLOCK) && !defined(WIN32)
@@ -2238,35 +2237,35 @@
# endif /* NO_SOCKET */
out:;
%}.
-
+
err notNil ifTrue:[
- err isSymbol ifTrue:[
- self primitiveFailed:err.
- ].
- lastErrorNumber := err.
- ^ false.
- "/ Once we will raise an exception instead of returning false (and have to change some code above):
+ err isSymbol ifTrue:[
+ self primitiveFailed:err.
+ ].
+ lastErrorNumber := err.
+ ^ false.
+ "/ Once we will raise an exception instead of returning false (and have to change some code above):
"/ (OperatingSystem errorHolderForNumber:err) reportError.
].
isAsync == true ifTrue:[
- (self writeWaitWithTimeoutMs:timeout) ifTrue:[
- "/ a timeout occured
- "/ should I cancel the connect?
- ^ false.
- ].
- err := self getSocketError.
- err ~~ 0 ifTrue:[
- lastErrorNumber := err.
- ^ false.
- ].
+ (self writeWaitWithTimeoutMs:timeout) ifTrue:[
+ "/ a timeout occured
+ "/ should I cancel the connect?
+ ^ false.
+ ].
+ err := self getSocketError.
+ err ~~ 0 ifTrue:[
+ lastErrorNumber := err.
+ ^ false.
+ ].
].
peer := aSocketAddress.
port isNil ifTrue:[
- "socket has not been explicitly bound,
- after connect it has been bound implicitly - fetch the port"
- port := self getFullSocketAddress port.
+ "socket has not been explicitly bound,
+ after connect it has been bound implicitly - fetch the port"
+ port := self getFullSocketAddress port.
].
^ true
@@ -2300,69 +2299,69 @@
OBJ fp = __INST(handle);
if (fp != nil) {
- SOCKET sock;
- INT objSize, offs;
- INT n;
- char *extPtr;
- unsigned char *buffer;
- unsigned char *allocatedBuffer = NULL;
- INT flags = 0;
-
- sock = SOCKET_FROM_FILE_OBJECT(fp);
-
- if (! setupBufferParameters(aDataBuffer, startIndex, &extPtr, &offs, &objSize)) goto bad;
- if (__isSmallInteger(nBytes)) {
- if (__intVal(nBytes) < objSize) {
- objSize = __intVal(nBytes);
- }
- }
+ SOCKET sock;
+ INT objSize, offs;
+ INT n;
+ char *extPtr;
+ unsigned char *buffer;
+ unsigned char *allocatedBuffer = NULL;
+ INT flags = 0;
+
+ sock = SOCKET_FROM_FILE_OBJECT(fp);
+
+ if (! setupBufferParameters(aDataBuffer, startIndex, &extPtr, &offs, &objSize)) goto bad;
+ if (__isSmallInteger(nBytes)) {
+ if (__intVal(nBytes) < objSize) {
+ objSize = __intVal(nBytes);
+ }
+ }
# ifdef DO_WRAP_CALLS
- if (extPtr) {
- buffer = extPtr + offs;
- } else {
- allocatedBuffer = buffer = (char *)malloc(objSize);
- }
-
- do {
- __threadErrno = 0;
- n = (INT)STX_WSA_NOINT_CALL4("recv", recv, sock, buffer, objSize, flags);
- } while ((n < 0) && (__threadErrno == EINTR));
- if (n < 0) {
- errno = __threadErrno;
- }
-
- if (allocatedBuffer) {
- if (n > 0) {
- bcopy(allocatedBuffer, (char *)__InstPtr(aDataBuffer) + offs, n);
- }
- free(allocatedBuffer);
- }
+ if (extPtr) {
+ buffer = extPtr + offs;
+ } else {
+ allocatedBuffer = buffer = (char *)malloc(objSize);
+ }
+
+ do {
+ __threadErrno = 0;
+ n = (INT)STX_WSA_NOINT_CALL4("recv", recv, sock, buffer, objSize, flags);
+ } while ((n < 0) && (__threadErrno == EINTR));
+ if (n < 0) {
+ errno = __threadErrno;
+ }
+
+ if (allocatedBuffer) {
+ if (n > 0) {
+ bcopy(allocatedBuffer, (char *)__InstPtr(aDataBuffer) + offs, n);
+ }
+ free(allocatedBuffer);
+ }
# else
- __BEGIN_INTERRUPTABLE__
- do {
- if (extPtr) {
- n = recv(sock, extPtr + offs, objSize, flags);
- } else {
- n = recv(sock, (char *)__InstPtr(aDataBuffer) + offs, objSize, flags);
- }
- } while ((n < 0) && (errno == EINTR));
- __END_INTERRUPTABLE__
+ __BEGIN_INTERRUPTABLE__
+ do {
+ if (extPtr) {
+ n = recv(sock, extPtr + offs, objSize, flags);
+ } else {
+ n = recv(sock, (char *)__InstPtr(aDataBuffer) + offs, objSize, flags);
+ }
+ } while ((n < 0) && (errno == EINTR));
+ __END_INTERRUPTABLE__
# endif
- if (n < 0) {
- error = __INST(lastErrorNumber) = __MKSMALLINT(errno);
- } else {
- RETURN(__MKSMALLINT(n));
- }
+ if (n < 0) {
+ error = __INST(lastErrorNumber) = __MKSMALLINT(errno);
+ } else {
+ RETURN(__MKSMALLINT(n));
+ }
}
#endif
bad: ;
%}.
error notNil ifTrue:[
- ^ ReadError
- raiseRequestWith:self
- errorString:(' : ' , OperatingSystem errorTextForNumber:error)
+ ^ ReadError
+ raiseRequestWith:self
+ errorString:(' : ' , OperatingSystem errorTextForNumber:error)
].
"
arrive here if you try to receive into an invalid buffer (i.e. not ByteArray-like)
@@ -2398,17 +2397,17 @@
domainClass := self class socketAddressClassForDomain:domain.
domainClass isNil ifTrue:[
- ^ self error:'invalid (unsupported) domain'.
+ ^ self error:'invalid (unsupported) domain'.
].
(anAddressBuffer isKindOf:SocketAddress) ifTrue:[
- anAddressBuffer class == domainClass ifFalse:[
- ^ self error:'addressBuffer class mismatch (domain)'.
- ].
- addr := anAddressBuffer.
+ anAddressBuffer class == domainClass ifFalse:[
+ ^ self error:'addressBuffer class mismatch (domain)'.
+ ].
+ addr := anAddressBuffer.
] ifFalse:[
- anAddressBuffer notNil ifTrue:[
- addr := domainClass new.
- ].
+ anAddressBuffer notNil ifTrue:[
+ addr := domainClass new.
+ ].
].
%{
@@ -2416,106 +2415,106 @@
OBJ fp = __INST(handle);
if (fp != nil) {
- SOCKET sock;
- INT objSize;
- union sockaddr_u sa;
- unsigned INT alen = 0;
- INT n, offs;
- INT flags = 0;
- char *extPtr;
- unsigned char *allocatedBuffer = NULL;
- unsigned char *buffer = NULL;
-
- sock = SOCKET_FROM_FILE_OBJECT(fp);
-
- if (! setupBufferParameters(aDataBuffer, startIndex, &extPtr, &offs, &objSize)) goto bad;
- if (__isSmallInteger(nBytes)) {
- if (__intVal(nBytes) < objSize) {
- objSize = __intVal(nBytes);
- }
- }
+ SOCKET sock;
+ INT objSize;
+ union sockaddr_u sa;
+ unsigned INT alen = 0;
+ INT n, offs;
+ INT flags = 0;
+ char *extPtr;
+ unsigned char *allocatedBuffer = NULL;
+ unsigned char *buffer = NULL;
+
+ sock = SOCKET_FROM_FILE_OBJECT(fp);
+
+ if (! setupBufferParameters(aDataBuffer, startIndex, &extPtr, &offs, &objSize)) goto bad;
+ if (__isSmallInteger(nBytes)) {
+ if (__intVal(nBytes) < objSize) {
+ objSize = __intVal(nBytes);
+ }
+ }
# ifdef DO_WRAP_CALLS
- if (extPtr) {
- buffer = extPtr + offs;
- } else {
- allocatedBuffer = buffer = (char *)malloc(objSize);
- }
-
- do {
- __threadErrno = 0;
- alen = sizeof(sa);
- n = (INT)STX_WSA_NOINT_CALL6("recvfrom", recvfrom, sock, buffer, objSize, flags, (struct sockaddr *)&sa, &alen);
- } while ((n < 0) && (__threadErrno == EINTR));
- if (n < 0) {
- errno = __threadErrno;
- }
-
- if (allocatedBuffer) {
- if (n > 0) {
- memcpy((char *)__InstPtr(aDataBuffer) + offs, allocatedBuffer, n);
- }
- free(allocatedBuffer);
- }
+ if (extPtr) {
+ buffer = extPtr + offs;
+ } else {
+ allocatedBuffer = buffer = (char *)malloc(objSize);
+ }
+
+ do {
+ __threadErrno = 0;
+ alen = sizeof(sa);
+ n = (INT)STX_WSA_NOINT_CALL6("recvfrom", recvfrom, sock, buffer, objSize, flags, (struct sockaddr *)&sa, &alen);
+ } while ((n < 0) && (__threadErrno == EINTR));
+ if (n < 0) {
+ errno = __threadErrno;
+ }
+
+ if (allocatedBuffer) {
+ if (n > 0) {
+ memcpy((char *)__InstPtr(aDataBuffer) + offs, allocatedBuffer, n);
+ }
+ free(allocatedBuffer);
+ }
# else
- __BEGIN_INTERRUPTABLE__
- do {
- alen = sizeof(sa);
- if (extPtr) {
- n = recvfrom(sock, extPtr + offs, objSize, flags, (struct sockaddr *) &sa, &alen);
- } else {
- n = recvfrom(sock, (char *)__InstPtr(aDataBuffer) + offs, objSize, flags, (struct sockaddr *) &sa, &alen);
- }
- } while ((n < 0) && (errno == EINTR));
- __END_INTERRUPTABLE__
+ __BEGIN_INTERRUPTABLE__
+ do {
+ alen = sizeof(sa);
+ if (extPtr) {
+ n = recvfrom(sock, extPtr + offs, objSize, flags, (struct sockaddr *) &sa, &alen);
+ } else {
+ n = recvfrom(sock, (char *)__InstPtr(aDataBuffer) + offs, objSize, flags, (struct sockaddr *) &sa, &alen);
+ }
+ } while ((n < 0) && (errno == EINTR));
+ __END_INTERRUPTABLE__
# endif
- if (n >= 0) {
- if (__isNonNilObject(addr)) {
- char *addrPtr;
- OBJ oClass;
- int nInstVars, nInstBytes, objSize;
-
- oClass = __qClass(addr);
- if (! __isBytes(addr) )
- goto bad;
- nInstVars = __intVal(__ClassInstPtr(oClass)->c_ninstvars);
- nInstBytes = OHDR_SIZE + (nInstVars * sizeof(OBJ));
- objSize = __qSize(addr) - nInstBytes;
- addrPtr = (char *)__InstPtr(addr) + nInstBytes;
- if (objSize < alen)
- goto bad;
-
- /*
- * extract the datagrams address
- */
- memcpy(addrPtr, (char *)&sa, alen);
- addrLen = __MKSMALLINT(alen);
- }
- }
- if (n < 0) {
- error = __INST(lastErrorNumber) = __MKSMALLINT(errno);
- }
- nReceived = __MKSMALLINT(n);
+ if (n >= 0) {
+ if (__isNonNilObject(addr)) {
+ char *addrPtr;
+ OBJ oClass;
+ int nInstVars, nInstBytes, objSize;
+
+ oClass = __qClass(addr);
+ if (! __isBytes(addr) )
+ goto bad;
+ nInstVars = __intVal(__ClassInstPtr(oClass)->c_ninstvars);
+ nInstBytes = OHDR_SIZE + (nInstVars * sizeof(OBJ));
+ objSize = __qSize(addr) - nInstBytes;
+ addrPtr = (char *)__InstPtr(addr) + nInstBytes;
+ if (objSize < alen)
+ goto bad;
+
+ /*
+ * extract the datagrams address
+ */
+ memcpy(addrPtr, (char *)&sa, alen);
+ addrLen = __MKSMALLINT(alen);
+ }
+ }
+ if (n < 0) {
+ error = __INST(lastErrorNumber) = __MKSMALLINT(errno);
+ }
+ nReceived = __MKSMALLINT(n);
}
#endif
bad: ;
%}.
error notNil ifTrue:[
- ^ ReadError
- raiseRequestWith:self
- errorString:(' : ' , OperatingSystem errorTextForNumber:error)
+ ^ ReadError
+ raiseRequestWith:self
+ errorString:(' : ' , OperatingSystem errorTextForNumber:error)
].
nReceived notNil ifTrue:[
- addrLen notNil ifTrue:[
- (addr == anAddressBuffer) ifFalse:[
- self obsoleteFeatureWarning:'please use a socketAddress argument'.
-
- "can be a ByteArray for backward compatibility"
- anAddressBuffer replaceFrom:1 to:addrLen with:(addr hostAddress).
- ].
- ].
- ^ nReceived
+ addrLen notNil ifTrue:[
+ (addr == anAddressBuffer) ifFalse:[
+ self obsoleteFeatureWarning:'please use a socketAddress argument'.
+
+ "can be a ByteArray for backward compatibility"
+ anAddressBuffer replaceFrom:1 to:addrLen with:(addr hostAddress).
+ ].
+ ].
+ ^ nReceived
].
"
arrive here if you try to receive into an invalid buffer
@@ -2543,73 +2542,73 @@
if ((fp != nil)
&& __isSmallInteger(startIndex)
&& __isSmallInteger(nBytes)) {
- SOCKET sock;
- INT objSize;
- INT n;
- char *extPtr;
- INT _flags = 0;
- INT offs;
- unsigned long norder;
- unsigned char *buffer;
- unsigned char *allocatedBuffer = NULL;
-
- _flags = __longIntVal(flags);
-
- sock = SOCKET_FROM_FILE_OBJECT(fp);
-
- if (! setupBufferParameters(aDataBuffer, startIndex, &extPtr, &offs, &objSize)) goto bad;
- if (__isSmallInteger(nBytes)) {
- if (__intVal(nBytes) < objSize) {
- objSize = __intVal(nBytes);
- }
- }
+ SOCKET sock;
+ INT objSize;
+ INT n;
+ char *extPtr;
+ INT _flags = 0;
+ INT offs;
+ unsigned long norder;
+ unsigned char *buffer;
+ unsigned char *allocatedBuffer = NULL;
+
+ _flags = __longIntVal(flags);
+
+ sock = SOCKET_FROM_FILE_OBJECT(fp);
+
+ if (! setupBufferParameters(aDataBuffer, startIndex, &extPtr, &offs, &objSize)) goto bad;
+ if (__isSmallInteger(nBytes)) {
+ if (__intVal(nBytes) < objSize) {
+ objSize = __intVal(nBytes);
+ }
+ }
# ifdef DGRAM_DEBUG
- console_printf("sending %d bytes ...\n", nBytes);
+ console_printf("sending %d bytes ...\n", nBytes);
# endif
#ifdef DO_WRAP_CALLS
- if (extPtr) {
- buffer = extPtr + offs;
- } else {
- allocatedBuffer = buffer = (char *)malloc(objSize);
- bcopy((char *)__InstPtr(aDataBuffer) + offs, allocatedBuffer, objSize);
- }
-
- do {
- __threadErrno = 0;
- n = (INT)STX_WSA_NOINT_CALL4("send", send, sock, buffer, objSize, _flags);
- } while ((n < 0) && (__threadErrno == EINTR));
- if (n < 0) {
- errno = __threadErrno;
- }
-
- if (allocatedBuffer) {
- free(allocatedBuffer);
- }
+ if (extPtr) {
+ buffer = extPtr + offs;
+ } else {
+ allocatedBuffer = buffer = (char *)malloc(objSize);
+ bcopy((char *)__InstPtr(aDataBuffer) + offs, allocatedBuffer, objSize);
+ }
+
+ do {
+ __threadErrno = 0;
+ n = (INT)STX_WSA_NOINT_CALL4("send", send, sock, buffer, objSize, _flags);
+ } while ((n < 0) && (__threadErrno == EINTR));
+ if (n < 0) {
+ errno = __threadErrno;
+ }
+
+ if (allocatedBuffer) {
+ free(allocatedBuffer);
+ }
#else
- __BEGIN_INTERRUPTABLE__
- do {
- if (extPtr) {
- n = send(sock, extPtr + offs, objSize, _flags);
- } else {
- n = send(sock, (char *)__InstPtr(aDataBuffer) + offs, objSize, _flags);
- }
- } while ((n < 0) && (errno == EINTR));
- __END_INTERRUPTABLE__
+ __BEGIN_INTERRUPTABLE__
+ do {
+ if (extPtr) {
+ n = send(sock, extPtr + offs, objSize, _flags);
+ } else {
+ n = send(sock, (char *)__InstPtr(aDataBuffer) + offs, objSize, _flags);
+ }
+ } while ((n < 0) && (errno == EINTR));
+ __END_INTERRUPTABLE__
#endif
- if (n < 0) {
- error = __INST(lastErrorNumber) = __MKSMALLINT(errno);
- } else {
- RETURN (__MKSMALLINT(n));
- }
+ if (n < 0) {
+ error = __INST(lastErrorNumber) = __MKSMALLINT(errno);
+ } else {
+ RETURN (__MKSMALLINT(n));
+ }
}
#endif
bad: ;
%}.
error notNil ifTrue:[
- self writeError:error.
+ self writeError:error.
].
"
@@ -2657,16 +2656,16 @@
|domainClass addr error|
(anAddressBuffer isKindOf:SocketAddress) ifTrue:[
- addr := anAddressBuffer.
+ addr := anAddressBuffer.
] ifFalse:[
- anAddressBuffer isByteArray ifFalse:[
- ^ self error:'bad socketAddress argument'
- ].
- domainClass := self class socketAddressClassForDomain:domain.
- domainClass isNil ifTrue:[
- ^ self error:'invalid (unsupported) domain'.
- ].
- addr := domainClass hostAddress:anAddressBuffer.
+ anAddressBuffer isByteArray ifFalse:[
+ ^ self error:'bad socketAddress argument'
+ ].
+ domainClass := self class socketAddressClassForDomain:domain.
+ domainClass isNil ifTrue:[
+ ^ self error:'invalid (unsupported) domain'.
+ ].
+ addr := domainClass hostAddress:anAddressBuffer.
].
%{
#ifndef NO_SOCKET
@@ -2675,92 +2674,92 @@
if ((fp != nil)
&& __isSmallInteger(startIndex)
&& __isSmallInteger(nBytes)) {
- SOCKET sock;
- INT objSize;
- struct sockaddr *sockaddr_ptr;
- union sockaddr_u sa;
- INT alen = 0;
- INT sockAddrOffs, sockaddr_size;
- INT n;
- char *extPtr;
- INT _flags = 0;
- INT offs;
- unsigned long norder;
- unsigned char *buffer;
- unsigned char *allocatedBuffer = NULL;
-
- _flags = __longIntVal(flags);
- sock = SOCKET_FROM_FILE_OBJECT(fp);
-
- if (! __isBytes(addr)) {
- sockaddr_size = 0;
- sockaddr_ptr = (struct sockaddr *)0;
- } else {
- int nIndex;
- OBJ cls;
-
- sockAddrOffs = 0;
- if ((cls = __qClass(addr)) != @global(ByteArray))
- sockAddrOffs += __OBJS2BYTES__(__intVal(__ClassInstPtr(cls)->c_ninstvars));
- nIndex = __qSize(addr) - OHDR_SIZE;
- sockaddr_size = nIndex - sockAddrOffs;
- if (sockaddr_size > sizeof(sa)) {
- console_fprintf(stderr, "Socket [warning]: bad socketAddr\n");
- goto bad;
- }
- memcpy(&sa, (__byteArrayVal(addr) + sockAddrOffs), sockaddr_size);
- sockaddr_ptr = (struct sockaddr *)(&sa);
- }
-
- if (! setupBufferParameters(aDataBuffer, startIndex, &extPtr, &offs, &objSize)) goto bad;
- if (__isSmallInteger(nBytes)) {
- if (__intVal(nBytes) < objSize) {
- objSize = __intVal(nBytes);
- }
- }
+ SOCKET sock;
+ INT objSize;
+ struct sockaddr *sockaddr_ptr;
+ union sockaddr_u sa;
+ INT alen = 0;
+ INT sockAddrOffs, sockaddr_size;
+ INT n;
+ char *extPtr;
+ INT _flags = 0;
+ INT offs;
+ unsigned long norder;
+ unsigned char *buffer;
+ unsigned char *allocatedBuffer = NULL;
+
+ _flags = __longIntVal(flags);
+ sock = SOCKET_FROM_FILE_OBJECT(fp);
+
+ if (! __isBytes(addr)) {
+ sockaddr_size = 0;
+ sockaddr_ptr = (struct sockaddr *)0;
+ } else {
+ int nIndex;
+ OBJ cls;
+
+ sockAddrOffs = 0;
+ if ((cls = __qClass(addr)) != @global(ByteArray))
+ sockAddrOffs += __OBJS2BYTES__(__intVal(__ClassInstPtr(cls)->c_ninstvars));
+ nIndex = __qSize(addr) - OHDR_SIZE;
+ sockaddr_size = nIndex - sockAddrOffs;
+ if (sockaddr_size > sizeof(sa)) {
+ console_fprintf(stderr, "Socket [warning]: bad socketAddr\n");
+ goto bad;
+ }
+ memcpy(&sa, (__byteArrayVal(addr) + sockAddrOffs), sockaddr_size);
+ sockaddr_ptr = (struct sockaddr *)(&sa);
+ }
+
+ if (! setupBufferParameters(aDataBuffer, startIndex, &extPtr, &offs, &objSize)) goto bad;
+ if (__isSmallInteger(nBytes)) {
+ if (__intVal(nBytes) < objSize) {
+ objSize = __intVal(nBytes);
+ }
+ }
#ifdef DO_WRAP_CALLS
- if (extPtr) {
- buffer = extPtr + offs;
- } else {
- allocatedBuffer = buffer = (char *)malloc(objSize);
- bcopy((char *)__InstPtr(aDataBuffer) + offs, allocatedBuffer, objSize);
- }
-
- do {
- __threadErrno = 0;
- n = (INT)STX_WSA_NOINT_CALL6("sendto", sendto, sock, buffer, objSize, _flags, sockaddr_ptr, sockaddr_size);
- } while ((n < 0) && (__threadErrno == EINTR));
- if (n < 0) {
- errno = __threadErrno;
- }
-
- if (allocatedBuffer) {
- free(allocatedBuffer);
- }
+ if (extPtr) {
+ buffer = extPtr + offs;
+ } else {
+ allocatedBuffer = buffer = (char *)malloc(objSize);
+ bcopy((char *)__InstPtr(aDataBuffer) + offs, allocatedBuffer, objSize);
+ }
+
+ do {
+ __threadErrno = 0;
+ n = (INT)STX_WSA_NOINT_CALL6("sendto", sendto, sock, buffer, objSize, _flags, sockaddr_ptr, sockaddr_size);
+ } while ((n < 0) && (__threadErrno == EINTR));
+ if (n < 0) {
+ errno = __threadErrno;
+ }
+
+ if (allocatedBuffer) {
+ free(allocatedBuffer);
+ }
#else
- __BEGIN_INTERRUPTABLE__
- do {
- if (extPtr) {
- n = sendto(sock, extPtr + offs, objSize, _flags, sockaddr_ptr, sockaddr_size);
- } else {
- n = sendto(sock, (char *)__InstPtr(aDataBuffer) + offs, objSize, _flags, sockaddr_ptr, sockaddr_size);
- }
- } while ((n < 0) && (errno == EINTR));
- __END_INTERRUPTABLE__
+ __BEGIN_INTERRUPTABLE__
+ do {
+ if (extPtr) {
+ n = sendto(sock, extPtr + offs, objSize, _flags, sockaddr_ptr, sockaddr_size);
+ } else {
+ n = sendto(sock, (char *)__InstPtr(aDataBuffer) + offs, objSize, _flags, sockaddr_ptr, sockaddr_size);
+ }
+ } while ((n < 0) && (errno == EINTR));
+ __END_INTERRUPTABLE__
#endif
- if (n < 0) {
- error = __INST(lastErrorNumber) = __MKSMALLINT(errno);
- } else {
- RETURN (__MKSMALLINT(n));
- }
+ if (n < 0) {
+ error = __INST(lastErrorNumber) = __MKSMALLINT(errno);
+ } else {
+ RETURN (__MKSMALLINT(n));
+ }
}
#endif
bad: ;
%}.
error notNil ifTrue:[
- self writeError:error.
+ self writeError:error.
].
"
@@ -2783,44 +2782,44 @@
t = __INST(handle);
if (t != nil) {
- FILE *fp = __FILEVal(t);
- int fd = fileno(fp);
- SOCKET sock = SOCKET_FROM_FD(fd);
-
- __INST(handle) = nil;
+ FILE *fp = __FILEVal(t);
+ int fd = fileno(fp);
+ SOCKET sock = SOCKET_FROM_FD(fd);
+
+ __INST(handle) = nil;
# ifdef DO_WRAP_CALLS
- {
- INT ret;
- // __setWrapCallDebugging(1,1);
-
- if (__INST(buffered) == true){
- /* do a fflush() first, so that fclose() doesn't block
- * we suspect, that EINTR causes problems in fclose()
- */
- do {
- __threadErrno = 0;
- ret = (INT)__STX_C_CALL1("fflush", fflush, fp);
- } while((ret < 0) && (__threadErrno == EINTR));
- }
-
- do {
- __threadErrno = 0;
- ret = (INT)STX_C_NOINT_CALL1("fclose", fclose, fp);
- } while ((ret < 0) && (__threadErrno == EINTR));
-
- // __setWrapCallDebugging(1,0);
- }
+ {
+ INT ret;
+ // __setWrapCallDebugging(1,1);
+
+ if (__INST(buffered) == true){
+ /* do a fflush() first, so that fclose() doesn't block
+ * we suspect, that EINTR causes problems in fclose()
+ */
+ do {
+ __threadErrno = 0;
+ ret = (INT)__STX_C_CALL1("fflush", fflush, fp);
+ } while((ret < 0) && (__threadErrno == EINTR));
+ }
+
+ do {
+ __threadErrno = 0;
+ ret = (INT)STX_C_NOINT_CALL1("fclose", fclose, fp);
+ } while ((ret < 0) && (__threadErrno == EINTR));
+
+ // __setWrapCallDebugging(1,0);
+ }
# else /* !DO_WRAP_CALLS */
- if (__INST(buffered) == true){
- DBGFPRINTF((stderr, "SOCKET: fflush %"_lx_" (%d %d)\n", (INT)fp, fileno(fp), sock));
- fflush(fp);
- }
-
- if ((@global(FileOpenTrace) == true) || __debugging__) {
- console_fprintf(stderr, "SOCKET: fclose %"_lx_" (%d %d)\n", (INT)fp, fileno(fp), sock);
- }
- fclose(fp);
+ if (__INST(buffered) == true){
+ DBGFPRINTF((stderr, "SOCKET: fflush %"_lx_" (%d %d)\n", (INT)fp, fileno(fp), sock));
+ fflush(fp);
+ }
+
+ if ((@global(FileOpenTrace) == true) || __debugging__) {
+ console_fprintf(stderr, "SOCKET: fclose %"_lx_" (%d %d)\n", (INT)fp, fileno(fp), sock);
+ }
+ fclose(fp);
# endif /* !DO_WRAP_CALLS */
}
#endif /* NO_SOCKET */
@@ -2884,22 +2883,22 @@
|serverSocketFd addr domainClass|
handle notNil ifTrue:[
- ^ self errorAlreadyOpen
+ ^ self errorAlreadyOpen
].
domain := aSocket domain.
socketType := aSocket type.
serverSocketFd := aSocket fileDescriptor.
serverSocketFd isNil ifTrue:[
- ^ self error:'invalid server socket'
+ ^ self error:'invalid server socket'
].
(serverSocketFd isMemberOf:SmallInteger) ifFalse:[
- ^ self error:'invalid server socket'
+ ^ self error:'invalid server socket'
].
"unix domain sockets do not return a valid peer name on accept"
domainClass := self class socketAddressClassForDomain:domain.
domainClass isNil ifTrue:[
- ^ self error:'invalid (unsupported) domain'.
+ ^ self error:'invalid (unsupported) domain'.
].
addr := domainClass new.
@@ -2915,25 +2914,25 @@
if (blocking == false) {
# if defined(O_NONBLOCK) && defined(SET_NDELAY)
- flags = fcntl(sock, F_GETFL);
- fcntl(sock, F_SETFL, flags | O_NONBLOCK);
+ flags = fcntl(sock, F_GETFL);
+ fcntl(sock, F_SETFL, flags | O_NONBLOCK);
# endif
}
# ifdef DO_WRAP_CALLS
do {
- __threadErrno = 0;
- alen = sizeof(sa);
- newSock = (SOCKET)STX_WSA_CALL3("accept", accept, sock, &sa, &alen);
+ __threadErrno = 0;
+ alen = sizeof(sa);
+ newSock = (SOCKET)STX_WSA_CALL3("accept", accept, sock, &sa, &alen);
} while ((newSock < 0) && (__threadErrno == EINTR));
if (newSock < 0) {
- errno = __threadErrno;
+ errno = __threadErrno;
}
# else
__BEGIN_INTERRUPTABLE__
do {
- alen = sizeof(sa);
- newSock = accept(sock, (struct sockaddr *) &sa, &alen);
+ alen = sizeof(sa);
+ newSock = accept(sock, (struct sockaddr *) &sa, &alen);
} while ((newSock < 0) && (errno == EINTR));
__END_INTERRUPTABLE__
# endif
@@ -2941,41 +2940,41 @@
if (blocking == false) {
# if defined(O_NDELAY) && defined(SET_NDELAY)
- fcntl(sock, F_SETFL, flags);
+ fcntl(sock, F_SETFL, flags);
# endif
}
if (newSock < 0) {
- DBGPRINTF(("SOCKET: accept call failed errno=%d\n", errno));
- __INST(lastErrorNumber) = __MKSMALLINT(errno);
- RETURN (false);
+ DBGPRINTF(("SOCKET: accept call failed errno=%d\n", errno));
+ __INST(lastErrorNumber) = __MKSMALLINT(errno);
+ RETURN (false);
}
if (__isNonNilObject(addr)) {
- OBJ oClass = __qClass(addr);
- int nInstVars, nInstBytes, objSize;
- char *addrP;
-
- if (! __isBytes(addr) ) {
- DBGPRINTF(("SOCKET: bad addr\n"));
- closesocket(newSock);
- RETURN (false);
- }
-
- nInstVars = __intVal(__ClassInstPtr(oClass)->c_ninstvars);
- nInstBytes = OHDR_SIZE + (nInstVars * sizeof(OBJ));
- objSize = __qSize(addr) - nInstBytes;
- addrP = (char *)__InstPtr(addr) + nInstBytes;
- if (objSize < alen) {
- DBGPRINTF(("SOCKET: bad addr\n"));
- closesocket(newSock);
- RETURN (false);
- }
-
- /*
- * extract the partners address
- */
- memcpy(addrP, (char *)&sa, alen);
+ OBJ oClass = __qClass(addr);
+ int nInstVars, nInstBytes, objSize;
+ char *addrP;
+
+ if (! __isBytes(addr) ) {
+ DBGPRINTF(("SOCKET: bad addr\n"));
+ closesocket(newSock);
+ RETURN (false);
+ }
+
+ nInstVars = __intVal(__ClassInstPtr(oClass)->c_ninstvars);
+ nInstBytes = OHDR_SIZE + (nInstVars * sizeof(OBJ));
+ objSize = __qSize(addr) - nInstBytes;
+ addrP = (char *)__InstPtr(addr) + nInstBytes;
+ if (objSize < alen) {
+ DBGPRINTF(("SOCKET: bad addr\n"));
+ closesocket(newSock);
+ RETURN (false);
+ }
+
+ /*
+ * extract the partners address
+ */
+ memcpy(addrP, (char *)&sa, alen);
}
/*
@@ -2983,51 +2982,51 @@
*/
# ifdef WIN32
{
- int _fd;
- __stxWrapApiEnterCritical();
+ int _fd;
+ __stxWrapApiEnterCritical();
# if defined( __BORLANDC__ ) || defined( __MINGW__ )
- _fd = _open_osfhandle((long)newSock, 0);
+ _fd = _open_osfhandle((long)newSock, 0);
# else
- _fd = (int)newSock;
+ _fd = (int)newSock;
# endif
- fp = fdopen(_fd, "r+");
- __stxWrapApiLeaveCritical();
- DBGPRINTF(("SOCKET: sock=%d fd=%d fp=%"_lx_"\n",newSock, _fd, (INT)fp));
+ fp = fdopen(_fd, "r+");
+ __stxWrapApiLeaveCritical();
+ DBGPRINTF(("SOCKET: sock=%d fd=%d fp=%"_lx_"\n",newSock, _fd, (INT)fp));
}
# else
fp = fdopen(newSock, "r+");
# endif
if (! fp) {
- DBGPRINTF(("SOCKET: fdopen call failed\n"));
- __INST(lastErrorNumber) = __MKSMALLINT(errno);
+ DBGPRINTF(("SOCKET: fdopen call failed\n"));
+ __INST(lastErrorNumber) = __MKSMALLINT(errno);
# ifdef DO_WRAP_CALLS
- {
- INT ret;
- do {
- __threadErrno = 0;
- ret = (INT)STX_WSA_CALL1("closesocket", closesocket, newSock);
- } while ((ret < 0) && (__threadErrno == EINTR));
- }
+ {
+ INT ret;
+ do {
+ __threadErrno = 0;
+ ret = (INT)STX_WSA_CALL1("closesocket", closesocket, newSock);
+ } while ((ret < 0) && (__threadErrno == EINTR));
+ }
# else
- closesocket(newSock);
+ closesocket(newSock);
# endif
- DBGFPRINTF((stderr, "SOCKET: close (fdopen failed) (%d)\n", newSock));
- RETURN (false);
+ DBGFPRINTF((stderr, "SOCKET: close (fdopen failed) (%d)\n", newSock));
+ RETURN (false);
}
__INST(handleType) = @symbol(socketFilePointer);
if ((@global(FileOpenTrace) == true) || __debugging__) {
# ifdef WIN32
- {
- HANDLE h;
-
- int _fd = fileno(fp);
- h = (HANDLE)_get_osfhandle(_fd);
- console_fprintf(stderr, "fdopen [Socket] -> %"_lx_" (fd: %d) (H: %"_lx_")\n", (INT)fp, _fd, (INT)h);
- }
+ {
+ HANDLE h;
+
+ int _fd = fileno(fp);
+ h = (HANDLE)_get_osfhandle(_fd);
+ console_fprintf(stderr, "fdopen [Socket] -> %"_lx_" (fd: %d) (H: %"_lx_")\n", (INT)fp, _fd, (INT)h);
+ }
# else
- console_fprintf(stderr, "fdopen [Socket] -> %"_lx_" (fd: %d)\n", (INT)fp, newSock);
+ console_fprintf(stderr, "fdopen [Socket] -> %"_lx_" (fd: %d)\n", (INT)fp, newSock);
# endif
}
@@ -3045,11 +3044,11 @@
// object.
# endif
{
- OBJ t;
-
- t = __MKEXTERNALADDRESS(fp);
- __INST(handle) = t;
- __STORE(self, t);
+ OBJ t;
+
+ t = __MKEXTERNALADDRESS(fp);
+ __INST(handle) = t;
+ __STORE(self, t);
}
#endif /* not NO_SOCKET */
%}.
@@ -3366,12 +3365,12 @@
|error domainClass addr|
handle isNil ifTrue:[
- ^ self errorNotOpen
+ ^ self errorNotOpen
].
domainClass := self class socketAddressClassForDomain:domain.
domainClass isNil ifTrue:[
- ^ self error:'invalid (unsupported) domain'.
+ ^ self error:'invalid (unsupported) domain'.
].
addr := domainClass new.
@@ -3388,9 +3387,9 @@
int nAddrInstVars;
if (!__isNonNilObject(addr) || !__isBytes(addr)) {
- DBGPRINTF(("SOCKET: bad addr\n"));
- error = @symbol(badArgument);
- goto err;
+ DBGPRINTF(("SOCKET: bad addr\n"));
+ error = @symbol(badArgument);
+ goto err;
}
addrClass = __qClass(addr);
@@ -3402,17 +3401,17 @@
ret = getpeername(sock, (struct sockaddr *)&sa, &alen);
if (ret < 0) {
# ifdef WIN32
- errno = WSAGetLastError();
+ errno = WSAGetLastError();
# endif
- DBGPRINTF(("SOCKET: getsocketname failed ret=%d errno=%d\n", ret, errno));
- error = __MKSMALLINT(errno);
- goto err;
+ DBGPRINTF(("SOCKET: getsocketname failed ret=%d errno=%d\n", ret, errno));
+ error = __MKSMALLINT(errno);
+ goto err;
}
if (addrObjSize < alen) {
- DBGPRINTF(("SOCKET: bad addr\n"));
- error = @symbol(badArgument);
- goto err;
+ DBGPRINTF(("SOCKET: bad addr\n"));
+ error = @symbol(badArgument);
+ goto err;
}
addrP = (char *)__InstPtr(addr) + nAddrInstBytes;
@@ -3424,7 +3423,7 @@
#endif /* NO_SOCKET */
%}.
error notNil ifTrue:[
- ^ self errorReporter reportOn:error
+ ^ self errorReporter reportOn:error
].
^ addr
!
@@ -3437,12 +3436,12 @@
|error domainClass addr|
handle isNil ifTrue:[
- ^ self errorNotOpen
+ ^ self errorNotOpen
].
domainClass := self class socketAddressClassForDomain:domain.
domainClass isNil ifTrue:[
- ^ self error:'invalid (unsupported) domain'.
+ ^ self error:'invalid (unsupported) domain'.
].
addr := domainClass new.
@@ -3457,36 +3456,36 @@
int addrObjSize, nAddrInstBytes;
if (!__isNonNilObject(addr) || !__isBytes(addr)) {
- DBGPRINTF(("SOCKET: bad addr\n"));
- error = @symbol(badArgument);
- goto err;
+ DBGPRINTF(("SOCKET: bad addr\n"));
+ error = @symbol(badArgument);
+ goto err;
}
{
- OBJ addrClass;
- int nAddrInstVars;
-
- addrClass = __qClass(addr);
- nAddrInstVars = __intVal(__ClassInstPtr(addrClass)->c_ninstvars);
- nAddrInstBytes = OHDR_SIZE + (nAddrInstVars * sizeof(OBJ));
- addrObjSize = __qSize(addr) - nAddrInstBytes;
+ OBJ addrClass;
+ int nAddrInstVars;
+
+ addrClass = __qClass(addr);
+ nAddrInstVars = __intVal(__ClassInstPtr(addrClass)->c_ninstvars);
+ nAddrInstBytes = OHDR_SIZE + (nAddrInstVars * sizeof(OBJ));
+ addrObjSize = __qSize(addr) - nAddrInstBytes;
}
sock = SOCKET_FROM_FILE_OBJECT(fp);
ret = getsockname(sock, (struct sockaddr *)&sa, &alen);
if (ret < 0) {
# ifdef WIN32
- errno = WSAGetLastError();
+ errno = WSAGetLastError();
# endif
- DBGPRINTF(("SOCKET: getsocketname failed ret=%d errno=%d\n", ret, errno));
- error = __MKSMALLINT(errno);
- goto err;
+ DBGPRINTF(("SOCKET: getsocketname failed ret=%d errno=%d\n", ret, errno));
+ error = __MKSMALLINT(errno);
+ goto err;
}
if (addrObjSize < alen) {
- DBGPRINTF(("SOCKET: bad addr\n"));
- error = @symbol(badArgument);
- goto err;
+ DBGPRINTF(("SOCKET: bad addr\n"));
+ error = @symbol(badArgument);
+ goto err;
}
addrP = (char *)__InstPtr(addr) + nAddrInstBytes;
@@ -3498,7 +3497,7 @@
#endif /* NO_SOCKET */
%}.
error notNil ifTrue:[
- ^ self errorReporter reportOn:error
+ ^ self errorReporter reportOn:error
].
^ addr
!
@@ -3566,7 +3565,7 @@
domainClass := self class socketAddressClassForDomain:domain.
domainClass isNil ifTrue:[
- ^ self error:'invalid (unsupported) domain'.
+ ^ self error:'invalid (unsupported) domain'.
].
^ domainClass.
!
@@ -3597,7 +3596,7 @@
|domainName domainCode typeCode error|
handle notNil ifTrue:[
- ^ self errorAlreadyOpen
+ ^ self errorAlreadyOpen
].
domainName := SocketAddress domainCodeFromName:domainArg.
domainCode := OperatingSystem domainCodeOf:domainName.
@@ -3617,19 +3616,19 @@
# endif
if (! __isSmallInteger(domainCode)) {
- error = @symbol(badArgument1);
- goto out;
+ error = @symbol(badArgument1);
+ goto out;
}
if (! __isSmallInteger(typeCode)) {
- error = @symbol(badArgument2);
- goto out;
+ error = @symbol(badArgument2);
+ goto out;
}
if (protocolNumber != nil) {
- if (!__isSmallInteger(protocolNumber)) {
- error = @symbol(badArgument3);
- goto out;
- }
- proto = __intVal(protocolNumber);
+ if (!__isSmallInteger(protocolNumber)) {
+ error = @symbol(badArgument3);
+ goto out;
+ }
+ proto = __intVal(protocolNumber);
}
@@ -3642,110 +3641,110 @@
# ifdef WIN32
sock = WSASocket(dom, typ, proto, 0, 0, noInheritFlag);
if (sock == INVALID_SOCKET && noInheritFlag) {
- // tried to open socket with WSA_FLAG_NO_HANDLE_INHERIT
- // This fails on older windows versions, e.g. Windows XP
- sock = WSASocket(dom, typ, proto, 0, 0, 0);
- if (sock != INVALID_SOCKET) {
- // no error without WSA_FLAG_NO_HANDLE_INHERIT,
- // never use this flag again!
- noInheritFlag = 0;
- }
+ // tried to open socket with WSA_FLAG_NO_HANDLE_INHERIT
+ // This fails on older windows versions, e.g. Windows XP
+ sock = WSASocket(dom, typ, proto, 0, 0, 0);
+ if (sock != INVALID_SOCKET) {
+ // no error without WSA_FLAG_NO_HANDLE_INHERIT,
+ // never use this flag again!
+ noInheritFlag = 0;
+ }
}
if (sock == INVALID_SOCKET) {
- errno = WSAGetLastError();
+ errno = WSAGetLastError();
# else // !WIN32
sock = socket(dom, typ, proto);
# if defined(EPROTONOSUPPORT) /* for SGI */
if ((sock < 0) && (proto != 0) && (errno == EPROTONOSUPPORT)) {
- DBGPRINTF(("SOCKET: retry with UNSPEC protocol\n"));
- proto = 0;
- sock = socket(dom, typ, 0);
+ DBGPRINTF(("SOCKET: retry with UNSPEC protocol\n"));
+ proto = 0;
+ sock = socket(dom, typ, 0);
}
# endif
if (sock < 0) {
# endif // !WIN32
- DBGPRINTF(("SOCKET: socket(dom=%d typ=%d proto=%d) call failed errno=%d\n", dom, typ, proto, errno));
- __INST(lastErrorNumber) = __MKSMALLINT(errno);
+ DBGPRINTF(("SOCKET: socket(dom=%d typ=%d proto=%d) call failed errno=%d\n", dom, typ, proto, errno));
+ error = __MKSMALLINT(errno);
} else {
# if defined(SET_LINGER_WHEN_CREATING_SOCKET) && defined(SO_LINGER)
- {
- struct linger l;
-
- l.l_onoff = 1;
- l.l_linger = 30;
- setsockopt( sock, SOL_SOCKET, SO_LINGER, &l, sizeof(l));
- }
+ {
+ struct linger l;
+
+ l.l_onoff = 1;
+ l.l_linger = 30;
+ setsockopt( sock, SOL_SOCKET, SO_LINGER, &l, sizeof(l));
+ }
# endif
# ifdef WIN32
- /*
- * make it blocking
- */
- {
- unsigned long zero = 0;
- ioctlsocket(sock, FIONBIO, &zero);
- }
- /*
- * make it a FILE *
- */
- {
- int _fd;
- __stxWrapApiEnterCritical();
+ /*
+ * make it blocking
+ */
+ {
+ unsigned long zero = 0;
+ ioctlsocket(sock, FIONBIO, &zero);
+ }
+ /*
+ * make it a FILE *
+ */
+ {
+ int _fd;
+ __stxWrapApiEnterCritical();
# if defined( __BORLANDC__ ) || defined( __MINGW__ )
- _fd = _open_osfhandle((long)sock, 0);
+ _fd = _open_osfhandle((long)sock, 0);
# else
- _fd = (int)sock;
+ _fd = (int)sock;
# endif
- fp = fdopen(_fd, "r+");
- __stxWrapApiLeaveCritical();
- DBGPRINTF(("SOCKET: sock=%d fd=%d fp=%"_lx_"\n",sock, _fd, (INT)fp));
- }
+ fp = fdopen(_fd, "r+");
+ __stxWrapApiLeaveCritical();
+ DBGPRINTF(("SOCKET: sock=%d fd=%d fp=%"_lx_"\n",sock, _fd, (INT)fp));
+ }
# else
- fp = fdopen(sock, "r+");
+ fp = fdopen(sock, "r+");
# endif
- if (! fp) {
- DBGPRINTF(("SOCKET: fdopen call failed\n"));
- __INST(lastErrorNumber) = __MKSMALLINT(errno);
+ if (! fp) {
+ DBGPRINTF(("SOCKET: fdopen call failed\n"));
+ error = __MKSMALLINT(errno);
# ifdef DO_WRAP_CALLS
- {
- INT ret;
-
- do {
- __threadErrno = 0;
- ret = (INT)STX_WSA_NOINT_CALL1("closesocket", closesocket, sock);
- } while ((ret < 0) && (__threadErrno == EINTR));
- }
+ {
+ INT ret;
+
+ do {
+ __threadErrno = 0;
+ ret = (INT)STX_WSA_NOINT_CALL1("closesocket", closesocket, sock);
+ } while ((ret < 0) && (__threadErrno == EINTR));
+ }
# else
- __BEGIN_INTERRUPTABLE__
- closesocket(sock);
- DBGFPRINTF((stderr, "SOCKET: fdopen failed (%d)\n", sock));
- __END_INTERRUPTABLE__
+ __BEGIN_INTERRUPTABLE__
+ closesocket(sock);
+ DBGFPRINTF((stderr, "SOCKET: fdopen failed (%d)\n", sock));
+ __END_INTERRUPTABLE__
# endif
- } else {
- __INST(handleType) = @symbol(socketFilePointer);
-
- if ((@global(FileOpenTrace) == true) || __debugging__) {
- console_fprintf(stderr, "fdopen [Socket] -> %"_lx_"\n", (INT)fp);
- }
+ } else {
+ __INST(handleType) = @symbol(socketFilePointer);
+
+ if ((@global(FileOpenTrace) == true) || __debugging__) {
+ console_fprintf(stderr, "fdopen [Socket] -> %"_lx_"\n", (INT)fp);
+ }
# if 0
- // The original code was:
- __INST(handle) = __MKEXTERNALADDRESS(fp); __STORESELF(handle);
- // but for that, gcc generates wrong code, which loads self (volatile) into
- // a register (bp), then calls __MKEXTERNALADDRESS, then stores indirect bp.
- // That is wrong if a scavenge occurs in __MKEXTERNALADDRESS, as bp is now still pointing to the old
- // object.
+ // The original code was:
+ __INST(handle) = __MKEXTERNALADDRESS(fp); __STORESELF(handle);
+ // but for that, gcc generates wrong code, which loads self (volatile) into
+ // a register (bp), then calls __MKEXTERNALADDRESS, then stores indirect bp.
+ // That is wrong if a scavenge occurs in __MKEXTERNALADDRESS, as bp is now still pointing to the old
+ // object.
# endif
- {
- OBJ t;
-
- t = __MKEXTERNALADDRESS(fp);
- __INST(handle) = t;
- __STORE(self, t);
- }
- }
+ {
+ OBJ t;
+
+ t = __MKEXTERNALADDRESS(fp);
+ __INST(handle) = t;
+ __STORE(self, t);
+ }
+ }
}
#endif
out:;
@@ -3753,15 +3752,16 @@
"all ok?"
handle notNil ifTrue:[
- domain := domainArg.
- socketType := typeArg.
- Lobby register:self.
- ] ifFalse:[
- error notNil ifTrue:[
- ^ self primitiveFailed:error.
- ].
- ^ self openError:lastErrorNumber.
+ domain := domainArg.
+ socketType := typeArg.
+ Lobby register:self.
+ ^ self.
].
+ error isInteger ifTrue:[
+ lastErrorNumber := error.
+ ^ self openError:error.
+ ].
+ ^ self primitiveFailed:error.
"
Socket new domain:#AF_INET type:#stream
@@ -4126,10 +4126,10 @@
!Socket class methodsFor:'documentation'!
version
- ^ '$Header: /cvs/stx/stx/libbasic2/Socket.st,v 1.298 2014-03-28 08:00:39 stefan Exp $'
+ ^ '$Header: /cvs/stx/stx/libbasic2/Socket.st,v 1.299 2014-04-03 13:23:44 stefan Exp $'
!
version_CVS
- ^ '$Header: /cvs/stx/stx/libbasic2/Socket.st,v 1.298 2014-03-28 08:00:39 stefan Exp $'
+ ^ '$Header: /cvs/stx/stx/libbasic2/Socket.st,v 1.299 2014-04-03 13:23:44 stefan Exp $'
! !