--- a/Socket.st Wed Mar 06 18:13:20 2013 +0100
+++ b/Socket.st Fri Mar 08 17:37:53 2013 +0100
@@ -49,16 +49,18 @@
* mhmh - WIN32-fclose has a problem in trying to close() the socket
* instead of closesocket()'ing it
*/
-# ifdef WIN32
-# define CLOSESOCKET_AFTER_FCLOSE
-# define xxCLOSESOCKET_BEFORE_FCLOSE
+# define CLOSESOCKET_AFTER_FCLOSE
+# define xxCLOSESOCKET_BEFORE_FCLOSE
+
+# ifdef __MINGW__
+extern HANDLE _get_osfhandle();
# endif
-# ifdef __BORLANDC__
-# define SOCKET_FROM_FD(fd) (_get_osfhandle(fd))
-# else
-# define SOCKET_FROM_FD(fd) (fd)
-# endif
+# ifdef __BORLANDC__
+# define SOCKET_FROM_FD(fd) (_get_osfhandle(fd))
+# else
+# define SOCKET_FROM_FD(fd) (fd)
+# endif
#else /* not WIN32 */
# define SOCKET_FROM_FD(fd) (fd)
@@ -76,14 +78,6 @@
#include <stdio.h>
#include <errno.h>
-#ifdef WIN32
-# ifdef __BORLANDC__
-# include <Ws2tcpip.h>
-# endif
-#else
-# include <netinet/ip.h>
-#endif
-
#ifdef WANT__TCP_DOT_H
# include <netinet/tcp.h>
#endif
@@ -1322,7 +1316,7 @@
or nil if no such service exists;
- used to convert service names to portNumbers"
-%{ /* UNLIMITEDSTACK */
+%{ /* UNLIMITEDSTACK(noWIN32) */
#ifndef NO_SOCKET
struct servent *servent = NULL;
char *protocol;
@@ -1789,7 +1783,7 @@
SOCKET sock;
union sockaddr_u sa;
int sockaddr_size;
- int ret;
+ INT ret;
int sockAddrOffs;
if (! __isBytes(addr)) {
@@ -2041,7 +2035,8 @@
union sockaddr_u sa;
SOCKET sock;
int a;
- int ret, oldFlags;
+ INT ret;
+ int oldFlags;
int on = 1;
int sockaddr_size;
@@ -2088,7 +2083,7 @@
do {
DBGFPRINTF((stderr, "SOCKET: connect...\n"));
__threadErrno = 0;
- ret = STX_WSA_NOINT_CALL3("connect", connect, sock, &sa, sockaddr_size);
+ ret = (INT)STX_WSA_NOINT_CALL3("connect", connect, sock, &sa, (INT)sockaddr_size);
DBGFPRINTF((stderr, "SOCKET: connect(%d) -> %d (%d)\n", sock, ret, __threadErrno));
} while ((ret < 0) && (__threadErrno == EINTR));
/* __setWrapCallDebugging(1,0); */
@@ -2210,12 +2205,12 @@
if (fp != nil) {
SOCKET sock;
- int objSize, offs;
- int n;
+ INT objSize, offs;
+ INT n;
char *extPtr;
unsigned char *buffer;
unsigned char *allocatedBuffer = NULL;
- int flags = 0;
+ INT flags = 0;
sock = SOCKET_FROM_FILE_OBJECT(fp);
@@ -2235,7 +2230,7 @@
do {
__threadErrno = 0;
- n = STX_WSA_NOINT_CALL4("recv", recv, sock, buffer, objSize, flags);
+ n = (INT)STX_WSA_NOINT_CALL4("recv", recv, sock, buffer, objSize, flags);
} while ((n < 0) && (__threadErrno == EINTR));
if (allocatedBuffer) {
@@ -2324,11 +2319,11 @@
if (fp != nil) {
SOCKET sock;
- int objSize;
+ INT objSize;
union sockaddr_u sa;
- unsigned int alen = 0;
- int n, offs;
- int flags = 0;
+ unsigned INT alen = 0;
+ INT n, offs;
+ INT flags = 0;
char *extPtr;
unsigned char *allocatedBuffer = NULL;
unsigned char *buffer = NULL;
@@ -2351,7 +2346,7 @@
do {
__threadErrno = 0;
alen = sizeof(sa);
- n = STX_WSA_NOINT_CALL6("recvfrom", recvfrom, sock, buffer, objSize, flags, (struct sockaddr *)&sa, &alen);
+ n = (INT)STX_WSA_NOINT_CALL6("recvfrom", recvfrom, sock, buffer, objSize, flags, (struct sockaddr *)&sa, &alen);
} while ((n < 0) && (__threadErrno == EINTR));
if (allocatedBuffer) {
@@ -2446,11 +2441,11 @@
&& __isSmallInteger(startIndex)
&& __isSmallInteger(nBytes)) {
SOCKET sock;
- int objSize;
- int n;
+ INT objSize;
+ INT n;
char *extPtr;
- int _flags = 0;
- int offs;
+ INT _flags = 0;
+ INT offs;
unsigned long norder;
unsigned char *buffer;
unsigned char *allocatedBuffer = NULL;
@@ -2480,7 +2475,7 @@
do {
__threadErrno = 0;
- n = STX_WSA_NOINT_CALL4("send", send, sock, buffer, objSize, _flags);
+ n = (INT)STX_WSA_NOINT_CALL4("send", send, sock, buffer, objSize, _flags);
} while ((n < 0) && (__threadErrno == EINTR));
if (allocatedBuffer) {
@@ -2570,15 +2565,15 @@
&& __isSmallInteger(startIndex)
&& __isSmallInteger(nBytes)) {
SOCKET sock;
- int objSize;
+ INT objSize;
struct sockaddr *sockaddr_ptr;
union sockaddr_u sa;
- int alen = 0;
- int sockAddrOffs, sockaddr_size;
- int n;
+ INT alen = 0;
+ INT sockAddrOffs, sockaddr_size;
+ INT n;
char *extPtr;
- int _flags = 0;
- int offs;
+ INT _flags = 0;
+ INT offs;
unsigned long norder;
unsigned char *buffer;
unsigned char *allocatedBuffer = NULL;
@@ -2623,7 +2618,7 @@
do {
__threadErrno = 0;
- n = STX_WSA_NOINT_CALL6("sendto", sendto, sock, buffer, objSize, _flags, sockaddr_ptr, sockaddr_size);
+ n = (INT)STX_WSA_NOINT_CALL6("sendto", sendto, sock, buffer, objSize, _flags, sockaddr_ptr, sockaddr_size);
} while ((n < 0) && (__threadErrno == EINTR));
if (allocatedBuffer) {
@@ -2680,7 +2675,7 @@
# ifdef DO_WRAP_CALLS
{
- int ret;
+ INT ret;
/*__setWrapCallDebugging(1,1); */
if (__INST(buffered) == true){
@@ -2689,7 +2684,7 @@
*/
do {
__threadErrno = 0;
- ret = __STX_C_CALL1("fflush", fflush, fp);
+ ret = (INT)__STX_C_CALL1("fflush", fflush, fp);
} while((ret < 0) && (__threadErrno == EINTR));
}
@@ -2699,13 +2694,13 @@
# endif
do {
__threadErrno = 0;
- ret = STX_C_NOINT_CALL1("fclose", fclose, fp);
+ ret = (INT)STX_C_NOINT_CALL1("fclose", fclose, fp);
} while ((ret < 0) && (__threadErrno == EINTR));
# if defined(WIN32) && defined(CLOSESOCKET_AFTER_FCLOSE)
do {
__threadErrno = 0;
- ret = STX_WSA_NOINT_CALL1("closesocket", closesocket, sock);
+ ret = (INT)STX_WSA_NOINT_CALL1("closesocket", closesocket, sock);
} while ((ret < 0) && (__threadErrno == EINTR));
# endif
/*__setWrapCallDebugging(1,0);*/
@@ -2763,7 +2758,7 @@
sock = SOCKET_FROM_FILE_OBJECT(fp);
sz = sizeof(err);
- if (getsockopt(sock, SOL_SOCKET, SO_ERROR, &err, &sz) < 0) {
+ if (getsockopt(sock, SOL_SOCKET, SO_ERROR, (char *)(&err), &sz) < 0) {
# ifdef WIN32
errno = WSAGetLastError();
# endif
@@ -2887,7 +2882,7 @@
do {
__threadErrno = 0;
alen = alen0;
- newSock = STX_WSA_CALL3("accept", accept, sock, &sa, &alen);
+ newSock = (SOCKET)STX_WSA_CALL3("accept", accept, sock, &sa, &alen);
} while ((newSock < 0) && (__threadErrno == EINTR));
# else
__BEGIN_INTERRUPTABLE__
@@ -2965,10 +2960,10 @@
__INST(lastErrorNumber) = __MKSMALLINT(errno);
# ifdef DO_WRAP_CALLS
{
- int ret;
+ INT ret;
do {
__threadErrno = 0;
- ret = STX_WSA_CALL1("closesocket", closesocket, newSock);
+ ret = (INT)STX_WSA_CALL1("closesocket", closesocket, newSock);
} while ((ret < 0) && (__threadErrno == EINTR));
}
# else
@@ -2983,6 +2978,7 @@
# 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);
@@ -3243,7 +3239,7 @@
if (usize == -1) goto argError;
- ok = ( setsockopt( sock, level, opt, &u, usize) >= 0) ? true : false;
+ ok = ( setsockopt( sock, level, opt, (char *)(&u), usize) >= 0) ? true : false;
}
argError: ;
#endif /* NO_SOCKET */
@@ -3272,21 +3268,21 @@
if ((__handle != nil) && __isSmallInteger(howNum)) {
FILE *fp = __FILEVal(__handle);
SOCKET sock = SOCKET_FROM_FILE(fp);
- int how = __intVal(howNum);
- int ret;
+ INT how = __intVal(howNum);
+ INT ret;
# ifdef DO_WRAP_CALLS
if (how > 0 && __INST(buffered) == true) {
// do a fflush() first, so that fclose() doesn't block
do {
__threadErrno = 0;
- ret = __STX_C_CALL1("fflush", fflush, fp);
+ ret = (INT)__STX_C_CALL1("fflush", fflush, fp);
} while((ret < 0) && (__threadErrno == EINTR));
}
do {
__threadErrno = 0;
DBGFPRINTF((stderr, "SOCKET: shutDown...\n"));
- ret = STX_WSA_NOINT_CALL2("shutdown", shutdown, sock, how);
+ ret = (INT)STX_WSA_NOINT_CALL2("shutdown", shutdown, sock, how);
DBGFPRINTF((stderr, "SOCKET: shutDown -> %d (%d)\n", ret, __threadErrno));
} while ((ret < 0) && (__threadErrno == EINTR));
# else
@@ -3513,7 +3509,7 @@
|domainName domainCode typeCode error|
handle notNil ifTrue:[
- ^ self errorAlreadyOpen
+ ^ self errorAlreadyOpen
].
domainName := SocketAddress domainCodeFromName:domainArg.
domainCode := OperatingSystem domainCodeOf:domainName.
@@ -3527,19 +3523,19 @@
SOCKET sock;
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);
}
@@ -3552,20 +3548,20 @@
# ifdef SOCKET_BLOCKS
# ifdef DO_WRAP_CALLS
do {
- __threadErrno = 0;
- sock = STX_WSA_NOINT_CALL3("socket", socket, dom, typ, proto);
+ __threadErrno = 0;
+ sock = STX_WSA_NOINT_CALL3("socket", socket, dom, typ, proto);
} while ((sock < 0) && (__threadErrno == EINTR));
# else
__BEGIN_INTERRUPTABLE__
do {
- DBGPRINTF(("SOCKET: opening socket domain=%d type=%d proto=%d\n", dom, typ, proto));
- sock = socket(dom, typ, proto);
+ DBGPRINTF(("SOCKET: opening socket domain=%d type=%d proto=%d\n", dom, typ, proto));
+ sock = socket(dom, typ, proto);
# if defined(EPROTONOSUPPORT) /* for SGI */
- if ((proto != 0) && (sock < 0) && (errno == EPROTONOSUPPORT)) {
- DBGPRINTF(("SOCKET: retry with UNSPEC protocol\n"));
- proto = 0;
- sock = socket(dom, typ, 0);
- }
+ if ((proto != 0) && (sock < 0) && (errno == EPROTONOSUPPORT)) {
+ DBGPRINTF(("SOCKET: retry with UNSPEC protocol\n"));
+ proto = 0;
+ sock = socket(dom, typ, 0);
+ }
# endif
} while ((sock < 0) && (errno == EINTR));
__END_INTERRUPTABLE__
@@ -3574,9 +3570,9 @@
sock = socket(dom, typ, proto);
# if defined(EPROTONOSUPPORT) /* for SGI */
if ((proto != 0) && (sock < 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
# endif
@@ -3589,98 +3585,99 @@
if (sock < 0)
# endif
{
- 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));
+ __INST(lastErrorNumber) = __MKSMALLINT(errno);
} else {
# ifdef SO_REUSEADDR
- if (reuse == true) {
- DBGPRINTF(("SOCKET: setsockopt - SO_REUSEADDR\n"));
- if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char *) &on, sizeof (on)) < 0) {
- DBGPRINTF(("SOCKET: setsockopt - SO_REUSEADDR failed\n"));
- }
- }
+ if (reuse == true) {
+ DBGPRINTF(("SOCKET: setsockopt - SO_REUSEADDR\n"));
+ if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char *) &on, sizeof (on)) < 0) {
+ DBGPRINTF(("SOCKET: setsockopt - SO_REUSEADDR failed\n"));
+ }
+ }
# endif /* SO_REUSEADDR */
# ifdef SET_LINGER_WHEN_CREATING_SOCKET
# ifdef 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
# endif
# ifdef WIN32
- /*
- * make it blocking
- */
- {
- int zero = 0;
-
- ioctlsocket(sock, FIONBIO, &zero);
- }
+ /*
+ * make it blocking
+ */
+ {
+ unsigned long zero = 0;
+
+ ioctlsocket(sock, FIONBIO, &zero);
+ }
# endif
- /*
- * make it a FILE *
- */
+ /*
+ * make it a FILE *
+ */
# ifdef WIN32
- {
- int _fd;
- __stxWrapApiEnterCritical();
+ {
+ int _fd;
+ __stxWrapApiEnterCritical();
# ifdef __BORLANDC__
- _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"));
+ __INST(lastErrorNumber) = __MKSMALLINT(errno);
# ifdef DO_WRAP_CALLS
- { int ret;
-
- do {
- __threadErrno = 0;
- ret = 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:;
@@ -3688,14 +3685,14 @@
"all ok?"
handle notNil ifTrue:[
- domain := domainArg.
- socketType := typeArg.
- Lobby register:self.
+ domain := domainArg.
+ socketType := typeArg.
+ Lobby register:self.
] ifFalse:[
- error notNil ifTrue:[
- ^ self primitiveFailed:error.
- ].
- ^ self openError:lastErrorNumber.
+ error notNil ifTrue:[
+ ^ self primitiveFailed:error.
+ ].
+ ^ self openError:lastErrorNumber.
].
"
@@ -4059,10 +4056,9 @@
!Socket class methodsFor:'documentation'!
version
- ^ '$Header: /cvs/stx/stx/libbasic2/Socket.st,v 1.277 2013-02-09 00:21:56 cg Exp $'
+ ^ '$Header: /cvs/stx/stx/libbasic2/Socket.st,v 1.278 2013-03-08 16:37:53 cg Exp $'
!
version_CVS
- ^ '$Header: /cvs/stx/stx/libbasic2/Socket.st,v 1.277 2013-02-09 00:21:56 cg Exp $'
+ ^ '$Header: /cvs/stx/stx/libbasic2/Socket.st,v 1.278 2013-03-08 16:37:53 cg Exp $'
! !
-