--- a/Socket.st Wed Aug 04 16:10:14 1999 +0200
+++ b/Socket.st Wed Aug 04 16:12:12 1999 +0200
@@ -2192,16 +2192,16 @@
i.e. address must always be nil.
The interpretation of portNrOrName depends on the domain:
- inet domain uses (4byte) byteArray like internet numbers,
- unix domain uses pathname strings,
- others use whatever will come up in the future
+ inet domain uses (4byte) byteArray like internet numbers,
+ unix domain uses pathname strings,
+ others use whatever will come up in the future
The reuse boolean argument controls if the SO_REUSEADDR socket option
is to be set (to avoid the 'bind: address in use' error).
"
filePointer isNil ifTrue:[
- ^ self error:'not a valid socket'
+ ^ self errorNotOpen
].
%{
#ifndef NO_SOCKET
@@ -2210,16 +2210,16 @@
int sock;
union {
# ifdef AF_INET
- struct sockaddr_in in;
+ struct sockaddr_in in;
# endif
# ifdef AF_INET6
- struct sockaddr_in6 in6;
+ struct sockaddr_in6 in6;
# endif
# ifdef AF_UNIX
- struct sockaddr_un un;
+ struct sockaddr_un un;
# endif
# ifdef AF_APPLETALK
- struct sockaddr_at at;
+ struct sockaddr_at at;
# endif
} sa;
int sockaddr_size;
@@ -2228,8 +2228,8 @@
int ok;
if (!__isString(__INST(domain)) && !__isSymbol(__INST(domain))) {
- DBGPRINTF(("SOCKET: invalid domain arg\n"));
- RETURN (false);
+ DBGPRINTF(("SOCKET: invalid domain arg\n"));
+ RETURN (false);
}
ok = 0;
@@ -2237,141 +2237,141 @@
# ifdef AF_INET
if (myDomain == @symbol(inet)) {
- /*
- * INET addresses - port must be a smallinteger or nil
- */
- sa.in.sin_family = AF_INET;
-
- if (portNrOrName == nil) {
- sa.in.sin_port = 0;
- } else {
- if (! __isSmallInteger(portNrOrName)) {
- DBGPRINTF(("SOCKET: invalid port arg\n"));
- RETURN (false);
- }
- sa.in.sin_port = htons((u_short) _intVal(portNrOrName));
- }
-
- /*
- * INET addresses - addr must be nil, integer or byteArray
- */
- if (address == nil) {
- sa.in.sin_addr.s_addr = htonl(INADDR_ANY);
- } else {
- if (__isInteger(address)) {
- sa.in.sin_addr.s_addr = htonl(__longIntVal(address));
- } else {
- if (__isByteArray(address)) {
- unsigned char *cp;
- int n;
-
- cp = __ByteArrayInstPtr(address)->ba_element;
- n = __byteArraySize(address);
- if (n > 4) n = 4;
- bcopy(cp, &sa.in.sin_addr.s_addr, n);
- } else {
- unsigned addr;
- struct hostent *hp ;
-
- if (! __isString(address)) {
- DBGPRINTF(("SOCKET: invalid address arg in bind\n"));
- RETURN (false);
- }
-
- if ((addr = inet_addr(__stringVal(address))) != -1) {
- /*
- * is Internet addr in octet notation
- */
- bcopy(&addr, (char *) &sa.in.sin_addr, sizeof(addr)) ; /* set address */
- } else {
- /*
- * do we know the host's address?
- */
- GETHOSTBYNAME(hp, __stringVal(address))
- if (hp == NULL) {
- DBGPRINTF(("SOCKET: unknown host:%s\n", __stringVal(address)));
- RETURN (false);
- }
- bcopy(hp->h_addr, (char *) &sa.in.sin_addr, hp->h_length) ;
- sa.in.sin_family = hp->h_addrtype;
- }
- }
- }
- }
- DBGPRINTF(("SOCKET: bind addr: %x port: %x\n", sa.in.sin_addr.s_addr, sa.in.sin_port));
- sockaddr_size = sizeof(struct sockaddr_in);
- ok = 1;
+ /*
+ * INET addresses - port must be a smallinteger or nil
+ */
+ sa.in.sin_family = AF_INET;
+
+ if (portNrOrName == nil) {
+ sa.in.sin_port = 0;
+ } else {
+ if (! __isSmallInteger(portNrOrName)) {
+ DBGPRINTF(("SOCKET: invalid port arg\n"));
+ RETURN (false);
+ }
+ sa.in.sin_port = htons((u_short) _intVal(portNrOrName));
+ }
+
+ /*
+ * INET addresses - addr must be nil, integer or byteArray
+ */
+ if (address == nil) {
+ sa.in.sin_addr.s_addr = htonl(INADDR_ANY);
+ } else {
+ if (__isInteger(address)) {
+ sa.in.sin_addr.s_addr = htonl(__longIntVal(address));
+ } else {
+ if (__isByteArray(address)) {
+ unsigned char *cp;
+ int n;
+
+ cp = __ByteArrayInstPtr(address)->ba_element;
+ n = __byteArraySize(address);
+ if (n > 4) n = 4;
+ bcopy(cp, &sa.in.sin_addr.s_addr, n);
+ } else {
+ unsigned addr;
+ struct hostent *hp ;
+
+ if (! __isString(address)) {
+ DBGPRINTF(("SOCKET: invalid address arg in bind\n"));
+ RETURN (false);
+ }
+
+ if ((addr = inet_addr(__stringVal(address))) != -1) {
+ /*
+ * is Internet addr in octet notation
+ */
+ bcopy(&addr, (char *) &sa.in.sin_addr, sizeof(addr)) ; /* set address */
+ } else {
+ /*
+ * do we know the host's address?
+ */
+ GETHOSTBYNAME(hp, __stringVal(address))
+ if (hp == NULL) {
+ DBGPRINTF(("SOCKET: unknown host:%s\n", __stringVal(address)));
+ RETURN (false);
+ }
+ bcopy(hp->h_addr, (char *) &sa.in.sin_addr, hp->h_length) ;
+ sa.in.sin_family = hp->h_addrtype;
+ }
+ }
+ }
+ }
+ DBGPRINTF(("SOCKET: bind addr: %x port: %x\n", sa.in.sin_addr.s_addr, sa.in.sin_port));
+ sockaddr_size = sizeof(struct sockaddr_in);
+ ok = 1;
}
# endif /* AF_INET */
# ifdef AF_INET6
if (myDomain == @symbol(inet6)) {
- /*
- * INET6 addresses - port must be a smallinteger or nil
- */
- sa.in6.sin6_family = AF_INET6;
-
- if (portNrOrName == nil) {
- sa.in6.sin6_port = 0;
- } else {
- if (! __isSmallInteger(portNrOrName)) {
- DBGPRINTF(("SOCKET: invalid port arg\n"));
- RETURN (false);
- }
- sa.in6.sin6_port = htons((u_short) _intVal(portNrOrName));
- }
-
- /*
- * INET6 addresses - addr must be nil or byteArray or string
- */
- if (address == nil) {
- sa.in6.sin6_addr.s6_addr[0] = 0;
- sa.in6.sin6_addr.s6_addr[1] = 0;
- sa.in6.sin6_addr.s6_addr[2] = 0;
- sa.in6.sin6_addr.s6_addr[3] = 0;
- sa.in6.sin6_addr.s6_addr[4] = 0;
- sa.in6.sin6_addr.s6_addr[5] = 0;
- } else {
- if (__isByteArray(address)) {
- unsigned char *cp;
- int n;
-
- cp = __ByteArrayInstPtr(address)->ba_element;
- n = __byteArraySize(address);
- if (n > 6) n = 6;
- bcopy(cp, &sa.in6.sin6_addr.s6_addr, n);
- } else {
- unsigned addr;
- struct hostent *hp ;
-
- if (! __isString(address)) {
- DBGPRINTF(("SOCKET: invalid address arg in bind\n"));
- RETURN (false);
- }
-
- /*
- * do we know the host's address?
- */
- GETHOSTBYNAME(hp, __stringVal(address))
- if (hp == NULL) {
- DBGPRINTF(("SOCKET: unknown host:%s\n", __stringVal(address)));
- RETURN (false);
- }
- bcopy(hp->h_addr, (char *) &sa.in6.sin6_addr, hp->h_length) ;
- sa.in.sin_family = hp->h_addrtype;
- }
- }
-
- DBGPRINTF(("SOCKET: bind addr: %x.%x.%x.%x.%x.%x port: %x\n",
- sa.in6.sin6_addr.s6_addr[0],
- sa.in6.sin6_addr.s6_addr[1],
- sa.in6.sin6_addr.s6_addr[2],
- sa.in6.sin6_addr.s6_addr[3],
- sa.in6.sin6_addr.s6_addr[4],
- sa.in6.sin6_addr.s6_addr[5],
- sa.in6.sin6_port));
- sockaddr_size = sizeof(struct sockaddr_in6);
- ok = 1;
+ /*
+ * INET6 addresses - port must be a smallinteger or nil
+ */
+ sa.in6.sin6_family = AF_INET6;
+
+ if (portNrOrName == nil) {
+ sa.in6.sin6_port = 0;
+ } else {
+ if (! __isSmallInteger(portNrOrName)) {
+ DBGPRINTF(("SOCKET: invalid port arg\n"));
+ RETURN (false);
+ }
+ sa.in6.sin6_port = htons((u_short) _intVal(portNrOrName));
+ }
+
+ /*
+ * INET6 addresses - addr must be nil or byteArray or string
+ */
+ if (address == nil) {
+ sa.in6.sin6_addr.s6_addr[0] = 0;
+ sa.in6.sin6_addr.s6_addr[1] = 0;
+ sa.in6.sin6_addr.s6_addr[2] = 0;
+ sa.in6.sin6_addr.s6_addr[3] = 0;
+ sa.in6.sin6_addr.s6_addr[4] = 0;
+ sa.in6.sin6_addr.s6_addr[5] = 0;
+ } else {
+ if (__isByteArray(address)) {
+ unsigned char *cp;
+ int n;
+
+ cp = __ByteArrayInstPtr(address)->ba_element;
+ n = __byteArraySize(address);
+ if (n > 6) n = 6;
+ bcopy(cp, &sa.in6.sin6_addr.s6_addr, n);
+ } else {
+ unsigned addr;
+ struct hostent *hp ;
+
+ if (! __isString(address)) {
+ DBGPRINTF(("SOCKET: invalid address arg in bind\n"));
+ RETURN (false);
+ }
+
+ /*
+ * do we know the host's address?
+ */
+ GETHOSTBYNAME(hp, __stringVal(address))
+ if (hp == NULL) {
+ DBGPRINTF(("SOCKET: unknown host:%s\n", __stringVal(address)));
+ RETURN (false);
+ }
+ bcopy(hp->h_addr, (char *) &sa.in6.sin6_addr, hp->h_length) ;
+ sa.in.sin_family = hp->h_addrtype;
+ }
+ }
+
+ DBGPRINTF(("SOCKET: bind addr: %x.%x.%x.%x.%x.%x port: %x\n",
+ sa.in6.sin6_addr.s6_addr[0],
+ sa.in6.sin6_addr.s6_addr[1],
+ sa.in6.sin6_addr.s6_addr[2],
+ sa.in6.sin6_addr.s6_addr[3],
+ sa.in6.sin6_addr.s6_addr[4],
+ sa.in6.sin6_addr.s6_addr[5],
+ sa.in6.sin6_port));
+ sockaddr_size = sizeof(struct sockaddr_in6);
+ ok = 1;
}
# endif /* AF_INET6 */
@@ -2380,24 +2380,24 @@
* UNIX domain - port is ignored; address must be a string (path)
*/
if (myDomain == @symbol(unix)) {
- char *pathName;
- int l;
-
- if (! __isString(portNrOrName)) {
- DBGPRINTF(("SOCKET: invalid port (pathname) arg\n"));
- RETURN (false);
- }
- pathName = (char *)__stringVal(portNrOrName);
- l = strlen(pathName);
- if ((l + sizeof ( sa.un.sun_family )) > sizeof(struct sockaddr_un)) {
- DBGPRINTF(("SOCKET: pathname too long\n"));
- RETURN (false);
- }
-
- strcpy(sa.un.sun_path, pathName);
- sa.un.sun_family = AF_UNIX;
- sockaddr_size = l + sizeof ( sa.un.sun_family );
- ok = 1;
+ char *pathName;
+ int l;
+
+ if (! __isString(portNrOrName)) {
+ DBGPRINTF(("SOCKET: invalid port (pathname) arg\n"));
+ RETURN (false);
+ }
+ pathName = (char *)__stringVal(portNrOrName);
+ l = strlen(pathName);
+ if ((l + sizeof ( sa.un.sun_family )) > sizeof(struct sockaddr_un)) {
+ DBGPRINTF(("SOCKET: pathname too long\n"));
+ RETURN (false);
+ }
+
+ strcpy(sa.un.sun_path, pathName);
+ sa.un.sun_family = AF_UNIX;
+ sockaddr_size = l + sizeof ( sa.un.sun_family );
+ ok = 1;
}
# endif /* AF_UNIX */
@@ -2406,72 +2406,72 @@
* this has never been tested ....
*/
if (myDomain == @symbol(appletalk)) {
- /*
- * APPLETALK addresses - port must be a smallinteger or nil
- */
- sa.at.sat_family = AF_APPLETALK;
-
- if (portNrOrName == nil) {
- sa.at.sat_port = 0;
- } else {
- if (! __isSmallInteger(portNrOrName)) {
- DBGPRINTF(("SOCKET: invalid port arg\n"));
- RETURN (false);
- }
- sa.at.sat_port = __intVal(portNrOrName);
- }
-
- /*
- * APPLETALK addresses - addr must be nil, integer or byteArray
- * if integer, the low 8 bits are the node, the next higher 16
- * bit are the net.
- */
- if (address == nil) {
- sa.at.sat_addr.s_net = ATADDR_ANYNET;
- sa.at.sat_addr.s_node = ATADDR_ANYNODE;
- } else {
- if (__isInteger(address)) {
- unsigned a = __longIntVal(address);
- sa.at.sat_addr.s_net = htons((a >> 8) & 0xFFFF);
- sa.at.sat_addr.s_node = htons(a & 0xFF);
- } else {
- if (__isByteArray(address)) {
- unsigned char *cp;
- int n;
-
- cp = __ByteArrayInstPtr(address)->ba_element;
- n = __byteArraySize(address);
- if (n > 3) n = 3;
- bcopy(cp, &sa.at.sat_addr, n);
- } else {
- unsigned addr;
- struct hostent *hp ;
-
- if (! __isString(address)) {
- DBGPRINTF(("SOCKET: invalid address arg in bind\n"));
- RETURN (false);
- }
-
- /*
- * do we know the host's address?
- */
- GETHOSTBYNAME(hp, __stringVal(address))
- if (hp == NULL) {
- DBGPRINTF(("SOCKET: unknown host: %s\n", __stringVal(address)));
- RETURN (false);
- }
- if (hp->h_addrtype != AF_APPLETALK) {
- DBGPRINTF(("SOCKET: host:%s is not an appletalk host\n", __stringVal(address)));
- RETURN (false);
- }
- bcopy(hp->h_addr, (char *) &sa.at.sat_addr, hp->h_length) ;
- sa.at.sat_family = hp->h_addrtype;
- }
- }
- }
- DBGPRINTF(("SOCKET: bind addr: %x port: %x\n", sa.in.sin_addr.s_addr, sa.in.sin_port));
- sockaddr_size = sizeof(struct sockaddr_at);
- ok = 1;
+ /*
+ * APPLETALK addresses - port must be a smallinteger or nil
+ */
+ sa.at.sat_family = AF_APPLETALK;
+
+ if (portNrOrName == nil) {
+ sa.at.sat_port = 0;
+ } else {
+ if (! __isSmallInteger(portNrOrName)) {
+ DBGPRINTF(("SOCKET: invalid port arg\n"));
+ RETURN (false);
+ }
+ sa.at.sat_port = __intVal(portNrOrName);
+ }
+
+ /*
+ * APPLETALK addresses - addr must be nil, integer or byteArray
+ * if integer, the low 8 bits are the node, the next higher 16
+ * bit are the net.
+ */
+ if (address == nil) {
+ sa.at.sat_addr.s_net = ATADDR_ANYNET;
+ sa.at.sat_addr.s_node = ATADDR_ANYNODE;
+ } else {
+ if (__isInteger(address)) {
+ unsigned a = __longIntVal(address);
+ sa.at.sat_addr.s_net = htons((a >> 8) & 0xFFFF);
+ sa.at.sat_addr.s_node = htons(a & 0xFF);
+ } else {
+ if (__isByteArray(address)) {
+ unsigned char *cp;
+ int n;
+
+ cp = __ByteArrayInstPtr(address)->ba_element;
+ n = __byteArraySize(address);
+ if (n > 3) n = 3;
+ bcopy(cp, &sa.at.sat_addr, n);
+ } else {
+ unsigned addr;
+ struct hostent *hp ;
+
+ if (! __isString(address)) {
+ DBGPRINTF(("SOCKET: invalid address arg in bind\n"));
+ RETURN (false);
+ }
+
+ /*
+ * do we know the host's address?
+ */
+ GETHOSTBYNAME(hp, __stringVal(address))
+ if (hp == NULL) {
+ DBGPRINTF(("SOCKET: unknown host: %s\n", __stringVal(address)));
+ RETURN (false);
+ }
+ if (hp->h_addrtype != AF_APPLETALK) {
+ DBGPRINTF(("SOCKET: host:%s is not an appletalk host\n", __stringVal(address)));
+ RETURN (false);
+ }
+ bcopy(hp->h_addr, (char *) &sa.at.sat_addr, hp->h_length) ;
+ sa.at.sat_family = hp->h_addrtype;
+ }
+ }
+ }
+ DBGPRINTF(("SOCKET: bind addr: %x port: %x\n", sa.in.sin_addr.s_addr, sa.in.sin_port));
+ sockaddr_size = sizeof(struct sockaddr_at);
+ ok = 1;
}
# endif /* AF_APPLETALK */
@@ -2528,89 +2528,89 @@
# endif
if (! ok) {
- DBGPRINTF(("SOCKET: unsupported domain\n"));
- RETURN (false);
+ DBGPRINTF(("SOCKET: unsupported domain\n"));
+ RETURN (false);
}
sock = fileno(__FILEVal(t));
# ifdef SO_REUSEADDR
if (reuse == true) {
- if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char *) &on, sizeof (on)) < 0) {
- DBGPRINTF(("SOCKET: setsockopt - SO_REUSEADDR failed\n"));
- }
+ if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char *) &on, sizeof (on)) < 0) {
+ DBGPRINTF(("SOCKET: setsockopt - SO_REUSEADDR failed\n"));
+ }
}
# endif /* SO_REUSEADDR */
__BEGIN_INTERRUPTABLE__
do {
- ret = bind(sock, (struct sockaddr *)&sa, sockaddr_size);
+ ret = bind(sock, (struct sockaddr *)&sa, sockaddr_size);
} while ((ret < 0) && (errno == EINTR));
__END_INTERRUPTABLE__
if (ret < 0) {
- DBGPRINTF(("SOCKET: bind failed errno=%d\n", errno));
- __INST(lastErrorNumber) = __MKSMALLINT(errno);
- RETURN (false);
+ DBGPRINTF(("SOCKET: bind failed errno=%d\n", errno));
+ __INST(lastErrorNumber) = __MKSMALLINT(errno);
+ RETURN (false);
}
__INST(port) = portNrOrName; __STORE(self, portNrOrName);
# ifdef AF_INET
if (myDomain == @symbol(inet)) {
- if (! __isSmallInteger(portNrOrName)
- || (portNrOrName == __MKSMALLINT(0))) {
- int p;
-
- /*
- * INET anonymous port - get the actual portNr
- */
- if (getsockname(sock, (struct sockaddr *)&sa, &sockaddr_size) < 0) {
- DBGPRINTF(("SOCKET: cannot get peername\n"));
- } else {
- DBGPRINTF(("SOCKET: anon port=%x\n", sa.in.sin_port));
- p = ntohs(sa.in.sin_port);
- __INST(port) = __MKSMALLINT(p);
- }
- }
+ if (! __isSmallInteger(portNrOrName)
+ || (portNrOrName == __MKSMALLINT(0))) {
+ int p;
+
+ /*
+ * INET anonymous port - get the actual portNr
+ */
+ if (getsockname(sock, (struct sockaddr *)&sa, &sockaddr_size) < 0) {
+ DBGPRINTF(("SOCKET: cannot get peername\n"));
+ } else {
+ DBGPRINTF(("SOCKET: anon port=%x\n", sa.in.sin_port));
+ p = ntohs(sa.in.sin_port);
+ __INST(port) = __MKSMALLINT(p);
+ }
+ }
}
# endif
# ifdef AF_INET6
if (myDomain == @symbol(inet6)) {
- if (! __isSmallInteger(portNrOrName)
- || (portNrOrName == __MKSMALLINT(0))) {
- int p;
-
- /*
- * INET6 anonymous port - get the actual portNr
- */
- if (getsockname(sock, (struct sockaddr *)&sa, &sockaddr_size) < 0) {
- DBGPRINTF(("SOCKET: cannot get peername\n"));
- } else {
- DBGPRINTF(("SOCKET: anon port=%x\n", sa.in.sin_port));
- p = ntohs(sa.in6.sin6_port);
- __INST(port) = __MKSMALLINT(p);
- }
- }
+ if (! __isSmallInteger(portNrOrName)
+ || (portNrOrName == __MKSMALLINT(0))) {
+ int p;
+
+ /*
+ * INET6 anonymous port - get the actual portNr
+ */
+ if (getsockname(sock, (struct sockaddr *)&sa, &sockaddr_size) < 0) {
+ DBGPRINTF(("SOCKET: cannot get peername\n"));
+ } else {
+ DBGPRINTF(("SOCKET: anon port=%x\n", sa.in.sin_port));
+ p = ntohs(sa.in6.sin6_port);
+ __INST(port) = __MKSMALLINT(p);
+ }
+ }
}
# endif
# ifdef AF_APPLETALK
if (myDomain == @symbol(appletalk)) {
- if (! __isSmallInteger(portNrOrName)
- || (portNrOrName == __MKSMALLINT(0))) {
- int p;
-
- /*
- * APPLETALK anonymous port - get the actual portNr
- */
- if (getsockname(sock, (struct sockaddr *)&sa, &sockaddr_size) < 0) {
- DBGPRINTF(("SOCKET: cannot get peername\n"));
- } else {
- DBGPRINTF(("SOCKET: anon port=%x\n", sa.in.sin_port));
- p = sa.at.sat_port;
- __INST(port) = __MKSMALLINT(p);
- }
- }
+ if (! __isSmallInteger(portNrOrName)
+ || (portNrOrName == __MKSMALLINT(0))) {
+ int p;
+
+ /*
+ * APPLETALK anonymous port - get the actual portNr
+ */
+ if (getsockname(sock, (struct sockaddr *)&sa, &sockaddr_size) < 0) {
+ DBGPRINTF(("SOCKET: cannot get peername\n"));
+ } else {
+ DBGPRINTF(("SOCKET: anon port=%x\n", sa.in.sin_port));
+ p = sa.at.sat_port;
+ __INST(port) = __MKSMALLINT(p);
+ }
+ }
}
# endif
@@ -2622,8 +2622,8 @@
"
(Socket domain:#inet type:#stream)
- bindTo:9999
- address:nil
+ bindTo:9999
+ address:nil
"
!
@@ -2659,7 +2659,7 @@
"start listening; return true if ok, false on error"
filePointer isNil ifTrue:[
- ^ self error:'not a valid socket'
+ ^ self errorNotOpen
].
%{
#ifndef NO_SOCKET
@@ -2668,22 +2668,22 @@
int ret;
if (! __isSmallInteger(aNumber)) {
- DBGPRINTF(("SOCKET: invalid arg\n"));
- RETURN (false);
+ DBGPRINTF(("SOCKET: invalid arg\n"));
+ RETURN (false);
}
sock = fileno(__FILEVal(fp));
__BEGIN_INTERRUPTABLE__
do {
- ret = listen(sock, _intVal(aNumber));
+ ret = listen(sock, _intVal(aNumber));
} while ((ret < 0) && (errno == EINTR));
__END_INTERRUPTABLE__
if (ret < 0) {
- DBGPRINTF(("SOCKET: listen call failed errno=%d\n", errno));
- __INST(lastErrorNumber) = __MKSMALLINT(errno);
- RETURN (false);
+ DBGPRINTF(("SOCKET: listen call failed errno=%d\n", errno));
+ __INST(lastErrorNumber) = __MKSMALLINT(errno);
+ RETURN (false);
}
#else
RETURN (false);
@@ -2761,22 +2761,22 @@
Return the true if ok; false if not.
NOTICE: this method will block, if no connection is already pending.
- use readWait or Socket>>accept."
+ use readWait or Socket>>accept."
|serverSocketFd|
filePointer notNil ifTrue:[
- ^ self error:'already connected'
+ ^ self errorAlreadyOpen
].
domain := aSocket domain.
socketType := aSocket type.
serverSocketFd := aSocket fileDescriptor.
serverSocketFd isNil ifTrue:[
- ^ self error:'invalid server socket'
+ ^ self error:'invalid server socket'
].
(serverSocketFd isMemberOf:SmallInteger) ifFalse:[
- ^ self error:'invalid server socket'
+ ^ self error:'invalid server socket'
].
%{
#ifndef NO_SOCKET
@@ -2785,16 +2785,16 @@
int sock, newSock;
union {
#ifdef AF_INET
- struct sockaddr_in in;
+ struct sockaddr_in in;
#endif
# ifdef AF_INET6
- struct sockaddr_in6 in6;
+ struct sockaddr_in6 in6;
# endif
# ifdef AF_UNIX
- struct sockaddr_un un;
+ struct sockaddr_un un;
# endif
# ifdef AF_APPLETALK
- struct sockaddr_at at;
+ struct sockaddr_at at;
# endif
} sa;
int alen, alen0;
@@ -2810,22 +2810,22 @@
#ifdef AF_INET
if (__INST(domain) == @symbol(inet)) {
- alen0 = sizeof(sa.in);
+ alen0 = sizeof(sa.in);
}
#endif
#ifdef AF_INET6
if (__INST(domain) == @symbol(inet6)) {
- alen0 = sizeof(sa.in6);
+ alen0 = sizeof(sa.in6);
}
#endif
#ifdef AF_UNIX
if (__INST(domain) == @symbol(unix)) {
- alen0 = sizeof(sa.un);
+ alen0 = sizeof(sa.un);
}
#endif
# ifdef AF_APPLETALK
if (__INST(domain) == @symbol(appletalk)) {
- alen0 = sizeof(sa.at);
+ alen0 = sizeof(sa.at);
}
# endif
@@ -2883,8 +2883,8 @@
__BEGIN_INTERRUPTABLE__
do {
- alen = alen0;
- newSock = accept(sock, (struct sockaddr *) &sa, &alen);
+ alen = alen0;
+ newSock = accept(sock, (struct sockaddr *) &sa, &alen);
} while ((newSock < 0) && (errno == EINTR));
__END_INTERRUPTABLE__
@@ -2893,9 +2893,9 @@
#endif
if (newSock < 0) {
- DBGPRINTF(("SOCKET: accept call failed errno=%d\n", errno));
- __INST(lastErrorNumber) = __MKSMALLINT(errno);
- RETURN (false);
+ DBGPRINTF(("SOCKET: accept call failed errno=%d\n", errno));
+ __INST(lastErrorNumber) = __MKSMALLINT(errno);
+ RETURN (false);
}
/*
@@ -2903,71 +2903,71 @@
*/
#ifdef AF_INET
if (__INST(domain) == @symbol(inet)) {
- GETHOSTBYADDR(he, (char *) &sa.in.sin_addr.s_addr, alen, AF_INET);
- if (! he) {
- unsigned long norder;
-
- norder = htonl(sa.in.sin_addr.s_addr) ;
- sprintf(dotted, "%d.%d.%d.%d",
- (norder >> 24) & 0xFF,
- (norder >> 16) & 0xFF,
- (norder >> 8) & 0xFF,
- norder & 0xFF);
- }
- DBGPRINTF(("SOCKET: accepted connection from host %s\n", (he ? he->h_name : dotted))) ;
- __INST(peerName) = __MKSTRING((he ? he->h_name : dotted));
- __STORESELF(peerName);
+ GETHOSTBYADDR(he, (char *) &sa.in.sin_addr.s_addr, alen, AF_INET);
+ if (! he) {
+ unsigned long norder;
+
+ norder = htonl(sa.in.sin_addr.s_addr) ;
+ sprintf(dotted, "%d.%d.%d.%d",
+ (norder >> 24) & 0xFF,
+ (norder >> 16) & 0xFF,
+ (norder >> 8) & 0xFF,
+ norder & 0xFF);
+ }
+ DBGPRINTF(("SOCKET: accepted connection from host %s\n", (he ? he->h_name : dotted))) ;
+ __INST(peerName) = __MKSTRING((he ? he->h_name : dotted));
+ __STORESELF(peerName);
}
#endif
#ifdef AF_INET6
if (__INST(domain) == @symbol(inet6)) {
- GETHOSTBYADDR(he, (char *) &sa.in6.sin6_addr.s6_addr, alen, AF_INET6);
- if (! he) {
- unsigned long norder;
-
- /*
- * XXX: what is inet6's naming convention ?
- */
- norder = htonl(sa.in.sin_addr.s_addr) ;
- sprintf(dotted, "%d.%d.%d.%d",
- sa.in6.sin6_addr.s6_addr[0],
- sa.in6.sin6_addr.s6_addr[1],
- sa.in6.sin6_addr.s6_addr[2],
- sa.in6.sin6_addr.s6_addr[3],
- sa.in6.sin6_addr.s6_addr[4],
- sa.in6.sin6_addr.s6_addr[5]);
- }
- DBGPRINTF(("SOCKET: accepted connection from host %s\n", (he ? he->h_name : dotted))) ;
- __INST(peerName) = __MKSTRING((he ? he->h_name : dotted));
- __STORESELF(peerName);
+ GETHOSTBYADDR(he, (char *) &sa.in6.sin6_addr.s6_addr, alen, AF_INET6);
+ if (! he) {
+ unsigned long norder;
+
+ /*
+ * XXX: what is inet6's naming convention ?
+ */
+ norder = htonl(sa.in.sin_addr.s_addr) ;
+ sprintf(dotted, "%d.%d.%d.%d",
+ sa.in6.sin6_addr.s6_addr[0],
+ sa.in6.sin6_addr.s6_addr[1],
+ sa.in6.sin6_addr.s6_addr[2],
+ sa.in6.sin6_addr.s6_addr[3],
+ sa.in6.sin6_addr.s6_addr[4],
+ sa.in6.sin6_addr.s6_addr[5]);
+ }
+ DBGPRINTF(("SOCKET: accepted connection from host %s\n", (he ? he->h_name : dotted))) ;
+ __INST(peerName) = __MKSTRING((he ? he->h_name : dotted));
+ __STORESELF(peerName);
}
#endif
#ifdef AF_UNIX
if (__INST(domain) == @symbol(unix)) {
- DBGPRINTF(("SOCKET: accepted connection on unix socket\n")) ;
- /* nothing to be done here */
+ DBGPRINTF(("SOCKET: accepted connection on unix socket\n")) ;
+ /* nothing to be done here */
}
#endif
#ifdef AF_APPLETALK
if (__INST(domain) == @symbol(appletalk)) {
- GETHOSTBYADDR(he, (char *) &sa.at.sat_addr, alen, AF_APPLETALK);
- if (! he) {
- unsigned net;
-
- /*
- * XXX: what is apples naming convention ?
- */
- net = htons(sa.at.sat_addr.s_net) ;
- sprintf(dotted, "%d.%d",
- net,
- sa.at.sat_addr.s_node);
- }
- DBGPRINTF(("SOCKET: accepted connection from host %s\n", (he ? he->h_name : dotted))) ;
- __INST(peerName) = __MKSTRING((he ? he->h_name : dotted));
- __STORESELF(peerName);
+ GETHOSTBYADDR(he, (char *) &sa.at.sat_addr, alen, AF_APPLETALK);
+ if (! he) {
+ unsigned net;
+
+ /*
+ * XXX: what is apples naming convention ?
+ */
+ net = htons(sa.at.sat_addr.s_net) ;
+ sprintf(dotted, "%d.%d",
+ net,
+ sa.at.sat_addr.s_node);
+ }
+ DBGPRINTF(("SOCKET: accepted connection from host %s\n", (he ? he->h_name : dotted))) ;
+ __INST(peerName) = __MKSTRING((he ? he->h_name : dotted));
+ __STORESELF(peerName);
}
# endif
@@ -3028,17 +3028,17 @@
*/
fp = fdopen(newSock, "r+");
if (! fp) {
- DBGPRINTF(("SOCKET: fdopen call failed\n"));
- __INST(lastErrorNumber) = __MKSMALLINT(errno);
- close(newSock);
- RETURN (false);
+ DBGPRINTF(("SOCKET: fdopen call failed\n"));
+ __INST(lastErrorNumber) = __MKSMALLINT(errno);
+ close(newSock);
+ RETURN (false);
} else {
#ifdef BUGGY_STDIO_LIB
- setbuf(fp, NULL);
- __INST(buffered) = false;
+ setbuf(fp, NULL);
+ __INST(buffered) = false;
#endif
- __INST(filePointer) = __MKOBJ(fp);
- __STORESELF(filePointer);
+ __INST(filePointer) = __MKOBJ(fp);
+ __STORESELF(filePointer);
}
#endif
%}.
@@ -3151,7 +3151,7 @@
|isAsync|
filePointer isNil ifTrue:[
- ^ self error:'not a valid socket'
+ ^ self errorNotOpen
].
%{
@@ -3658,7 +3658,7 @@
|errorNr|
filePointer notNil ifTrue:[
- ^ self error:'already created'
+ ^ self errorAlreadyOpen
].
%{
@@ -3864,10 +3864,10 @@
self obsoleteMethodWarning.
filePointer notNil ifTrue:[
- ^ self error:'already created'
+ ^ self errorAlreadyOpen
].
(portNr isMemberOf:SmallInteger) ifFalse:[
- ^ self error:'invalid portNr'
+ self error:'invalid portNr'
].
%{
#ifndef NO_SOCKET
@@ -3884,24 +3884,24 @@
sa.sin_addr.s_addr = htonl(INADDR_ANY);
if ((hostName != nil) && __isString(hostName)){
- bzero(&sa, sizeof(sa)) ;
- if ((addr = inet_addr((char *) __stringVal(hostName))) != -1) {
- /*
- * is Internet addr in octet notation
- */
- bcopy(&addr, (char *) &sa.sin_addr, sizeof(addr)) ; /* set address */
- } else {
- /*
- * do we know the host's address?
- */
- GETHOSTBYNAME(hp, __stringVal(hostName))
- if (hp == NULL) {
- DBGPRINTF(("SOCKET: unknown host: %s\n", __stringVal(hostName)));
- RETURN ( nil );
- }
- bcopy(hp->h_addr, (char *) &sa.sin_addr, hp->h_length) ;
- sa.sin_family = hp->h_addrtype;
- }
+ bzero(&sa, sizeof(sa)) ;
+ if ((addr = inet_addr((char *) __stringVal(hostName))) != -1) {
+ /*
+ * is Internet addr in octet notation
+ */
+ bcopy(&addr, (char *) &sa.sin_addr, sizeof(addr)) ; /* set address */
+ } else {
+ /*
+ * do we know the host's address?
+ */
+ GETHOSTBYNAME(hp, __stringVal(hostName))
+ if (hp == NULL) {
+ DBGPRINTF(("SOCKET: unknown host: %s\n", __stringVal(hostName)));
+ RETURN ( nil );
+ }
+ bcopy(hp->h_addr, (char *) &sa.sin_addr, hp->h_length) ;
+ sa.sin_family = hp->h_addrtype;
+ }
}
/*
@@ -3909,71 +3909,71 @@
*/
__BEGIN_INTERRUPTABLE__
do {
- sock = socket(sa.sin_family, SOCK_STREAM, 0);
+ sock = socket(sa.sin_family, SOCK_STREAM, 0);
} while ((sock < 0) && (errno == EINTR));
__END_INTERRUPTABLE__
if (sock < 0) {
- DBGPRINTF(("SOCKET: socket(dom=%d typ=%d proto=0) call failed errno=%d\n", sa.sin_family, SOCK_STREAM, errno));
- __INST(lastErrorNumber) = __MKSMALLINT(errno);
+ DBGPRINTF(("SOCKET: socket(dom=%d typ=%d proto=0) call failed errno=%d\n", sa.sin_family, SOCK_STREAM, errno));
+ __INST(lastErrorNumber) = __MKSMALLINT(errno);
} else {
- /*
- * connect/bind
- */
- sa.sin_port = htons((u_short) _intVal(portNr)) ;
-
- __BEGIN_INTERRUPTABLE__
- if (hostName != nil) {
- do {
- ret = connect(sock, (struct sockaddr *)&sa, sizeof(sa));
- } while ((ret < 0) && (errno == EINTR));
- } else {
+ /*
+ * connect/bind
+ */
+ sa.sin_port = htons((u_short) _intVal(portNr)) ;
+
+ __BEGIN_INTERRUPTABLE__
+ if (hostName != nil) {
+ do {
+ ret = connect(sock, (struct sockaddr *)&sa, sizeof(sa));
+ } while ((ret < 0) && (errno == EINTR));
+ } else {
#ifdef SO_REUSEADDR
- /*
- * should I also do this for DGRAM sockets ?
- */
- if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char *) &on, sizeof (on)) < 0) {
- DBGPRINTF(("SOCKET: setsockopt - SO_REUSEADDR failed\n"));
- }
+ /*
+ * should I also do this for DGRAM sockets ?
+ */
+ if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char *) &on, sizeof (on)) < 0) {
+ DBGPRINTF(("SOCKET: setsockopt - SO_REUSEADDR failed\n"));
+ }
#endif /* SO_REUSEADDR */
- sa.sin_addr.s_addr = htonl(INADDR_ANY);
- do {
- ret = bind(sock, (struct sockaddr *)&sa, sizeof(sa));
- } while ((ret < 0) && (errno == EINTR));
- }
- __END_INTERRUPTABLE__
-
- if (ret < 0) {
- DBGPRINTF(("SOCKET: bind/connect call failed errno=%d\n", errno));
- __INST(lastErrorNumber) = __MKSMALLINT(errno);
- __BEGIN_INTERRUPTABLE__
- close(sock) ;
- __END_INTERRUPTABLE__
- } else {
- /*
- * make it a FILE *
- */
- fp = fdopen(sock, "r+");
- if (! fp) {
- DBGPRINTF(("SOCKET: fdopen failed\n"));
- __INST(lastErrorNumber) = __MKSMALLINT(errno);
- __BEGIN_INTERRUPTABLE__
- close(sock);
- __END_INTERRUPTABLE__
- } else {
+ sa.sin_addr.s_addr = htonl(INADDR_ANY);
+ do {
+ ret = bind(sock, (struct sockaddr *)&sa, sizeof(sa));
+ } while ((ret < 0) && (errno == EINTR));
+ }
+ __END_INTERRUPTABLE__
+
+ if (ret < 0) {
+ DBGPRINTF(("SOCKET: bind/connect call failed errno=%d\n", errno));
+ __INST(lastErrorNumber) = __MKSMALLINT(errno);
+ __BEGIN_INTERRUPTABLE__
+ close(sock) ;
+ __END_INTERRUPTABLE__
+ } else {
+ /*
+ * make it a FILE *
+ */
+ fp = fdopen(sock, "r+");
+ if (! fp) {
+ DBGPRINTF(("SOCKET: fdopen failed\n"));
+ __INST(lastErrorNumber) = __MKSMALLINT(errno);
+ __BEGIN_INTERRUPTABLE__
+ close(sock);
+ __END_INTERRUPTABLE__
+ } else {
#ifdef BUGGY_STDIO_LIB
- setbuf(fp, NULL);
- __INST(buffered) = false;
+ setbuf(fp, NULL);
+ __INST(buffered) = false;
#endif
- __INST(filePointer) = __MKOBJ(fp);
- __STORESELF(filePointer);
- }
- }
+ __INST(filePointer) = __MKOBJ(fp);
+ __STORESELF(filePointer);
+ }
+ }
}
#endif
%}.
filePointer isNil ifTrue:[
- ^ nil
+ ^ nil
].
mode := #readwrite.
Lobby register:self.
@@ -4004,10 +4004,10 @@
self obsoleteMethodWarning.
filePointer notNil ifTrue:[
- ^ self error:'already created'
+ ^ self errorAlreadyOpen
].
(portNr isMemberOf:SmallInteger) ifFalse:[
- ^ self error:'invalid portNr'
+ self error:'invalid portNr'
].
%{
#ifndef NO_SOCKET
@@ -4019,28 +4019,28 @@
int ret;
if (hostName != nil) {
- bzero(&sa, sizeof(sa)) ;
- if ((addr = inet_addr((char *) __stringVal(hostName))) != -1) {
- /*
- * is Internet addr in octet notation
- */
- bcopy(&addr, (char *) &sa.sin_addr, sizeof(addr)) ; /* set address */
- sa.sin_family = AF_INET ;
- } else {
- /*
- * is hostname -
- * do we know the host's address?
- */
- GETHOSTBYNAME(hp, __stringVal(hostName))
- if (hp == NULL) {
- DBGPRINTF(("SOCKET: unknown host: %s\n", __stringVal(hostName)));
- RETURN ( nil );
- }
- bcopy(hp->h_addr, (char *) &sa.sin_addr, hp->h_length) ;
- sa.sin_family = hp->h_addrtype ;
- }
+ bzero(&sa, sizeof(sa)) ;
+ if ((addr = inet_addr((char *) __stringVal(hostName))) != -1) {
+ /*
+ * is Internet addr in octet notation
+ */
+ bcopy(&addr, (char *) &sa.sin_addr, sizeof(addr)) ; /* set address */
+ sa.sin_family = AF_INET ;
+ } else {
+ /*
+ * is hostname -
+ * do we know the host's address?
+ */
+ GETHOSTBYNAME(hp, __stringVal(hostName))
+ if (hp == NULL) {
+ DBGPRINTF(("SOCKET: unknown host: %s\n", __stringVal(hostName)));
+ RETURN ( nil );
+ }
+ bcopy(hp->h_addr, (char *) &sa.sin_addr, hp->h_length) ;
+ sa.sin_family = hp->h_addrtype ;
+ }
} else {
- sa.sin_family = AF_INET;
+ sa.sin_family = AF_INET;
}
/*
@@ -4048,63 +4048,63 @@
*/
__BEGIN_INTERRUPTABLE__
do {
- sock = socket(sa.sin_family, SOCK_DGRAM, 0);
+ sock = socket(sa.sin_family, SOCK_DGRAM, 0);
} while ((sock < 0) && (errno == EINTR));
__END_INTERRUPTABLE__
if (sock < 0) {
- DBGPRINTF(("SOCKET: socket(dom=%d typ=%d proto=0) call failed errno=%d\n", sa.sin_family, SOCK_DGRAM, errno));
- __INST(lastErrorNumber) = __MKSMALLINT(errno);
+ DBGPRINTF(("SOCKET: socket(dom=%d typ=%d proto=0) call failed errno=%d\n", sa.sin_family, SOCK_DGRAM, errno));
+ __INST(lastErrorNumber) = __MKSMALLINT(errno);
} else {
- /*
- * ok,
- * connect/bind
- */
- __BEGIN_INTERRUPTABLE__
- if (hostName == nil) {
- sa.sin_addr.s_addr = htonl(INADDR_ANY);
- do {
- ret = bind(sock, (struct sockaddr *)&sa, sizeof(sa));
- } while ((ret < 0) && (errno == EINTR));
- } else {
- sa.sin_port = htons((u_short) _intVal(portNr)) ;
- do {
- ret = connect(sock, (struct sockaddr *)&sa, sizeof(sa));
- } while ((ret < 0) && (errno == EINTR));
- }
- __END_INTERRUPTABLE__
-
- if (ret < 0) {
- DBGPRINTF(("SOCKET: bind/connect call failed\n"));
- __INST(lastErrorNumber) = __MKSMALLINT(errno);
- __BEGIN_INTERRUPTABLE__
- close(sock) ;
- __END_INTERRUPTABLE__
- } else {
- /*
- * make it a FILE *
- */
- fp = fdopen(sock, "r+");
- if (! fp) {
- DBGPRINTF(("SOCKET: fdopen call failed\n"));
- __INST(lastErrorNumber) = __MKSMALLINT(errno);
- __BEGIN_INTERRUPTABLE__
- close(sock);
- __END_INTERRUPTABLE__
- } else {
+ /*
+ * ok,
+ * connect/bind
+ */
+ __BEGIN_INTERRUPTABLE__
+ if (hostName == nil) {
+ sa.sin_addr.s_addr = htonl(INADDR_ANY);
+ do {
+ ret = bind(sock, (struct sockaddr *)&sa, sizeof(sa));
+ } while ((ret < 0) && (errno == EINTR));
+ } else {
+ sa.sin_port = htons((u_short) _intVal(portNr)) ;
+ do {
+ ret = connect(sock, (struct sockaddr *)&sa, sizeof(sa));
+ } while ((ret < 0) && (errno == EINTR));
+ }
+ __END_INTERRUPTABLE__
+
+ if (ret < 0) {
+ DBGPRINTF(("SOCKET: bind/connect call failed\n"));
+ __INST(lastErrorNumber) = __MKSMALLINT(errno);
+ __BEGIN_INTERRUPTABLE__
+ close(sock) ;
+ __END_INTERRUPTABLE__
+ } else {
+ /*
+ * make it a FILE *
+ */
+ fp = fdopen(sock, "r+");
+ if (! fp) {
+ DBGPRINTF(("SOCKET: fdopen call failed\n"));
+ __INST(lastErrorNumber) = __MKSMALLINT(errno);
+ __BEGIN_INTERRUPTABLE__
+ close(sock);
+ __END_INTERRUPTABLE__
+ } else {
#ifdef BUGGY_STDIO_LIB
- setbuf(fp, NULL);
- __INST(buffered) = false;
+ setbuf(fp, NULL);
+ __INST(buffered) = false;
#endif
- __INST(filePointer) = __MKOBJ(fp);
- __STORESELF(filePointer);
- }
- }
+ __INST(filePointer) = __MKOBJ(fp);
+ __STORESELF(filePointer);
+ }
+ }
}
#endif
%}.
filePointer isNil ifTrue:[
- ^ nil
+ ^ nil
].
mode := #readwrite.
@@ -4131,20 +4131,20 @@
|millis|
filePointer isNil ifTrue:[
- ^ self error:'not a valid socket'
+ ^ self errorNotOpen
].
millis := (seconds * 1000) rounded.
%{
#if defined(SO_RCVTIMEO) && defined(SOL_SOCKET) && defined(HZ)
if (__isSmallInteger(millis)) {
- OBJ fp = __INST(filePointer);
- int sock;
- int opt;
-
- sock = fileno(__FILEVal(fp));
- opt = _intVal(millis) / (1000 / HZ);
- setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (char *)&opt, sizeof(int));
- RETURN(true);
+ OBJ fp = __INST(filePointer);
+ int sock;
+ int opt;
+
+ sock = fileno(__FILEVal(fp));
+ opt = _intVal(millis) / (1000 / HZ);
+ setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (char *)&opt, sizeof(int));
+ RETURN(true);
}
#endif
%}.
@@ -4159,20 +4159,20 @@
|millis|
filePointer isNil ifTrue:[
- ^ self error:'not a valid socket'
+ ^ self errorNotOpen
].
millis := (seconds * 1000) rounded.
%{
#if defined(SO_SNDTIMEO) && defined(SOL_SOCKET) && defined(HZ)
if (__isSmallInteger(millis)) {
- OBJ fp = __INST(filePointer);
- int sock;
- int opt;
-
- sock = fileno(__FILEVal(fp));
- opt = _intVal(millis) / (1000 / HZ);
- setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, (char *)&opt, sizeof(int));
- RETURN(true);
+ OBJ fp = __INST(filePointer);
+ int sock;
+ int opt;
+
+ sock = fileno(__FILEVal(fp));
+ opt = _intVal(millis) / (1000 / HZ);
+ setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, (char *)&opt, sizeof(int));
+ RETURN(true);
}
#endif
%}.
@@ -4182,5 +4182,5 @@
!Socket class methodsFor:'documentation'!
version
- ^ '$Header: /cvs/stx/stx/libbasic2/Socket.st,v 1.121 1999-07-23 09:03:59 cg Exp $'
+ ^ '$Header: /cvs/stx/stx/libbasic2/Socket.st,v 1.122 1999-08-04 14:12:12 cg Exp $'
! !