Socket.st
changeset 1539 c0e89dcb58b3
parent 1538 65fa153f17aa
child 1540 1b511ad12399
--- a/Socket.st	Thu Mar 10 21:02:45 2005 +0100
+++ b/Socket.st	Fri Mar 11 00:07:29 2005 +0100
@@ -66,8 +66,10 @@
 
 # define SOCKET_FROM_FILE(f)             (SOCKET_FROM_FD(fileno(f)))
 # define SOCKET_FROM_FILE_OBJECT(f)      (SOCKET_FROM_FILE(__FILEVal(f)))
+
 #ifndef WIN32
 # define closesocket(sock)    close(sock)
+# define SOCKET               int
 #endif
 
 #include <stdio.h>
@@ -1609,15 +1611,16 @@
 %{
 #ifndef NO_SOCKET
     OBJ fp = __INST(filePointer);
-    int objSize, offs;
-    int sock;
-    int n;
-    char *extPtr;
-    unsigned char *buffer;
-    unsigned char *allocatedBuffer;
-    int flags = 0;
 
     if (fp != nil) {
+	SOCKET sock;
+	int objSize, offs;
+	int n;
+	char *extPtr;
+	unsigned char *buffer;
+	unsigned char *allocatedBuffer;
+	int flags = 0;
+
 	sock = SOCKET_FROM_FILE_OBJECT(fp);
 
 	if (! setupBufferParameters(aDataBuffer, startIndex, &extPtr, &offs, &objSize)) goto bad;
@@ -1636,7 +1639,7 @@
 
 	do {
 	    __threadErrno = 0;
-	    n = STX_API_CALL4("recv", recv, sock, buffer, objSize, flags);
+	    n = STX_WSA_CALL4("recv", recv, sock, buffer, objSize, flags);
 	} while ((n < 0) && (__threadErrno == EINTR));
 
 	if (allocatedBuffer) {
@@ -1722,17 +1725,18 @@
 %{
 #ifndef NO_SOCKET
     OBJ fp = __INST(filePointer);
-    int objSize;
-    int sock;
-    union sockaddr_u sa;
-    int alen = 0;
-    int n, offs;
-    int flags = 0;
-    char *extPtr;
-    unsigned char *allocatedBuffer = NULL;
-    unsigned char *buffer = NULL;
 
     if (fp != nil) {
+	SOCKET sock;
+	int objSize;
+	union sockaddr_u sa;
+	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;
@@ -1751,7 +1755,7 @@
 	do {
 	    __threadErrno = 0;
 	    alen = sizeof(sa);
-	    n = STX_API_CALL6("recvfrom", recvfrom, sock, buffer, objSize, flags, (struct sockaddr *)&sa, &alen);
+	    n = STX_WSA_CALL6("recvfrom", recvfrom, sock, buffer, objSize, flags, (struct sockaddr *)&sa, &alen);
 	} while ((n < 0) && (__threadErrno == EINTR));
 
 	if (allocatedBuffer) {
@@ -1840,21 +1844,21 @@
 
 %{
 #ifndef NO_SOCKET
-    OBJ oClass;
     OBJ fp = __INST(filePointer);
-    int objSize;
-    int sock;
-    int n;
-    char *extPtr;
-    int _flags = 0;
-    int offs;
-    unsigned long norder;
-    unsigned char *buffer;
-    unsigned char *allocatedBuffer;
 
     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;
+
 	_flags = __longIntVal(flags);
 
 	sock = SOCKET_FROM_FILE_OBJECT(fp);
@@ -1880,7 +1884,7 @@
 
 	do {
 	    __threadErrno = 0;
-	    n = STX_API_CALL4("send", send, sock, buffer, objSize, _flags);
+	    n = STX_WSA_CALL4("send", send, sock, buffer, objSize, _flags);
 	} while ((n < 0) && (__threadErrno == EINTR));
 
 	if (allocatedBuffer) {
@@ -1965,25 +1969,25 @@
     ].
 %{
 #ifndef NO_SOCKET
-    OBJ oClass;
     OBJ fp = __INST(filePointer);
-    int objSize;
-    struct sockaddr *sockaddr_ptr;
-    union sockaddr_u sa;
-    int alen = 0;
-    int sockAddrOffs, sockaddr_size;
-    int sock;
-    int n;
-    char *extPtr;
-    int _flags = 0;
-    int offs;
-    unsigned long norder;
-    unsigned char *buffer;
-    unsigned char *allocatedBuffer;
 
     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;
+
 	_flags = __longIntVal(flags);
 	sock = SOCKET_FROM_FILE_OBJECT(fp);
 
@@ -2024,7 +2028,7 @@
 
 	do {
 	    __threadErrno = 0;
-	    n = STX_API_CALL6("sendto", sendto, sock, buffer, objSize, _flags, sockaddr_ptr, sockaddr_size);
+	    n = STX_WSA_CALL6("sendto", sendto, sock, buffer, objSize, _flags, sockaddr_ptr, sockaddr_size);
 	} while ((n < 0) && (__threadErrno == EINTR));
 
 	if (allocatedBuffer) {
@@ -2163,11 +2167,6 @@
 %{  /* STACK: 100000 */
 #ifndef NO_SOCKET
     OBJ fp = __INST(filePointer);
-    int sock;
-    union sockaddr_u sa;
-    int sockaddr_size;
-    int ret;
-    int sockAddrOffs;
 
     if (! __isBytes(addr)) {
 	addr = nil;
@@ -2175,6 +2174,12 @@
 	RETURN (false);
     }
     if (fp != nil) {
+	SOCKET sock;
+	union sockaddr_u sa;
+	int sockaddr_size;
+	int ret;
+	int sockAddrOffs;
+
 	{
 	    int nIndex;
 	    OBJ cls;
@@ -2203,17 +2208,21 @@
 	}
 # endif /* SO_REUSEADDR */
 
-# ifdef DO_WRAP_CALLS
+# ifdef BIND_BLOCKS
+#  ifdef DO_WRAP_CALLS
 	do {
 	    __threadErrno = 0;
-	    ret = STX_API_CALL3("bind", bind, sock, &sa, sockaddr_size);
+	    ret = STX_WSA_CALL3("bind", bind, sock, &sa, sockaddr_size);
 	} while ((ret < 0) && (__threadErrno == EINTR));
-# else
+#  else
 	__BEGIN_INTERRUPTABLE__
 	do {
 	    ret = bind(sock, (struct sockaddr *)&sa, sockaddr_size);
 	} while ((ret < 0) && (errno == EINTR));
 	__END_INTERRUPTABLE__
+#  endif
+# else
+	ret = bind(sock, (struct sockaddr *)&sa, sockaddr_size);
 # endif
 	if (ret < 0) {
 	    DBGPRINTF(("SOCKET: bind failed errno=%d\n", errno));
@@ -2269,7 +2278,7 @@
     OBJ fp = __INST(filePointer);
 
     if (fp != nil) {
-	int    sock;
+	SOCKET sock;
 	int opt = -1;
 	int level = -1;
 	int usize = -1;
@@ -2462,7 +2471,7 @@
     t = __INST(filePointer);
     if (t != nil) {
 	FILE *fp;
-	int sock;
+	SOCKET sock;
 
 	__INST(filePointer) = nil;
 	fp = __FILEVal(t);
@@ -2480,7 +2489,7 @@
 #  ifdef WIN32
 	  do {
 	    __threadErrno = 0;
-	    ret = STX_API_CALL1("closesocket", closesocket, sock);
+	    ret = STX_WSA_CALL1("closesocket", closesocket, sock);
 	  } while ((ret < 0) && (__threadErrno == EINTR));
 	  closesocket(sock);
 #  endif
@@ -2493,10 +2502,13 @@
 	if (@global(FileOpenTrace) == true) {
 	    fprintf(stderr, "fclose [Socket] %x\n", fp);
 	}
+#  ifdef xxWIN32
+	closesocket(sock);
+#  endif
+	fclose(fp);
 #  ifdef WIN32
 	closesocket(sock);
 #  endif
-	fclose(fp);
 
 # endif /* !DO_WRAP_CALLS */
     }
@@ -2519,7 +2531,8 @@
     if (fp == nil) {
 	err = EBADF;
     } else {
-	int sz, sock;
+	int sz;
+	SOCKET sock;
 
 	sock = SOCKET_FROM_FILE_OBJECT(fp);
 	sz = sizeof(err);
@@ -2551,7 +2564,7 @@
 %{
 #ifndef NO_SOCKET
     OBJ fp = __INST(filePointer);
-    int sock;
+    SOCKET sock;
     int ret;
 
     if (! __isSmallInteger(aNumber)) {
@@ -2565,7 +2578,7 @@
 # ifdef DO_WRAP_CALLS
     do {
 	__threadErrno = 0;
-	ret = STX_API_CALL2("listen", listen, sock, __intVal(aNumber));
+	ret = STX_WSA_CALL2("listen", listen, sock, __intVal(aNumber));
     } while ((ret < 0) && (__threadErrno == EINTR));
 # else
     __BEGIN_INTERRUPTABLE__
@@ -2615,7 +2628,7 @@
 
     fp = __INST(filePointer);
     if ((fp != nil) && __isSmallInteger(howNum)) {
-	int sock;
+	SOCKET sock;
 	int ret;
 
 	__INST(filePointer) = nil;
@@ -2623,7 +2636,7 @@
 # ifdef DO_WRAP_CALLS
 	do {
 	    __threadErrno = 0;
-	    ret = STX_API_CALL2("shutdown", shutdown, sock, __intVal(howNum));
+	    ret = STX_WSA_CALL2("shutdown", shutdown, sock, __intVal(howNum));
 	} while ((ret < 0) && (__threadErrno == EINTR));
 # else
 	__BEGIN_INTERRUPTABLE__
@@ -2738,7 +2751,7 @@
 #ifndef NO_SOCKET
     FILE *fp;
     int flags;
-    int sock, newSock;
+    SOCKET sock, newSock;
     union sockaddr_u sa;
     int alen, alen0;
     struct hostent *he ;
@@ -2762,7 +2775,7 @@
     do {
 	__threadErrno = 0;
 	alen = alen0;
-	newSock = STX_API_CALL3("accept", accept, sock, &sa, &alen);
+	newSock = STX_WSA_CALL3("accept", accept, sock, &sa, &alen);
     } while ((newSock < 0) && (__threadErrno == EINTR));
 # else
     __BEGIN_INTERRUPTABLE__
@@ -2836,7 +2849,7 @@
 	  int ret;
 	  do {
 	      __threadErrno = 0;
-	      ret = STX_API_CALL1("closesocket", closesocket, newSock);
+	      ret = STX_WSA_CALL1("closesocket", closesocket, newSock);
 	  } while ((ret < 0) && (__threadErrno == EINTR));
 	}
 #  else
@@ -3089,7 +3102,8 @@
 #ifndef NO_SOCKET
     OBJ fp = __INST(filePointer);
     union sockaddr_u sa;
-    int a, sock;
+    SOCKET sock;
+    int a;
     int ret, oldFlags;
     int on = 1;
     int sockaddr_size;
@@ -3134,7 +3148,7 @@
 # ifdef DO_WRAP_CALLS
     do {
 	__threadErrno = 0;
-	ret = STX_API_CALL3("connect", connect, sock, &sa, sockaddr_size);
+	ret = STX_WSA_CALL3("connect", connect, sock, &sa, sockaddr_size);
 	DBGPRINTF(("SOCKET: connect returns %d\n", ret));
     } while ((ret < 0) && (__threadErrno == EINTR));
 # else
@@ -3268,13 +3282,12 @@
 %{
 #ifndef NO_SOCKET
     OBJ fp = __INST(filePointer);
-    OBJ addrClass;
-    int sock;
+    SOCKET sock;
     int ret;
     union sockaddr_u sa;
     int alen, alen0;
     char *addrP;
-    int addrObjSize, nAddrInstVars, nAddrInstBytes;
+    int addrObjSize, nAddrInstBytes;
 
     if (!__isSmallInteger(addrLen)) {
 	DBGPRINTF(("SOCKET: bad addrLen\n"));
@@ -3290,7 +3303,8 @@
     }
 
     {
-	OBJ oClass;
+	OBJ addrClass;
+	int nAddrInstVars;
 
 	addrClass = __qClass(addr);
 	nAddrInstVars = __intVal(__ClassInstPtr(addrClass)->c_ninstvars);
@@ -3354,7 +3368,7 @@
 %{
 #ifndef NO_SOCKET
     OBJ fp = __INST(filePointer);
-    int sock;
+    SOCKET sock;
     int sockaddr_size;
     int ret;
 
@@ -3508,8 +3522,9 @@
 
 #ifndef NO_SOCKET
     FILE *fp;
-    int dom, typ, pf, proto = 0, sock;
+    int dom, typ, pf, proto = 0;
     int on = 1;
+    SOCKET sock;
 
     if (! __isSmallInteger(domainCode)) {
 	DBGPRINTF(("SOCKET: bad domain\n"));
@@ -3534,30 +3549,46 @@
     dom = __intVal(domainCode);
     typ = __intVal(typeCode);
 
-# ifdef DO_WRAP_CALLS
+# ifdef SOCKET_BLOCKS
+#  ifdef DO_WRAP_CALLS
     do {
 	__threadErrno = 0;
-	sock = STX_API_CALL3("socket", socket, dom, typ, proto);
+	sock = STX_WSA_CALL3("socket", socket, dom, typ, proto);
     } while ((sock < 0) && (__threadErrno == EINTR));
-# else
+#  else
     __BEGIN_INTERRUPTABLE__
     do {
 	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 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);
 	}
-# endif
+#   endif
     } while ((sock < 0) && (errno == EINTR));
     __END_INTERRUPTABLE__
+#  endif
+# else
+    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);
+    }
+#  endif
 # endif
 
     DBGFPRINTF((stderr, "socket create newSock=%d\n", sock));
 
-    if (sock < 0) {
+# ifdef WIN32
+    if (sock == INVALID_SOCKET)
+# else
+    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);
     } else {
@@ -3610,7 +3641,7 @@
 
 	      do {
 		__threadErrno = 0;
-		ret = STX_API_CALL1("closesocket", closesocket, sock);
+		ret = STX_WSA_CALL1("closesocket", closesocket, sock);
 	      } while ((ret < 0) && (__threadErrno == EINTR));
 	    }
 # else
@@ -3700,7 +3731,7 @@
 #if defined(SO_RCVBUF) && defined(SOL_SOCKET)
     {
 	OBJ fp = __INST(filePointer);
-	int sock;
+	SOCKET sock;
 	int opt;
 	int size;
 
@@ -3726,7 +3757,7 @@
 #if defined(SO_RCVBUF) && defined(SOL_SOCKET)
     if (__isSmallInteger(size)) {
 	OBJ fp = __INST(filePointer);
-	int sock;
+	SOCKET sock;
 	int opt;
 
 	sock = SOCKET_FROM_FILE_OBJECT(fp);
@@ -3755,7 +3786,7 @@
 #if defined(SO_RCVTIMEO) && defined(SOL_SOCKET) && defined(HZ)
     if (__isSmallInteger(millis)) {
 	OBJ fp = __INST(filePointer);
-	int sock;
+	SOCKET sock;
 	int opt;
 
 	sock = SOCKET_FROM_FILE_OBJECT(fp);
@@ -3781,7 +3812,7 @@
 #if defined(SO_SNDBUF) && defined(SOL_SOCKET)
     {
 	OBJ fp = __INST(filePointer);
-	int sock;
+	SOCKET sock;
 	int opt;
 	int size;
 
@@ -3807,7 +3838,7 @@
 #if defined(SO_SNDBUF) && defined(SOL_SOCKET)
     if (__isSmallInteger(size)) {
 	OBJ fp = __INST(filePointer);
-	int sock;
+	SOCKET sock;
 	int opt;
 
 	sock = SOCKET_FROM_FILE_OBJECT(fp);
@@ -3836,7 +3867,7 @@
 #if defined(SO_SNDTIMEO) && defined(SOL_SOCKET) && defined(HZ)
     if (__isSmallInteger(millis)) {
 	OBJ fp = __INST(filePointer);
-	int sock;
+	SOCKET sock;
 	int opt;
 
 	sock = SOCKET_FROM_FILE_OBJECT(fp);
@@ -3865,7 +3896,7 @@
 
     if ((aBoolean == true) || (aBoolean == false)) {
 	OBJ fp = __INST(filePointer);
-	int sock;
+	SOCKET sock;
 	int onOff = (aBoolean == true);
 
 	sock = SOCKET_FROM_FILE_OBJECT(fp);
@@ -3893,7 +3924,7 @@
 
     if ((aBoolean == true) || (aBoolean == false)) {
 	OBJ fp = __INST(filePointer);
-	int sock;
+	SOCKET sock;
 	int onOff = (aBoolean == true);
 
 	sock = SOCKET_FROM_FILE_OBJECT(fp);
@@ -3909,5 +3940,5 @@
 !Socket class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /cvs/stx/stx/libbasic2/Socket.st,v 1.214 2005-03-10 20:02:45 cg Exp $'
+    ^ '$Header: /cvs/stx/stx/libbasic2/Socket.st,v 1.215 2005-03-10 23:07:29 cg Exp $'
 ! !