--- a/Socket.st Fri Mar 04 10:31:21 2005 +0100
+++ b/Socket.st Thu Mar 10 15:00:50 2005 +0100
@@ -172,10 +172,10 @@
#endif
#ifndef TRUE
-# define TRUE 1
+# define TRUE 1
#endif
#ifndef FALSE
-# define FALSE 0
+# define FALSE 0
#endif
#ifndef WIN32
typedef int BOOL;
@@ -1509,7 +1509,7 @@
errorReporter
"ST-80 mimicry."
- ^ self
+ ^ self class
!
ioConnection
@@ -3209,6 +3209,99 @@
!
getFullSocketAddress
+ "implemented for swazoo project (primitive code cant be loaded as extension)
+ Answer my own address (I am bound to this address).
+ Note that this address may change after a connect or accept."
+
+ |error domainClass addr addrLen|
+
+ filePointer isNil ifTrue:[
+ ^ self errorNotOpen
+ ].
+
+ domainClass := self class socketAddressClassForDomain:domain.
+ domainClass isNil ifTrue:[
+ ^ self error:'invalid (unsupported) domain'.
+ ].
+ addrLen := domainClass socketAddressSize.
+ addr := domainClass new.
+
+%{
+#ifndef NO_SOCKET
+ OBJ fp = __INST(filePointer);
+ OBJ addrClass;
+ int sock;
+ int ret;
+ union sockaddr_u sa;
+ int alen, alen0;
+ char *addrP;
+ int addrObjSize, nAddrInstVars, nAddrInstBytes;
+
+ if (!__isSmallInteger(addrLen)) {
+ DBGPRINTF(("SOCKET: bad addrLen\n"));
+ error = @symbol(badArgument);
+ goto err;
+ }
+ alen0 = __intVal(addrLen);
+
+ if (!__isNonNilObject(addr) || !__isBytes(addr)) {
+ DBGPRINTF(("SOCKET: bad addr\n"));
+ error = @symbol(badArgument);
+ goto err;
+ }
+
+ {
+ OBJ oClass;
+
+ addrClass = __qClass(addr);
+ nAddrInstVars = __intVal(__ClassInstPtr(addrClass)->c_ninstvars);
+ nAddrInstBytes = OHDR_SIZE + (nAddrInstVars * sizeof(OBJ));
+ addrObjSize = __qSize(addr) - nAddrInstBytes;
+ if (addrObjSize < alen0) {
+ DBGPRINTF(("SOCKET: bad addr/alen\n"));
+ error = @symbol(badArgument);
+ goto err;
+ }
+ }
+
+ sock = SOCKET_FROM_FILE_OBJECT(fp);
+# ifdef WIN32
+ __threadErrno = 0;
+# endif
+ ret = getsockname(sock, (struct sockaddr *)&sa, &alen);
+ if (ret < 0) {
+ DBGPRINTF(("SOCKET: getsocketname failed ret=%d errno=%d\n", ret, errno));
+# ifdef WIN32
+ error = __MKSMALLINT(__threadErrno);
+# else
+ error = __MKSMALLINT(errno);
+# endif
+ goto err;
+ }
+
+ if (addrObjSize < alen) {
+ DBGPRINTF(("SOCKET: bad addr\n"));
+ error = @symbol(badArgument);
+ goto err;
+ }
+
+ addrP = (char *)__InstPtr(addr) + nAddrInstBytes;
+ bcopy((char *)&sa, addrP, alen);
+
+ addrLen = __MKSMALLINT(alen);
+
+err:;
+#else /* NO_SOCKET */
+ error = @symbol(notImplemented);
+#endif /* NO_SOCKET */
+%}.
+ error notNil ifTrue:[
+ ^ self errorReporter reportOn:error
+ ].
+ ^ addr
+!
+
+old_getFullSocketAddress
"implemented for swazoo project primitive code cant load as extension
answer my own address (I am bound to this address).
Note that this address may change after connect or accept."
@@ -3283,7 +3376,8 @@
answer my own address (I am bound to this address).
Note that this address may change after connect or accept."
- ^ self getFullSocketAddress copyFrom:5 to:8
+ ^ self getFullSocketAddress hostAddress
+ "/ ^ self getFullSocketAddress copyFrom:5 to:8
!
getSocketAdress
@@ -3774,5 +3868,5 @@
!Socket class methodsFor:'documentation'!
version
- ^ '$Header: /cvs/stx/stx/libbasic2/Socket.st,v 1.210 2005-03-02 16:52:15 cg Exp $'
+ ^ '$Header: /cvs/stx/stx/libbasic2/Socket.st,v 1.211 2005-03-10 14:00:50 cg Exp $'
! !