getSocketAddress
authorClaus Gittinger <cg@exept.de>
Thu, 10 Mar 2005 15:00:50 +0100
changeset 1535 f6aa0fc8c3cc
parent 1534 5aeec5c0564b
child 1536 74e66a8c6dc2
getSocketAddress
Socket.st
--- 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 $'
 ! !