64bit fixes
authorClaus Gittinger <cg@exept.de>
Fri, 08 Mar 2013 17:37:53 +0100
changeset 2909 aacef77a1697
parent 2908 505c2f7bb21d
child 2910 e7f29980eed5
64bit fixes
Socket.st
--- 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 $'
 ! !
-