diff -r 65fa153f17aa -r c0e89dcb58b3 Socket.st --- 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 @@ -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 $' ! !