--- 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 $'
! !