[Vm-dev] [commit] r2556 - CogVM source as per VMMaker.oscog-eem.161.

commits at squeakvm.org commits at squeakvm.org
Thu Jun 7 19:29:53 UTC 2012


Author: eliot
Date: 2012-06-07 12:29:52 -0700 (Thu, 07 Jun 2012)
New Revision: 2556

Added:
   branches/Cog/processors/IA32/linuxbochs/bochsconfig.h
Modified:
   branches/Cog/nscogsrc/plugins/SocketPlugin/SocketPlugin.c
   branches/Cog/nscogsrc/plugins/UnixOSProcessPlugin/UnixOSProcessPlugin.c
   branches/Cog/nscogsrc/vm/cointerp.c
   branches/Cog/nscogsrc/vm/gcc3x-cointerp.c
   branches/Cog/platforms/Cross/vm/sqSCCSVersion.h
   branches/Cog/platforms/unix/plugins/SocketPlugin/sqUnixSocket.c
   branches/Cog/src/plugins/SocketPlugin/SocketPlugin.c
   branches/Cog/src/plugins/UnixOSProcessPlugin/UnixOSProcessPlugin.c
   branches/Cog/src/vm/cointerp.c
   branches/Cog/src/vm/cointerpmt.c
   branches/Cog/src/vm/gcc3x-cointerp.c
   branches/Cog/src/vm/gcc3x-cointerpmt.c
Log:
CogVM source as per VMMaker.oscog-eem.161.
Integrate ipv6 socket primitives.  Add UnixOSProcessPlugin primitiveDup, and
make primitiveChdir return error and success results the right way round.


Modified: branches/Cog/nscogsrc/plugins/SocketPlugin/SocketPlugin.c
===================================================================
--- branches/Cog/nscogsrc/plugins/SocketPlugin/SocketPlugin.c	2012-05-30 18:38:08 UTC (rev 2555)
+++ branches/Cog/nscogsrc/plugins/SocketPlugin/SocketPlugin.c	2012-06-07 19:29:52 UTC (rev 2556)
@@ -1,9 +1,9 @@
 /* Automatically generated by
-	SmartSyntaxPluginCodeGenerator VMMaker.oscog-eem.105 uuid: 79234f80-ee6a-404c-9e5c-2134e3b76463
+	SmartSyntaxPluginCodeGenerator VMMaker.oscog-eem.161 uuid: d9d960b4-9f66-43a2-9d90-4fb58d541adc
    from
-	SocketPlugin VMMaker.oscog-eem.105 uuid: 79234f80-ee6a-404c-9e5c-2134e3b76463
+	SocketPlugin VMMaker.oscog-eem.161 uuid: d9d960b4-9f66-43a2-9d90-4fb58d541adc
  */
-static char __buildInfo[] = "SocketPlugin VMMaker.oscog-eem.105 uuid: 79234f80-ee6a-404c-9e5c-2134e3b76463 " __DATE__ ;
+static char __buildInfo[] = "SocketPlugin VMMaker.oscog-eem.161 uuid: d9d960b4-9f66-43a2-9d90-4fb58d541adc " __DATE__ ;
 
 
 
@@ -38,6 +38,8 @@
 
 
 /*** Constants ***/
+#define BytesPerWord 4
+#define MULTIPLEBYTECODESETS 0
 
 
 /*** Function Prototypes ***/
@@ -55,6 +57,20 @@
 EXPORT(sqInt) primitiveResolverAbortLookup(void);
 EXPORT(sqInt) primitiveResolverAddressLookupResult(void);
 EXPORT(sqInt) primitiveResolverError(void);
+EXPORT(sqInt) primitiveResolverGetAddressInfo(void);
+EXPORT(sqInt) primitiveResolverGetAddressInfoFamily(void);
+EXPORT(sqInt) primitiveResolverGetAddressInfoNext(void);
+EXPORT(sqInt) primitiveResolverGetAddressInfoProtocol(void);
+EXPORT(sqInt) primitiveResolverGetAddressInfoResult(void);
+EXPORT(sqInt) primitiveResolverGetAddressInfoSize(void);
+EXPORT(sqInt) primitiveResolverGetAddressInfoType(void);
+EXPORT(sqInt) primitiveResolverGetNameInfo(void);
+EXPORT(sqInt) primitiveResolverGetNameInfoHostResult(void);
+EXPORT(sqInt) primitiveResolverGetNameInfoHostSize(void);
+EXPORT(sqInt) primitiveResolverGetNameInfoServiceResult(void);
+EXPORT(sqInt) primitiveResolverGetNameInfoServiceSize(void);
+EXPORT(sqInt) primitiveResolverHostNameResult(void);
+EXPORT(sqInt) primitiveResolverHostNameSize(void);
 EXPORT(sqInt) primitiveResolverLocalAddress(void);
 EXPORT(sqInt) primitiveResolverNameLookupResult(void);
 EXPORT(sqInt) primitiveResolverStartAddressLookup(void);
@@ -63,9 +79,13 @@
 EXPORT(sqInt) primitiveSocketAbortConnection(void);
 EXPORT(sqInt) primitiveSocketAccept(void);
 EXPORT(sqInt) primitiveSocketAccept3Semaphores(void);
+EXPORT(sqInt) primitiveSocketAddressGetPort(void);
+EXPORT(sqInt) primitiveSocketAddressSetPort(void);
+EXPORT(sqInt) primitiveSocketBindTo(void);
 EXPORT(sqInt) primitiveSocketBindToPort(void);
 EXPORT(sqInt) primitiveSocketCloseConnection(void);
 EXPORT(sqInt) primitiveSocketConnectionStatus(void);
+EXPORT(sqInt) primitiveSocketConnectTo(void);
 EXPORT(sqInt) primitiveSocketConnectToPort(void);
 EXPORT(sqInt) primitiveSocketCreate(void);
 EXPORT(sqInt) primitiveSocketCreate3Semaphores(void);
@@ -76,13 +96,18 @@
 EXPORT(sqInt) primitiveSocketListenOnPort(void);
 EXPORT(sqInt) primitiveSocketListenOnPortBacklog(void);
 EXPORT(sqInt) primitiveSocketListenOnPortBacklogInterface(void);
+EXPORT(sqInt) primitiveSocketListenWithBacklog(void);
 EXPORT(sqInt) primitiveSocketListenWithOrWithoutBacklog(void);
 EXPORT(sqInt) primitiveSocketLocalAddress(void);
+EXPORT(sqInt) primitiveSocketLocalAddressResult(void);
+EXPORT(sqInt) primitiveSocketLocalAddressSize(void);
 EXPORT(sqInt) primitiveSocketLocalPort(void);
 EXPORT(sqInt) primitiveSocketReceiveDataAvailable(void);
 EXPORT(sqInt) primitiveSocketReceiveDataBufCount(void);
 EXPORT(sqInt) primitiveSocketReceiveUDPDataBufCount(void);
 EXPORT(sqInt) primitiveSocketRemoteAddress(void);
+EXPORT(sqInt) primitiveSocketRemoteAddressResult(void);
+EXPORT(sqInt) primitiveSocketRemoteAddressSize(void);
 EXPORT(sqInt) primitiveSocketRemotePort(void);
 EXPORT(sqInt) primitiveSocketSendDataBufCount(void);
 EXPORT(sqInt) primitiveSocketSendDone(void);
@@ -103,9 +128,9 @@
 struct VirtualMachine* interpreterProxy;
 static const char *moduleName =
 #ifdef SQUEAK_BUILTIN_PLUGIN
-	"SocketPlugin VMMaker.oscog-eem.105 (i)"
+	"SocketPlugin VMMaker.oscog-eem.161 (i)"
 #else
-	"SocketPlugin VMMaker.oscog-eem.105 (e)"
+	"SocketPlugin VMMaker.oscog-eem.161 (e)"
 #endif
 ;
 static void * sCCLOPfn;
@@ -295,6 +320,321 @@
 }
 
 EXPORT(sqInt)
+primitiveResolverGetAddressInfo(void)
+{
+	sqInt family;
+	sqInt flags;
+	char *hostName;
+	sqInt hostSize;
+	sqInt protocol;
+	char *servName;
+	sqInt servSize;
+	sqInt type;
+
+	interpreterProxy->success(interpreterProxy->isBytes(interpreterProxy->stackValue(5)));
+	hostName = ((char *) (interpreterProxy->firstIndexableField(interpreterProxy->stackValue(5))));
+	interpreterProxy->success(interpreterProxy->isBytes(interpreterProxy->stackValue(4)));
+	servName = ((char *) (interpreterProxy->firstIndexableField(interpreterProxy->stackValue(4))));
+	flags = interpreterProxy->stackIntegerValue(3);
+	family = interpreterProxy->stackIntegerValue(2);
+	type = interpreterProxy->stackIntegerValue(1);
+	protocol = interpreterProxy->stackIntegerValue(0);
+	if (interpreterProxy->failed()) {
+		return null;
+	}
+	if (!(interpreterProxy->failed())) {
+		hostSize = interpreterProxy->byteSizeOf(((sqInt)(long)(hostName) - 4));
+		servSize = interpreterProxy->byteSizeOf(((sqInt)(long)(servName) - 4));
+		sqResolverGetAddressInfoHostSizeServiceSizeFlagsFamilyTypeProtocol(hostName, hostSize, servName, servSize, flags, family, type, protocol);
+	}
+	if (interpreterProxy->failed()) {
+		return null;
+	}
+	interpreterProxy->pop(6);
+	return null;
+}
+
+EXPORT(sqInt)
+primitiveResolverGetAddressInfoFamily(void)
+{
+	sqInt family;
+	sqInt _return_value;
+
+	if (!(interpreterProxy->failed())) {
+		family = sqResolverGetAddressInfoFamily();
+		_return_value = interpreterProxy->integerObjectOf(family);
+		if (interpreterProxy->failed()) {
+			return null;
+		}
+		interpreterProxy->popthenPush(1, _return_value);
+		return null;
+	}
+	if (interpreterProxy->failed()) {
+		return null;
+	}
+	return null;
+}
+
+EXPORT(sqInt)
+primitiveResolverGetAddressInfoNext(void)
+{
+	sqInt more;
+	sqInt _return_value;
+
+	more = sqResolverGetAddressInfoNext();
+	if (interpreterProxy->failed()) {
+		return null;
+	}
+	_return_value = (more) ? interpreterProxy->trueObject(): interpreterProxy->falseObject();
+	if (interpreterProxy->failed()) {
+		return null;
+	}
+	interpreterProxy->popthenPush(1, _return_value);
+	return null;
+}
+
+EXPORT(sqInt)
+primitiveResolverGetAddressInfoProtocol(void)
+{
+	sqInt protocol;
+	sqInt _return_value;
+
+	if (!(interpreterProxy->failed())) {
+		protocol = sqResolverGetAddressInfoProtocol();
+		_return_value = interpreterProxy->integerObjectOf(protocol);
+		if (interpreterProxy->failed()) {
+			return null;
+		}
+		interpreterProxy->popthenPush(1, _return_value);
+		return null;
+	}
+	if (interpreterProxy->failed()) {
+		return null;
+	}
+	return null;
+}
+
+EXPORT(sqInt)
+primitiveResolverGetAddressInfoResult(void)
+{
+	sqInt addrSize;
+	char *socketAddress;
+
+	interpreterProxy->success(interpreterProxy->isBytes(interpreterProxy->stackValue(0)));
+	socketAddress = ((char *) (interpreterProxy->firstIndexableField(interpreterProxy->stackValue(0))));
+	if (interpreterProxy->failed()) {
+		return null;
+	}
+	if (!(interpreterProxy->failed())) {
+		addrSize = interpreterProxy->byteSizeOf(((sqInt)(long)(socketAddress) - 4));
+		sqResolverGetAddressInfoResultSize(socketAddress, addrSize);
+	}
+	if (interpreterProxy->failed()) {
+		return null;
+	}
+	interpreterProxy->pop(1);
+	return null;
+}
+
+EXPORT(sqInt)
+primitiveResolverGetAddressInfoSize(void)
+{
+	sqInt size;
+	sqInt _return_value;
+
+	if (!(interpreterProxy->failed())) {
+		size = sqResolverGetAddressInfoSize();
+		_return_value = interpreterProxy->integerObjectOf(size);
+		if (interpreterProxy->failed()) {
+			return null;
+		}
+		interpreterProxy->popthenPush(1, _return_value);
+		return null;
+	}
+	if (interpreterProxy->failed()) {
+		return null;
+	}
+	return null;
+}
+
+EXPORT(sqInt)
+primitiveResolverGetAddressInfoType(void)
+{
+	sqInt type;
+	sqInt _return_value;
+
+	if (!(interpreterProxy->failed())) {
+		type = sqResolverGetAddressInfoType();
+		_return_value = interpreterProxy->integerObjectOf(type);
+		if (interpreterProxy->failed()) {
+			return null;
+		}
+		interpreterProxy->popthenPush(1, _return_value);
+		return null;
+	}
+	if (interpreterProxy->failed()) {
+		return null;
+	}
+	return null;
+}
+
+EXPORT(sqInt)
+primitiveResolverGetNameInfo(void)
+{
+	char *addrBase;
+	sqInt addrSize;
+	sqInt flags;
+	sqInt socketAddress;
+
+	socketAddress = interpreterProxy->stackValue(1);
+	flags = interpreterProxy->stackIntegerValue(0);
+	if (interpreterProxy->failed()) {
+		return null;
+	}
+	if (!(interpreterProxy->failed())) {
+		addrSize = interpreterProxy->byteSizeOf(socketAddress);
+		addrBase = ((char *) (interpreterProxy->firstIndexableField(socketAddress)));
+		sqResolverGetNameInfoSizeFlags(addrBase, addrSize, flags);
+	}
+	if (interpreterProxy->failed()) {
+		return null;
+	}
+	interpreterProxy->pop(2);
+	return null;
+}
+
+EXPORT(sqInt)
+primitiveResolverGetNameInfoHostResult(void)
+{
+	sqInt addrSize;
+	char *socketName;
+
+	interpreterProxy->success(interpreterProxy->isBytes(interpreterProxy->stackValue(0)));
+	socketName = ((char *) (interpreterProxy->firstIndexableField(interpreterProxy->stackValue(0))));
+	if (interpreterProxy->failed()) {
+		return null;
+	}
+	if (!(interpreterProxy->failed())) {
+		addrSize = interpreterProxy->byteSizeOf(((sqInt)(long)(socketName) - 4));
+		sqResolverGetNameInfoHostResultSize(socketName, addrSize);
+	}
+	if (interpreterProxy->failed()) {
+		return null;
+	}
+	interpreterProxy->pop(1);
+	return null;
+}
+
+EXPORT(sqInt)
+primitiveResolverGetNameInfoHostSize(void)
+{
+	sqInt size;
+	sqInt _return_value;
+
+	if (!(interpreterProxy->failed())) {
+		size = sqResolverGetNameInfoHostSize();
+		_return_value = interpreterProxy->integerObjectOf(size);
+		if (interpreterProxy->failed()) {
+			return null;
+		}
+		interpreterProxy->popthenPush(1, _return_value);
+		return null;
+	}
+	if (interpreterProxy->failed()) {
+		return null;
+	}
+	return null;
+}
+
+EXPORT(sqInt)
+primitiveResolverGetNameInfoServiceResult(void)
+{
+	sqInt addrSize;
+	char *socketName;
+
+	interpreterProxy->success(interpreterProxy->isBytes(interpreterProxy->stackValue(0)));
+	socketName = ((char *) (interpreterProxy->firstIndexableField(interpreterProxy->stackValue(0))));
+	if (interpreterProxy->failed()) {
+		return null;
+	}
+	if (!(interpreterProxy->failed())) {
+		addrSize = interpreterProxy->byteSizeOf(((sqInt)(long)(socketName) - 4));
+		sqResolverGetNameInfoServiceResultSize(socketName, addrSize);
+	}
+	if (interpreterProxy->failed()) {
+		return null;
+	}
+	interpreterProxy->pop(1);
+	return null;
+}
+
+EXPORT(sqInt)
+primitiveResolverGetNameInfoServiceSize(void)
+{
+	sqInt size;
+	sqInt _return_value;
+
+	if (!(interpreterProxy->failed())) {
+		size = sqResolverGetNameInfoServiceSize();
+		_return_value = interpreterProxy->integerObjectOf(size);
+		if (interpreterProxy->failed()) {
+			return null;
+		}
+		interpreterProxy->popthenPush(1, _return_value);
+		return null;
+	}
+	if (interpreterProxy->failed()) {
+		return null;
+	}
+	return null;
+}
+
+EXPORT(sqInt)
+primitiveResolverHostNameResult(void)
+{
+	sqInt nameSize;
+	char *nameString;
+
+	interpreterProxy->success(interpreterProxy->isBytes(interpreterProxy->stackValue(0)));
+	nameString = ((char *) (interpreterProxy->firstIndexableField(interpreterProxy->stackValue(0))));
+	if (interpreterProxy->failed()) {
+		return null;
+	}
+	if (!(interpreterProxy->failed())) {
+		nameSize = interpreterProxy->byteSizeOf(((sqInt)(long)(nameString) - 4));
+		sqResolverHostNameResultSize(nameString, nameSize);
+	}
+	if (interpreterProxy->failed()) {
+		return null;
+	}
+	interpreterProxy->pop(1);
+	return null;
+}
+
+EXPORT(sqInt)
+primitiveResolverHostNameSize(void)
+{
+	sqInt size;
+	sqInt _return_value;
+
+	if (!(interpreterProxy->failed())) {
+		size = sqResolverHostNameSize();
+		if (!(interpreterProxy->failed())) {
+			_return_value = interpreterProxy->integerObjectOf(size);
+			if (interpreterProxy->failed()) {
+				return null;
+			}
+			interpreterProxy->popthenPush(1, _return_value);
+			return null;
+		}
+	}
+	if (interpreterProxy->failed()) {
+		return null;
+	}
+	return null;
+}
+
+EXPORT(sqInt)
 primitiveResolverLocalAddress(void)
 {
 	sqInt addr;
@@ -396,7 +736,6 @@
 {
 	SocketPtr  s;
 	sqInt socket;
-	void *socketIndex;
 
 	socket = interpreterProxy->stackValue(0);
 	if (interpreterProxy->failed()) {
@@ -405,13 +744,9 @@
 	/* begin socketValueOf: */
 	interpreterProxy->success((interpreterProxy->isBytes(socket))
 	 && ((interpreterProxy->byteSizeOf(socket)) == (socketRecordSize())));
-	if (interpreterProxy->failed()) {
-		s = null;
-		goto l1;
-	}
-	socketIndex = ((SocketPtr) (interpreterProxy->firstIndexableField(socket)));
-	s = socketIndex;
-l1:	/* end socketValueOf: */;
+	s = (interpreterProxy->failed()
+		? null
+		: ((SocketPtr) (interpreterProxy->firstIndexableField(socket))));
 	if (!(interpreterProxy->failed())) {
 		sqSocketAbortConnection(s);
 	}
@@ -430,8 +765,6 @@
 	sqInt semaIndex;
 	sqInt sendBufSize;
 	SocketPtr  serverSocket;
-	void *socketIndex;
-	void *socketIndex1;
 	sqInt socketOop;
 	sqInt sockHandle;
 
@@ -445,25 +778,17 @@
 	/* begin socketValueOf: */
 	interpreterProxy->success((interpreterProxy->isBytes(sockHandle))
 	 && ((interpreterProxy->byteSizeOf(sockHandle)) == (socketRecordSize())));
-	if (interpreterProxy->failed()) {
-		serverSocket = null;
-		goto l2;
-	}
-	socketIndex1 = ((SocketPtr) (interpreterProxy->firstIndexableField(sockHandle)));
-	serverSocket = socketIndex1;
-l2:	/* end socketValueOf: */;
+	serverSocket = (interpreterProxy->failed()
+		? null
+		: ((SocketPtr) (interpreterProxy->firstIndexableField(sockHandle))));
 	if (!(interpreterProxy->failed())) {
 		socketOop = interpreterProxy->instantiateClassindexableSize(interpreterProxy->classByteArray(), socketRecordSize());
 		/* begin socketValueOf: */
 		interpreterProxy->success((interpreterProxy->isBytes(socketOop))
 		 && ((interpreterProxy->byteSizeOf(socketOop)) == (socketRecordSize())));
-		if (interpreterProxy->failed()) {
-			s = null;
-			goto l1;
-		}
-		socketIndex = ((SocketPtr) (interpreterProxy->firstIndexableField(socketOop)));
-		s = socketIndex;
-	l1:	/* end socketValueOf: */;
+		s = (interpreterProxy->failed()
+			? null
+			: ((SocketPtr) (interpreterProxy->firstIndexableField(socketOop))));
 		sqSocketAcceptFromRecvBytesSendBytesSemaID(s, serverSocket, recvBufSize, sendBufSize, semaIndex);
 	}
 	if (interpreterProxy->failed()) {
@@ -483,8 +808,6 @@
 	sqInt semaIndex;
 	sqInt sendBufSize;
 	SocketPtr  serverSocket;
-	void *socketIndex;
-	void *socketIndex1;
 	sqInt socketOop;
 	sqInt sockHandle;
 
@@ -500,25 +823,17 @@
 	/* begin socketValueOf: */
 	interpreterProxy->success((interpreterProxy->isBytes(sockHandle))
 	 && ((interpreterProxy->byteSizeOf(sockHandle)) == (socketRecordSize())));
-	if (interpreterProxy->failed()) {
-		serverSocket = null;
-		goto l2;
-	}
-	socketIndex1 = ((SocketPtr) (interpreterProxy->firstIndexableField(sockHandle)));
-	serverSocket = socketIndex1;
-l2:	/* end socketValueOf: */;
+	serverSocket = (interpreterProxy->failed()
+		? null
+		: ((SocketPtr) (interpreterProxy->firstIndexableField(sockHandle))));
 	if (!(interpreterProxy->failed())) {
 		socketOop = interpreterProxy->instantiateClassindexableSize(interpreterProxy->classByteArray(), socketRecordSize());
 		/* begin socketValueOf: */
 		interpreterProxy->success((interpreterProxy->isBytes(socketOop))
 		 && ((interpreterProxy->byteSizeOf(socketOop)) == (socketRecordSize())));
-		if (interpreterProxy->failed()) {
-			s = null;
-			goto l1;
-		}
-		socketIndex = ((SocketPtr) (interpreterProxy->firstIndexableField(socketOop)));
-		s = socketIndex;
-	l1:	/* end socketValueOf: */;
+		s = (interpreterProxy->failed()
+			? null
+			: ((SocketPtr) (interpreterProxy->firstIndexableField(socketOop))));
 		sqSocketAcceptFromRecvBytesSendBytesSemaIDReadSemaIDWriteSemaID(s, serverSocket, recvBufSize, sendBufSize, semaIndex, aReadSema, aWriteSema);
 	}
 	if (interpreterProxy->failed()) {
@@ -529,6 +844,95 @@
 }
 
 EXPORT(sqInt)
+primitiveSocketAddressGetPort(void)
+{
+	sqInt addr;
+	char *addrBase;
+	sqInt addrSize;
+	sqInt port;
+	sqInt _return_value;
+
+	addr = interpreterProxy->stackValue(0);
+	if (interpreterProxy->failed()) {
+		return null;
+	}
+	addrSize = interpreterProxy->byteSizeOf(addr);
+	addrBase = ((char *) (interpreterProxy->firstIndexableField(addr)));
+	if (!(interpreterProxy->failed())) {
+		port = sqSocketAddressSizeGetPort(addrBase, addrSize);
+		if (!(interpreterProxy->failed())) {
+			_return_value = interpreterProxy->integerObjectOf(port);
+			if (interpreterProxy->failed()) {
+				return null;
+			}
+			interpreterProxy->popthenPush(1, _return_value);
+			return null;
+		}
+	}
+	if (interpreterProxy->failed()) {
+		return null;
+	}
+	return null;
+}
+
+EXPORT(sqInt)
+primitiveSocketAddressSetPort(void)
+{
+	sqInt addr;
+	char *addrBase;
+	sqInt addrSize;
+	sqInt portNumber;
+
+	portNumber = interpreterProxy->stackIntegerValue(0);
+	addr = interpreterProxy->stackValue(1);
+	if (interpreterProxy->failed()) {
+		return null;
+	}
+	addrSize = interpreterProxy->byteSizeOf(addr);
+	addrBase = ((char *) (interpreterProxy->firstIndexableField(addr)));
+	if (!(interpreterProxy->failed())) {
+		sqSocketAddressSizeSetPort(addrBase, addrSize, portNumber);
+	}
+	if (interpreterProxy->failed()) {
+		return null;
+	}
+	interpreterProxy->pop(1);
+	return null;
+}
+
+EXPORT(sqInt)
+primitiveSocketBindTo(void)
+{
+	char *addrBase;
+	sqInt addrSize;
+	SocketPtr s;
+	sqInt socket;
+	sqInt socketAddress;
+
+	socket = interpreterProxy->stackValue(1);
+	socketAddress = interpreterProxy->stackValue(0);
+	if (interpreterProxy->failed()) {
+		return null;
+	}
+	/* begin socketValueOf: */
+	interpreterProxy->success((interpreterProxy->isBytes(socket))
+	 && ((interpreterProxy->byteSizeOf(socket)) == (socketRecordSize())));
+	s = (interpreterProxy->failed()
+		? null
+		: ((SocketPtr) (interpreterProxy->firstIndexableField(socket))));
+	addrSize = interpreterProxy->byteSizeOf(socketAddress);
+	addrBase = ((char *) (interpreterProxy->firstIndexableField(socketAddress)));
+	if (!(interpreterProxy->failed())) {
+		sqSocketBindToAddressSize(s, addrBase, addrSize);
+	}
+	if (interpreterProxy->failed()) {
+		return null;
+	}
+	interpreterProxy->pop(2);
+	return null;
+}
+
+EXPORT(sqInt)
 primitiveSocketBindToPort(void)
 {
 	sqInt addr;
@@ -536,7 +940,6 @@
 	sqInt port;
 	SocketPtr s;
 	sqInt socket;
-	void *socketIndex;
 	sqInt sz;
 
 	socket = interpreterProxy->stackValue(2);
@@ -557,13 +960,9 @@
 	/* begin socketValueOf: */
 	interpreterProxy->success((interpreterProxy->isBytes(socket))
 	 && ((interpreterProxy->byteSizeOf(socket)) == (socketRecordSize())));
-	if (interpreterProxy->failed()) {
-		s = null;
-		goto l2;
-	}
-	socketIndex = ((SocketPtr) (interpreterProxy->firstIndexableField(socket)));
-	s = socketIndex;
-l2:	/* end socketValueOf: */;
+	s = (interpreterProxy->failed()
+		? null
+		: ((SocketPtr) (interpreterProxy->firstIndexableField(socket))));
 	if (!(interpreterProxy->failed())) {
 		sqSocketBindToPort(s, addr, port);
 	}
@@ -579,7 +978,6 @@
 {
 	SocketPtr  s;
 	sqInt socket;
-	void *socketIndex;
 
 	socket = interpreterProxy->stackValue(0);
 	if (interpreterProxy->failed()) {
@@ -588,13 +986,9 @@
 	/* begin socketValueOf: */
 	interpreterProxy->success((interpreterProxy->isBytes(socket))
 	 && ((interpreterProxy->byteSizeOf(socket)) == (socketRecordSize())));
-	if (interpreterProxy->failed()) {
-		s = null;
-		goto l1;
-	}
-	socketIndex = ((SocketPtr) (interpreterProxy->firstIndexableField(socket)));
-	s = socketIndex;
-l1:	/* end socketValueOf: */;
+	s = (interpreterProxy->failed()
+		? null
+		: ((SocketPtr) (interpreterProxy->firstIndexableField(socket))));
 	if (!(interpreterProxy->failed())) {
 		sqSocketCloseConnection(s);
 	}
@@ -610,7 +1004,6 @@
 {
 	SocketPtr  s;
 	sqInt socket;
-	void *socketIndex;
 	sqInt status;
 	sqInt _return_value;
 
@@ -621,13 +1014,9 @@
 	/* begin socketValueOf: */
 	interpreterProxy->success((interpreterProxy->isBytes(socket))
 	 && ((interpreterProxy->byteSizeOf(socket)) == (socketRecordSize())));
-	if (interpreterProxy->failed()) {
-		s = null;
-		goto l1;
-	}
-	socketIndex = ((SocketPtr) (interpreterProxy->firstIndexableField(socket)));
-	s = socketIndex;
-l1:	/* end socketValueOf: */;
+	s = (interpreterProxy->failed()
+		? null
+		: ((SocketPtr) (interpreterProxy->firstIndexableField(socket))));
 	if (!(interpreterProxy->failed())) {
 		status = sqSocketConnectionStatus(s);
 	}
@@ -640,6 +1029,38 @@
 }
 
 EXPORT(sqInt)
+primitiveSocketConnectTo(void)
+{
+	char *addrBase;
+	sqInt addrSize;
+	SocketPtr s;
+	sqInt socket;
+	sqInt socketAddress;
+
+	socket = interpreterProxy->stackValue(1);
+	socketAddress = interpreterProxy->stackValue(0);
+	if (interpreterProxy->failed()) {
+		return null;
+	}
+	/* begin socketValueOf: */
+	interpreterProxy->success((interpreterProxy->isBytes(socket))
+	 && ((interpreterProxy->byteSizeOf(socket)) == (socketRecordSize())));
+	s = (interpreterProxy->failed()
+		? null
+		: ((SocketPtr) (interpreterProxy->firstIndexableField(socket))));
+	addrSize = interpreterProxy->byteSizeOf(socketAddress);
+	addrBase = ((char *) (interpreterProxy->firstIndexableField(socketAddress)));
+	if (!(interpreterProxy->failed())) {
+		sqSocketConnectToAddressSize(s, addrBase, addrSize);
+	}
+	if (interpreterProxy->failed()) {
+		return null;
+	}
+	interpreterProxy->pop(2);
+	return null;
+}
+
+EXPORT(sqInt)
 primitiveSocketConnectToPort(void)
 {
 	sqInt addr;
@@ -648,7 +1069,6 @@
 	sqInt port;
 	SocketPtr s;
 	sqInt socket;
-	void *socketIndex;
 	sqInt sz;
 
 	socket = interpreterProxy->stackValue(2);
@@ -668,7 +1088,7 @@
 l1:	/* end netAddressToInt: */;
 	if (sCCTPfn != 0) {
 		okToConnect =  ((int (*) (int, int)) sCCTPfn)(addr, port);
-		if (!(okToConnect)) {
+		if (!okToConnect) {
 			interpreterProxy->primitiveFail();
 			return null;
 		}
@@ -676,13 +1096,9 @@
 	/* begin socketValueOf: */
 	interpreterProxy->success((interpreterProxy->isBytes(socket))
 	 && ((interpreterProxy->byteSizeOf(socket)) == (socketRecordSize())));
-	if (interpreterProxy->failed()) {
-		s = null;
-		goto l2;
-	}
-	socketIndex = ((SocketPtr) (interpreterProxy->firstIndexableField(socket)));
-	s = socketIndex;
-l2:	/* end socketValueOf: */;
+	s = (interpreterProxy->failed()
+		? null
+		: ((SocketPtr) (interpreterProxy->firstIndexableField(socket))));
 	if (!(interpreterProxy->failed())) {
 		sqSocketConnectToPort(s, addr, port);
 	}
@@ -702,7 +1118,6 @@
 	SocketPtr  s;
 	sqInt semaIndex;
 	sqInt sendBufSize;
-	void *socketIndex;
 	sqInt socketOop;
 	sqInt socketType;
 
@@ -716,7 +1131,7 @@
 	}
 	if (sCCSOTfn != 0) {
 		okToCreate =  ((int (*) (int, int)) sCCSOTfn)(netType, socketType);
-		if (!(okToCreate)) {
+		if (!okToCreate) {
 			interpreterProxy->primitiveFail();
 			return null;
 		}
@@ -725,13 +1140,9 @@
 	/* begin socketValueOf: */
 	interpreterProxy->success((interpreterProxy->isBytes(socketOop))
 	 && ((interpreterProxy->byteSizeOf(socketOop)) == (socketRecordSize())));
-	if (interpreterProxy->failed()) {
-		s = null;
-		goto l1;
-	}
-	socketIndex = ((SocketPtr) (interpreterProxy->firstIndexableField(socketOop)));
-	s = socketIndex;
-l1:	/* end socketValueOf: */;
+	s = (interpreterProxy->failed()
+		? null
+		: ((SocketPtr) (interpreterProxy->firstIndexableField(socketOop))));
 	sqSocketCreateNetTypeSocketTypeRecvBytesSendBytesSemaID(s, netType, socketType, recvBufSize, sendBufSize, semaIndex);
 	if (interpreterProxy->failed()) {
 		return null;
@@ -751,7 +1162,6 @@
 	SocketPtr  s;
 	sqInt semaIndex;
 	sqInt sendBufSize;
-	void *socketIndex;
 	sqInt socketOop;
 	sqInt socketType;
 
@@ -767,7 +1177,7 @@
 	}
 	if (sCCSOTfn != 0) {
 		okToCreate =  ((int (*) (int, int)) sCCSOTfn)(netType, socketType);
-		if (!(okToCreate)) {
+		if (!okToCreate) {
 			interpreterProxy->primitiveFail();
 			return null;
 		}
@@ -776,13 +1186,9 @@
 	/* begin socketValueOf: */
 	interpreterProxy->success((interpreterProxy->isBytes(socketOop))
 	 && ((interpreterProxy->byteSizeOf(socketOop)) == (socketRecordSize())));
-	if (interpreterProxy->failed()) {
-		s = null;
-		goto l1;
-	}
-	socketIndex = ((SocketPtr) (interpreterProxy->firstIndexableField(socketOop)));
-	s = socketIndex;
-l1:	/* end socketValueOf: */;
+	s = (interpreterProxy->failed()
+		? null
+		: ((SocketPtr) (interpreterProxy->firstIndexableField(socketOop))));
 	sqSocketCreateNetTypeSocketTypeRecvBytesSendBytesSemaIDReadSemaIDWriteSemaID(s, netType, socketType, recvBufSize, sendBufSize, semaIndex, aReadSema, aWriteSema);
 	if (interpreterProxy->failed()) {
 		return null;
@@ -803,7 +1209,6 @@
 	SocketPtr  s;
 	sqInt semaIndex;
 	sqInt sendBufSize;
-	void *socketIndex;
 	sqInt socketOop;
 
 	netType = interpreterProxy->stackIntegerValue(6);
@@ -818,7 +1223,7 @@
 	}
 	if (sCCSOTfn != 0) {
 		okToCreate =  ((int (*) (int, int)) sCCSOTfn)(netType, protoType);
-		if (!(okToCreate)) {
+		if (!okToCreate) {
 			interpreterProxy->primitiveFail();
 			return null;
 		}
@@ -827,13 +1232,9 @@
 	/* begin socketValueOf: */
 	interpreterProxy->success((interpreterProxy->isBytes(socketOop))
 	 && ((interpreterProxy->byteSizeOf(socketOop)) == (socketRecordSize())));
-	if (interpreterProxy->failed()) {
-		s = null;
-		goto l1;
-	}
-	socketIndex = ((SocketPtr) (interpreterProxy->firstIndexableField(socketOop)));
-	s = socketIndex;
-l1:	/* end socketValueOf: */;
+	s = (interpreterProxy->failed()
+		? null
+		: ((SocketPtr) (interpreterProxy->firstIndexableField(socketOop))));
 	sqSocketCreateRawProtoTypeRecvBytesSendBytesSemaIDReadSemaIDWriteSemaID(s, netType, protoType, recvBufSize, sendBufSize, semaIndex, aReadSema, aWriteSema);
 	if (interpreterProxy->failed()) {
 		return null;
@@ -847,7 +1248,6 @@
 {
 	SocketPtr s;
 	sqInt socket;
-	void *socketIndex;
 
 	socket = interpreterProxy->stackValue(0);
 	if (interpreterProxy->failed()) {
@@ -856,13 +1256,9 @@
 	/* begin socketValueOf: */
 	interpreterProxy->success((interpreterProxy->isBytes(socket))
 	 && ((interpreterProxy->byteSizeOf(socket)) == (socketRecordSize())));
-	if (interpreterProxy->failed()) {
-		s = null;
-		goto l1;
-	}
-	socketIndex = ((SocketPtr) (interpreterProxy->firstIndexableField(socket)));
-	s = socketIndex;
-l1:	/* end socketValueOf: */;
+	s = (interpreterProxy->failed()
+		? null
+		: ((SocketPtr) (interpreterProxy->firstIndexableField(socket))));
 	if (!(interpreterProxy->failed())) {
 		sqSocketDestroy(s);
 	}
@@ -879,7 +1275,6 @@
 	sqInt err;
 	SocketPtr  s;
 	sqInt socket;
-	void *socketIndex;
 	sqInt _return_value;
 
 	socket = interpreterProxy->stackValue(0);
@@ -889,13 +1284,9 @@
 	/* begin socketValueOf: */
 	interpreterProxy->success((interpreterProxy->isBytes(socket))
 	 && ((interpreterProxy->byteSizeOf(socket)) == (socketRecordSize())));
-	if (interpreterProxy->failed()) {
-		s = null;
-		goto l1;
-	}
-	socketIndex = ((SocketPtr) (interpreterProxy->firstIndexableField(socket)));
-	s = socketIndex;
-l1:	/* end socketValueOf: */;
+	s = (interpreterProxy->failed()
+		? null
+		: ((SocketPtr) (interpreterProxy->firstIndexableField(socket))));
 	if (!(interpreterProxy->failed())) {
 		err = sqSocketError(s);
 	}
@@ -918,7 +1309,6 @@
 	sqInt returnedValue;
 	SocketPtr s;
 	sqInt socket;
-	void *socketIndex;
 
 	socket = interpreterProxy->stackValue(1);
 	optionName = interpreterProxy->stackValue(0);
@@ -928,13 +1318,9 @@
 	/* begin socketValueOf: */
 	interpreterProxy->success((interpreterProxy->isBytes(socket))
 	 && ((interpreterProxy->byteSizeOf(socket)) == (socketRecordSize())));
-	if (interpreterProxy->failed()) {
-		s = null;
-		goto l1;
-	}
-	socketIndex = ((SocketPtr) (interpreterProxy->firstIndexableField(socket)));
-	s = socketIndex;
-l1:	/* end socketValueOf: */;
+	s = (interpreterProxy->failed()
+		? null
+		: ((SocketPtr) (interpreterProxy->firstIndexableField(socket))));
 	interpreterProxy->success(interpreterProxy->isBytes(optionName));
 	optionNameStart = ((char *) (interpreterProxy->firstIndexableField(optionName)));
 	optionNameSize = interpreterProxy->slotSizeOf(optionName);
@@ -968,7 +1354,6 @@
 	sqInt port;
 	SocketPtr  s;
 	sqInt socket;
-	void *socketIndex;
 
 	socket = interpreterProxy->stackValue(1);
 	port = interpreterProxy->stackIntegerValue(0);
@@ -978,21 +1363,19 @@
 	/* begin socketValueOf: */
 	interpreterProxy->success((interpreterProxy->isBytes(socket))
 	 && ((interpreterProxy->byteSizeOf(socket)) == (socketRecordSize())));
-	if (interpreterProxy->failed()) {
-		s = null;
-		goto l1;
-	}
-	socketIndex = ((SocketPtr) (interpreterProxy->firstIndexableField(socket)));
-	s = socketIndex;
-l1:	/* end socketValueOf: */;
+	s = (interpreterProxy->failed()
+		? null
+		: ((SocketPtr) (interpreterProxy->firstIndexableField(socket))));
 	if (sCCLOPfn != 0) {
 		okToListen =  ((int (*) (SocketPtr, int)) sCCLOPfn)(s, port);
-		if (!(okToListen)) {
+		if (!okToListen) {
 			interpreterProxy->primitiveFail();
 			return null;
 		}
 	}
-	sqSocketListenOnPort(s, port);
+	if (!(interpreterProxy->failed())) {
+		sqSocketListenOnPort(s, port);
+	}
 	if (interpreterProxy->failed()) {
 		return null;
 	}
@@ -1013,7 +1396,6 @@
 	sqInt port;
 	SocketPtr s;
 	sqInt socket;
-	void *socketIndex;
 
 	socket = interpreterProxy->stackValue(2);
 	port = interpreterProxy->stackIntegerValue(1);
@@ -1024,16 +1406,12 @@
 	/* begin socketValueOf: */
 	interpreterProxy->success((interpreterProxy->isBytes(socket))
 	 && ((interpreterProxy->byteSizeOf(socket)) == (socketRecordSize())));
-	if (interpreterProxy->failed()) {
-		s = null;
-		goto l1;
-	}
-	socketIndex = ((SocketPtr) (interpreterProxy->firstIndexableField(socket)));
-	s = socketIndex;
-l1:	/* end socketValueOf: */;
+	s = (interpreterProxy->failed()
+		? null
+		: ((SocketPtr) (interpreterProxy->firstIndexableField(socket))));
 	if (sCCLOPfn != 0) {
 		okToListen =  ((int (*) (SocketPtr, int)) sCCLOPfn)(s, port);
-		if (!(okToListen)) {
+		if (!okToListen) {
 			interpreterProxy->primitiveFail();
 			return null;
 		}
@@ -1062,7 +1440,6 @@
 	sqInt port;
 	SocketPtr s;
 	sqInt socket;
-	void *socketIndex;
 	sqInt sz;
 
 	socket = interpreterProxy->stackValue(3);
@@ -1076,16 +1453,12 @@
 	/* begin socketValueOf: */
 	interpreterProxy->success((interpreterProxy->isBytes(socket))
 	 && ((interpreterProxy->byteSizeOf(socket)) == (socketRecordSize())));
-	if (interpreterProxy->failed()) {
-		s = null;
-		goto l2;
-	}
-	socketIndex = ((SocketPtr) (interpreterProxy->firstIndexableField(socket)));
-	s = socketIndex;
-l2:	/* end socketValueOf: */;
+	s = (interpreterProxy->failed()
+		? null
+		: ((SocketPtr) (interpreterProxy->firstIndexableField(socket))));
 	if (sCCLOPfn != 0) {
 		okToListen =  ((int (*) (SocketPtr, int)) sCCLOPfn)(s, port);
-		if (!(okToListen)) {
+		if (!okToListen) {
 			interpreterProxy->primitiveFail();
 			return null;
 		}
@@ -1106,7 +1479,35 @@
 	return null;
 }
 
+EXPORT(sqInt)
+primitiveSocketListenWithBacklog(void)
+{
+	sqInt backlogSize;
+	SocketPtr s;
+	sqInt socket;
 
+	socket = interpreterProxy->stackValue(1);
+	backlogSize = interpreterProxy->stackIntegerValue(0);
+	if (interpreterProxy->failed()) {
+		return null;
+	}
+	/* begin socketValueOf: */
+	interpreterProxy->success((interpreterProxy->isBytes(socket))
+	 && ((interpreterProxy->byteSizeOf(socket)) == (socketRecordSize())));
+	s = (interpreterProxy->failed()
+		? null
+		: ((SocketPtr) (interpreterProxy->firstIndexableField(socket))));
+	if (!(interpreterProxy->failed())) {
+		sqSocketListenBacklog(s, backlogSize);
+	}
+	if (interpreterProxy->failed()) {
+		return null;
+	}
+	interpreterProxy->pop(2);
+	return null;
+}
+
+
 /*	Backward compatibility */
 
 EXPORT(sqInt)
@@ -1126,7 +1527,6 @@
 	sqInt addr;
 	SocketPtr s;
 	sqInt socket;
-	void *socketIndex;
 	sqInt _return_value;
 
 	socket = interpreterProxy->stackValue(0);
@@ -1136,13 +1536,9 @@
 	/* begin socketValueOf: */
 	interpreterProxy->success((interpreterProxy->isBytes(socket))
 	 && ((interpreterProxy->byteSizeOf(socket)) == (socketRecordSize())));
-	if (interpreterProxy->failed()) {
-		s = null;
-		goto l1;
-	}
-	socketIndex = ((SocketPtr) (interpreterProxy->firstIndexableField(socket)));
-	s = socketIndex;
-l1:	/* end socketValueOf: */;
+	s = (interpreterProxy->failed()
+		? null
+		: ((SocketPtr) (interpreterProxy->firstIndexableField(socket))));
 	addr = sqSocketLocalAddress(s);
 	_return_value = intToNetAddress(addr);
 	if (interpreterProxy->failed()) {
@@ -1153,12 +1549,76 @@
 }
 
 EXPORT(sqInt)
+primitiveSocketLocalAddressResult(void)
+{
+	char *addrBase;
+	sqInt addrSize;
+	SocketPtr s;
+	sqInt socket;
+	sqInt socketAddress;
+
+	socket = interpreterProxy->stackValue(1);
+	socketAddress = interpreterProxy->stackValue(0);
+	if (interpreterProxy->failed()) {
+		return null;
+	}
+	/* begin socketValueOf: */
+	interpreterProxy->success((interpreterProxy->isBytes(socket))
+	 && ((interpreterProxy->byteSizeOf(socket)) == (socketRecordSize())));
+	s = (interpreterProxy->failed()
+		? null
+		: ((SocketPtr) (interpreterProxy->firstIndexableField(socket))));
+	addrSize = interpreterProxy->byteSizeOf(socketAddress);
+	addrBase = ((char *) (interpreterProxy->firstIndexableField(socketAddress)));
+	if (!(interpreterProxy->failed())) {
+		sqSocketLocalAddressResultSize(s, addrBase, addrSize);
+	}
+	if (interpreterProxy->failed()) {
+		return null;
+	}
+	interpreterProxy->pop(2);
+	return null;
+}
+
+EXPORT(sqInt)
+primitiveSocketLocalAddressSize(void)
+{
+	SocketPtr s;
+	sqInt size;
+	sqInt socket;
+	sqInt _return_value;
+
+	socket = interpreterProxy->stackValue(0);
+	if (interpreterProxy->failed()) {
+		return null;
+	}
+	/* begin socketValueOf: */
+	interpreterProxy->success((interpreterProxy->isBytes(socket))
+	 && ((interpreterProxy->byteSizeOf(socket)) == (socketRecordSize())));
+	s = (interpreterProxy->failed()
+		? null
+		: ((SocketPtr) (interpreterProxy->firstIndexableField(socket))));
+	if (interpreterProxy->failed()) {
+		return null;
+	}
+	size = sqSocketLocalAddressSize(s);
+	if (interpreterProxy->failed()) {
+		return null;
+	}
+	_return_value = interpreterProxy->integerObjectOf(size);
+	if (interpreterProxy->failed()) {
+		return null;
+	}
+	interpreterProxy->popthenPush(2, _return_value);
+	return null;
+}
+
+EXPORT(sqInt)
 primitiveSocketLocalPort(void)
 {
 	sqInt port;
 	SocketPtr  s;
 	sqInt socket;
-	void *socketIndex;
 	sqInt _return_value;
 
 	socket = interpreterProxy->stackValue(0);
@@ -1168,13 +1628,9 @@
 	/* begin socketValueOf: */
 	interpreterProxy->success((interpreterProxy->isBytes(socket))
 	 && ((interpreterProxy->byteSizeOf(socket)) == (socketRecordSize())));
-	if (interpreterProxy->failed()) {
-		s = null;
-		goto l1;
-	}
-	socketIndex = ((SocketPtr) (interpreterProxy->firstIndexableField(socket)));
-	s = socketIndex;
-l1:	/* end socketValueOf: */;
+	s = (interpreterProxy->failed()
+		? null
+		: ((SocketPtr) (interpreterProxy->firstIndexableField(socket))));
 	port = sqSocketLocalPort(s);
 	_return_value = interpreterProxy->integerObjectOf(port);
 	if (interpreterProxy->failed()) {
@@ -1190,7 +1646,6 @@
 	sqInt dataIsAvailable;
 	SocketPtr s;
 	sqInt socket;
-	void *socketIndex;
 	sqInt _return_value;
 
 	socket = interpreterProxy->stackValue(0);
@@ -1200,13 +1655,9 @@
 	/* begin socketValueOf: */
 	interpreterProxy->success((interpreterProxy->isBytes(socket))
 	 && ((interpreterProxy->byteSizeOf(socket)) == (socketRecordSize())));
-	if (interpreterProxy->failed()) {
-		s = null;
-		goto l1;
-	}
-	socketIndex = ((SocketPtr) (interpreterProxy->firstIndexableField(socket)));
-	s = socketIndex;
-l1:	/* end socketValueOf: */;
+	s = (interpreterProxy->failed()
+		? null
+		: ((SocketPtr) (interpreterProxy->firstIndexableField(socket))));
 	dataIsAvailable = sqSocketReceiveDataAvailable(s);
 	_return_value = (dataIsAvailable) ? interpreterProxy->trueObject(): interpreterProxy->falseObject();
 	if (interpreterProxy->failed()) {
@@ -1227,7 +1678,6 @@
 	sqInt count;
 	SocketPtr s;
 	sqInt socket;
-	void *socketIndex;
 	sqInt startIndex;
 	sqInt _return_value;
 
@@ -1241,13 +1691,9 @@
 	/* begin socketValueOf: */
 	interpreterProxy->success((interpreterProxy->isBytes(socket))
 	 && ((interpreterProxy->byteSizeOf(socket)) == (socketRecordSize())));
-	if (interpreterProxy->failed()) {
-		s = null;
-		goto l1;
-	}
-	socketIndex = ((SocketPtr) (interpreterProxy->firstIndexableField(socket)));
-	s = socketIndex;
-l1:	/* end socketValueOf: */;
+	s = (interpreterProxy->failed()
+		? null
+		: ((SocketPtr) (interpreterProxy->firstIndexableField(socket))));
 	interpreterProxy->success(interpreterProxy->isWordsOrBytes(array));
 	if (interpreterProxy->isWords(array)) {
 		byteSize = 4;
@@ -1289,7 +1735,6 @@
 	sqInt results;
 	SocketPtr s;
 	sqInt socket;
-	void *socketIndex;
 	sqInt startIndex;
 
 	socket = interpreterProxy->stackValue(3);
@@ -1302,13 +1747,9 @@
 	/* begin socketValueOf: */
 	interpreterProxy->success((interpreterProxy->isBytes(socket))
 	 && ((interpreterProxy->byteSizeOf(socket)) == (socketRecordSize())));
-	if (interpreterProxy->failed()) {
-		s = null;
-		goto l1;
-	}
-	socketIndex = ((SocketPtr) (interpreterProxy->firstIndexableField(socket)));
-	s = socketIndex;
-l1:	/* end socketValueOf: */;
+	s = (interpreterProxy->failed()
+		? null
+		: ((SocketPtr) (interpreterProxy->firstIndexableField(socket))));
 	interpreterProxy->success(interpreterProxy->isWordsOrBytes(array));
 	if (interpreterProxy->isWords(array)) {
 		byteSize = 4;
@@ -1361,7 +1802,6 @@
 	sqInt addr;
 	SocketPtr s;
 	sqInt socket;
-	void *socketIndex;
 	sqInt _return_value;
 
 	socket = interpreterProxy->stackValue(0);
@@ -1371,13 +1811,9 @@
 	/* begin socketValueOf: */
 	interpreterProxy->success((interpreterProxy->isBytes(socket))
 	 && ((interpreterProxy->byteSizeOf(socket)) == (socketRecordSize())));
-	if (interpreterProxy->failed()) {
-		s = null;
-		goto l1;
-	}
-	socketIndex = ((SocketPtr) (interpreterProxy->firstIndexableField(socket)));
-	s = socketIndex;
-l1:	/* end socketValueOf: */;
+	s = (interpreterProxy->failed()
+		? null
+		: ((SocketPtr) (interpreterProxy->firstIndexableField(socket))));
 	addr = sqSocketRemoteAddress(s);
 	_return_value = intToNetAddress(addr);
 	if (interpreterProxy->failed()) {
@@ -1388,12 +1824,76 @@
 }
 
 EXPORT(sqInt)
+primitiveSocketRemoteAddressResult(void)
+{
+	char *addrBase;
+	sqInt addrSize;
+	SocketPtr s;
+	sqInt socket;
+	sqInt socketAddress;
+
+	socket = interpreterProxy->stackValue(1);
+	socketAddress = interpreterProxy->stackValue(0);
+	if (interpreterProxy->failed()) {
+		return null;
+	}
+	/* begin socketValueOf: */
+	interpreterProxy->success((interpreterProxy->isBytes(socket))
+	 && ((interpreterProxy->byteSizeOf(socket)) == (socketRecordSize())));
+	s = (interpreterProxy->failed()
+		? null
+		: ((SocketPtr) (interpreterProxy->firstIndexableField(socket))));
+	addrSize = interpreterProxy->byteSizeOf(socketAddress);
+	addrBase = ((char *) (interpreterProxy->firstIndexableField(socketAddress)));
+	if (!(interpreterProxy->failed())) {
+		sqSocketRemoteAddressResultSize(s, addrBase, addrSize);
+	}
+	if (interpreterProxy->failed()) {
+		return null;
+	}
+	interpreterProxy->pop(2);
+	return null;
+}
+
+EXPORT(sqInt)
+primitiveSocketRemoteAddressSize(void)
+{
+	SocketPtr s;
+	sqInt size;
+	sqInt socket;
+	sqInt _return_value;
+
+	socket = interpreterProxy->stackValue(0);
+	if (interpreterProxy->failed()) {
+		return null;
+	}
+	/* begin socketValueOf: */
+	interpreterProxy->success((interpreterProxy->isBytes(socket))
+	 && ((interpreterProxy->byteSizeOf(socket)) == (socketRecordSize())));
+	s = (interpreterProxy->failed()
+		? null
+		: ((SocketPtr) (interpreterProxy->firstIndexableField(socket))));
+	if (interpreterProxy->failed()) {
+		return null;
+	}
+	size = sqSocketRemoteAddressSize(s);
+	if (interpreterProxy->failed()) {
+		return null;
+	}
+	_return_value = interpreterProxy->integerObjectOf(size);
+	if (interpreterProxy->failed()) {
+		return null;
+	}
+	interpreterProxy->popthenPush(2, _return_value);
+	return null;
+}
+
+EXPORT(sqInt)
 primitiveSocketRemotePort(void)
 {
 	sqInt port;
 	SocketPtr s;
 	sqInt socket;
-	void *socketIndex;
 	sqInt _return_value;
 
 	socket = interpreterProxy->stackValue(0);
@@ -1403,13 +1903,9 @@
 	/* begin socketValueOf: */
 	interpreterProxy->success((interpreterProxy->isBytes(socket))
 	 && ((interpreterProxy->byteSizeOf(socket)) == (socketRecordSize())));
-	if (interpreterProxy->failed()) {
-		s = null;
-		goto l1;
-	}
-	socketIndex = ((SocketPtr) (interpreterProxy->firstIndexableField(socket)));
-	s = socketIndex;
-l1:	/* end socketValueOf: */;
+	s = (interpreterProxy->failed()
+		? null
+		: ((SocketPtr) (interpreterProxy->firstIndexableField(socket))));
 	port = sqSocketRemotePort(s);
 	_return_value = interpreterProxy->integerObjectOf(port);
 	if (interpreterProxy->failed()) {
@@ -1430,7 +1926,6 @@
 	sqInt count;
 	SocketPtr s;
 	sqInt socket;
-	void *socketIndex;
 	sqInt startIndex;
 	sqInt _return_value;
 
@@ -1444,13 +1939,9 @@
 	/* begin socketValueOf: */
 	interpreterProxy->success((interpreterProxy->isBytes(socket))
 	 && ((interpreterProxy->byteSizeOf(socket)) == (socketRecordSize())));
-	if (interpreterProxy->failed()) {
-		s = null;
-		goto l1;
-	}
-	socketIndex = ((SocketPtr) (interpreterProxy->firstIndexableField(socket)));
-	s = socketIndex;
-l1:	/* end socketValueOf: */;
+	s = (interpreterProxy->failed()
+		? null
+		: ((SocketPtr) (interpreterProxy->firstIndexableField(socket))));
 	interpreterProxy->success(interpreterProxy->isWordsOrBytes(array));
 	if (interpreterProxy->isWords(array)) {
 		byteSize = 4;
@@ -1483,7 +1974,6 @@
 	sqInt done;
 	SocketPtr s;
 	sqInt socket;
-	void *socketIndex;
 	sqInt _return_value;
 
 	socket = interpreterProxy->stackValue(0);
@@ -1493,13 +1983,9 @@
 	/* begin socketValueOf: */
 	interpreterProxy->success((interpreterProxy->isBytes(socket))
 	 && ((interpreterProxy->byteSizeOf(socket)) == (socketRecordSize())));
-	if (interpreterProxy->failed()) {
-		s = null;
-		goto l1;
-	}
-	socketIndex = ((SocketPtr) (interpreterProxy->firstIndexableField(socket)));
-	s = socketIndex;
-l1:	/* end socketValueOf: */;
+	s = (interpreterProxy->failed()
+		? null
+		: ((SocketPtr) (interpreterProxy->firstIndexableField(socket))));
 	done = sqSocketSendDone(s);
 	_return_value = (done) ? interpreterProxy->trueObject(): interpreterProxy->falseObject();
 	if (interpreterProxy->failed()) {
@@ -1523,7 +2009,6 @@
 	sqInt portNumber;
 	SocketPtr s;
 	sqInt socket;
-	void *socketIndex;
 	sqInt startIndex;
 	sqInt sz;
 	sqInt _return_value;
@@ -1541,13 +2026,9 @@
 	/* begin socketValueOf: */
 	interpreterProxy->success((interpreterProxy->isBytes(socket))
 	 && ((interpreterProxy->byteSizeOf(socket)) == (socketRecordSize())));
-	if (interpreterProxy->failed()) {
-		s = null;
-		goto l2;
-	}
-	socketIndex = ((SocketPtr) (interpreterProxy->firstIndexableField(socket)));
-	s = socketIndex;
-l2:	/* end socketValueOf: */;
+	s = (interpreterProxy->failed()
+		? null
+		: ((SocketPtr) (interpreterProxy->firstIndexableField(socket))));
 	interpreterProxy->success(interpreterProxy->isWordsOrBytes(array));
 	if (interpreterProxy->isWords(array)) {
 		byteSize = 4;
@@ -1596,7 +2077,6 @@
 	sqInt returnedValue;
 	SocketPtr s;
 	sqInt socket;
-	void *socketIndex;
 
 	socket = interpreterProxy->stackValue(2);
 	optionName = interpreterProxy->stackValue(1);
@@ -1607,13 +2087,9 @@
 	/* begin socketValueOf: */
 	interpreterProxy->success((interpreterProxy->isBytes(socket))
 	 && ((interpreterProxy->byteSizeOf(socket)) == (socketRecordSize())));
-	if (interpreterProxy->failed()) {
-		s = null;
-		goto l1;
-	}
-	socketIndex = ((SocketPtr) (interpreterProxy->firstIndexableField(socket)));
-	s = socketIndex;
-l1:	/* end socketValueOf: */;
+	s = (interpreterProxy->failed()
+		? null
+		: ((SocketPtr) (interpreterProxy->firstIndexableField(socket))));
 	interpreterProxy->success(interpreterProxy->isBytes(optionName));
 	optionNameStart = ((char *) (interpreterProxy->firstIndexableField(optionName)));
 	optionNameSize = interpreterProxy->slotSizeOf(optionName);
@@ -1677,15 +2153,11 @@
 static SocketPtr
 socketValueOf(sqInt socketOop)
 {
-	void *socketIndex;
-
 	interpreterProxy->success((interpreterProxy->isBytes(socketOop))
 	 && ((interpreterProxy->byteSizeOf(socketOop)) == (socketRecordSize())));
-	if (interpreterProxy->failed()) {
-		return null;
-	}
-	socketIndex = ((SocketPtr) (interpreterProxy->firstIndexableField(socketOop)));
-	return socketIndex;
+	return (interpreterProxy->failed()
+		? null
+		: ((SocketPtr) (interpreterProxy->firstIndexableField(socketOop))));
 }
 
 static void
@@ -1707,6 +2179,20 @@
 	{"SocketPlugin", "primitiveResolverAbortLookup", (void*)primitiveResolverAbortLookup},
 	{"SocketPlugin", "primitiveResolverAddressLookupResult", (void*)primitiveResolverAddressLookupResult},
 	{"SocketPlugin", "primitiveResolverError", (void*)primitiveResolverError},
+	{"SocketPlugin", "primitiveResolverGetAddressInfo", (void*)primitiveResolverGetAddressInfo},
+	{"SocketPlugin", "primitiveResolverGetAddressInfoFamily", (void*)primitiveResolverGetAddressInfoFamily},
+	{"SocketPlugin", "primitiveResolverGetAddressInfoNext", (void*)primitiveResolverGetAddressInfoNext},
+	{"SocketPlugin", "primitiveResolverGetAddressInfoProtocol", (void*)primitiveResolverGetAddressInfoProtocol},
+	{"SocketPlugin", "primitiveResolverGetAddressInfoResult", (void*)primitiveResolverGetAddressInfoResult},
+	{"SocketPlugin", "primitiveResolverGetAddressInfoSize", (void*)primitiveResolverGetAddressInfoSize},
+	{"SocketPlugin", "primitiveResolverGetAddressInfoType", (void*)primitiveResolverGetAddressInfoType},
+	{"SocketPlugin", "primitiveResolverGetNameInfo", (void*)primitiveResolverGetNameInfo},
+	{"SocketPlugin", "primitiveResolverGetNameInfoHostResult", (void*)primitiveResolverGetNameInfoHostResult},
+	{"SocketPlugin", "primitiveResolverGetNameInfoHostSize", (void*)primitiveResolverGetNameInfoHostSize},
+	{"SocketPlugin", "primitiveResolverGetNameInfoServiceResult", (void*)primitiveResolverGetNameInfoServiceResult},
+	{"SocketPlugin", "primitiveResolverGetNameInfoServiceSize", (void*)primitiveResolverGetNameInfoServiceSize},
+	{"SocketPlugin", "primitiveResolverHostNameResult", (void*)primitiveResolverHostNameResult},
+	{"SocketPlugin", "primitiveResolverHostNameSize", (void*)primitiveResolverHostNameSize},
 	{"SocketPlugin", "primitiveResolverLocalAddress", (void*)primitiveResolverLocalAddress},
 	{"SocketPlugin", "primitiveResolverNameLookupResult", (void*)primitiveResolverNameLookupResult},
 	{"SocketPlugin", "primitiveResolverStartAddressLookup", (void*)primitiveResolverStartAddressLookup},
@@ -1715,9 +2201,13 @@
 	{"SocketPlugin", "primitiveSocketAbortConnection", (void*)primitiveSocketAbortConnection},
 	{"SocketPlugin", "primitiveSocketAccept", (void*)primitiveSocketAccept},
 	{"SocketPlugin", "primitiveSocketAccept3Semaphores", (void*)primitiveSocketAccept3Semaphores},
+	{"SocketPlugin", "primitiveSocketAddressGetPort", (void*)primitiveSocketAddressGetPort},
+	{"SocketPlugin", "primitiveSocketAddressSetPort", (void*)primitiveSocketAddressSetPort},
+	{"SocketPlugin", "primitiveSocketBindTo", (void*)primitiveSocketBindTo},
 	{"SocketPlugin", "primitiveSocketBindToPort", (void*)primitiveSocketBindToPort},
 	{"SocketPlugin", "primitiveSocketCloseConnection", (void*)primitiveSocketCloseConnection},
 	{"SocketPlugin", "primitiveSocketConnectionStatus", (void*)primitiveSocketConnectionStatus},
+	{"SocketPlugin", "primitiveSocketConnectTo", (void*)primitiveSocketConnectTo},
 	{"SocketPlugin", "primitiveSocketConnectToPort", (void*)primitiveSocketConnectToPort},
 	{"SocketPlugin", "primitiveSocketCreate", (void*)primitiveSocketCreate},
 	{"SocketPlugin", "primitiveSocketCreate3Semaphores", (void*)primitiveSocketCreate3Semaphores},
@@ -1728,13 +2218,18 @@
 	{"SocketPlugin", "primitiveSocketListenOnPort", (void*)primitiveSocketListenOnPort},
 	{"SocketPlugin", "primitiveSocketListenOnPortBacklog", (void*)primitiveSocketListenOnPortBacklog},
 	{"SocketPlugin", "primitiveSocketListenOnPortBacklogInterface", (void*)primitiveSocketListenOnPortBacklogInterface},
+	{"SocketPlugin", "primitiveSocketListenWithBacklog", (void*)primitiveSocketListenWithBacklog},
 	{"SocketPlugin", "primitiveSocketListenWithOrWithoutBacklog", (void*)primitiveSocketListenWithOrWithoutBacklog},
 	{"SocketPlugin", "primitiveSocketLocalAddress", (void*)primitiveSocketLocalAddress},
+	{"SocketPlugin", "primitiveSocketLocalAddressResult", (void*)primitiveSocketLocalAddressResult},
+	{"SocketPlugin", "primitiveSocketLocalAddressSize", (void*)primitiveSocketLocalAddressSize},
 	{"SocketPlugin", "primitiveSocketLocalPort", (void*)primitiveSocketLocalPort},
 	{"SocketPlugin", "primitiveSocketReceiveDataAvailable", (void*)primitiveSocketReceiveDataAvailable},
 	{"SocketPlugin", "primitiveSocketReceiveDataBufCount", (void*)primitiveSocketReceiveDataBufCount},
 	{"SocketPlugin", "primitiveSocketReceiveUDPDataBufCount", (void*)primitiveSocketReceiveUDPDataBufCount},
 	{"SocketPlugin", "primitiveSocketRemoteAddress", (void*)primitiveSocketRemoteAddress},
+	{"SocketPlugin", "primitiveSocketRemoteAddressResult", (void*)primitiveSocketRemoteAddressResult},
+	{"SocketPlugin", "primitiveSocketRemoteAddressSize", (void*)primitiveSocketRemoteAddressSize},
 	{"SocketPlugin", "primitiveSocketRemotePort", (void*)primitiveSocketRemotePort},
 	{"SocketPlugin", "primitiveSocketSendDataBufCount", (void*)primitiveSocketSendDataBufCount},
 	{"SocketPlugin", "primitiveSocketSendDone", (void*)primitiveSocketSendDone},

Modified: branches/Cog/nscogsrc/plugins/UnixOSProcessPlugin/UnixOSProcessPlugin.c
===================================================================
--- branches/Cog/nscogsrc/plugins/UnixOSProcessPlugin/UnixOSProcessPlugin.c	2012-05-30 18:38:08 UTC (rev 2555)
+++ branches/Cog/nscogsrc/plugins/UnixOSProcessPlugin/UnixOSProcessPlugin.c	2012-06-07 19:29:52 UTC (rev 2556)
@@ -1,9 +1,9 @@
 /* Automatically generated by
-	VMPluginCodeGenerator VMMaker.oscog-eem.154 uuid: 5cbb57c7-0a54-4b7e-848c-1f292759f1fa
+	VMPluginCodeGenerator VMMaker.oscog-eem.161 uuid: d9d960b4-9f66-43a2-9d90-4fb58d541adc
    from
-	UnixOSProcessPlugin VMConstruction-Plugins-OSProcessPlugin.oscog-eem.34 uuid: 90d36152-4f89-4764-b476-2cc44c195139
+	UnixOSProcessPlugin VMConstruction-Plugins-OSProcessPlugin.oscog-eem.35 uuid: 15acec73-e0e7-4cc0-a521-1c4204a4b5b7
  */
-static char __buildInfo[] = "UnixOSProcessPlugin VMConstruction-Plugins-OSProcessPlugin.oscog-eem.34 uuid: 90d36152-4f89-4764-b476-2cc44c195139 " __DATE__ ;
+static char __buildInfo[] = "UnixOSProcessPlugin VMConstruction-Plugins-OSProcessPlugin.oscog-eem.35 uuid: 15acec73-e0e7-4cc0-a521-1c4204a4b5b7 " __DATE__ ;
 
 
 
@@ -109,6 +109,7 @@
 EXPORT(sqInt) primitiveChdir(void);
 EXPORT(sqInt) primitiveCreatePipe(void);
 EXPORT(sqInt) primitiveCreatePipeWithSessionIdentifier(void);
+EXPORT(sqInt) primitiveDup(sqInt fileDescriptor);
 EXPORT(sqInt) primitiveDupTo(sqInt oldFileDescriptor, sqInt newFileDescriptor);
 EXPORT(sqInt) primitiveEnvironmentAt(void);
 EXPORT(sqInt) primitiveEnvironmentAtSymbol(void);
@@ -249,9 +250,9 @@
 struct VirtualMachine* interpreterProxy;
 static const char *moduleName =
 #ifdef SQUEAK_BUILTIN_PLUGIN
-	"UnixOSProcessPlugin VMConstruction-Plugins-OSProcessPlugin.oscog-eem.34 (i)"
+	"UnixOSProcessPlugin VMConstruction-Plugins-OSProcessPlugin.oscog-eem.35 (i)"
 #else
-	"UnixOSProcessPlugin VMConstruction-Plugins-OSProcessPlugin.oscog-eem.34 (e)"
+	"UnixOSProcessPlugin VMConstruction-Plugins-OSProcessPlugin.oscog-eem.35 (e)"
 #endif
 ;
 static void *originalSigHandlers[NSIG];
@@ -1292,11 +1293,11 @@
 	path = transientCStringFromString(interpreterProxy->stackObjectValue(0));
 	if (chdir(path)) {
 		interpreterProxy->pop(2);
-		interpreterProxy->push(interpreterProxy->nilObject());
+		interpreterProxy->pushInteger(errno);
 	}
 	else {
 		interpreterProxy->pop(2);
-		interpreterProxy->pushInteger(errno);
+		interpreterProxy->push(interpreterProxy->nilObject());
 	}
 }
 
@@ -1420,6 +1421,24 @@
 }
 
 
+/*	Call dup() to duplicate a file descriptor using the next available
+	descriptor. Answer
+	the new file descriptor or -1 on failure.
+ */
+
+EXPORT(sqInt)
+primitiveDup(sqInt fileDescriptor)
+{
+    sqInt fd;
+    int result;
+
+	fd = interpreterProxy->stackIntegerValue(0);
+	result = dup(fd);
+	interpreterProxy->pop(2);
+	interpreterProxy->pushInteger(result);
+}
+
+
 /*	Call dup2() to duplicate a file descriptor. Answer the duplicated file
 	descriptor or -1 on failure. */
 
@@ -4440,6 +4459,7 @@
 	{"UnixOSProcessPlugin", "primitiveChdir", (void*)primitiveChdir},
 	{"UnixOSProcessPlugin", "primitiveCreatePipe", (void*)primitiveCreatePipe},
 	{"UnixOSProcessPlugin", "primitiveCreatePipeWithSessionIdentifier", (void*)primitiveCreatePipeWithSessionIdentifier},
+	{"UnixOSProcessPlugin", "primitiveDup", (void*)primitiveDup},
 	{"UnixOSProcessPlugin", "primitiveDupTo", (void*)primitiveDupTo},
 	{"UnixOSProcessPlugin", "primitiveEnvironmentAt", (void*)primitiveEnvironmentAt},
 	{"UnixOSProcessPlugin", "primitiveEnvironmentAtSymbol", (void*)primitiveEnvironmentAtSymbol},

Modified: branches/Cog/nscogsrc/vm/cointerp.c
===================================================================
--- branches/Cog/nscogsrc/vm/cointerp.c	2012-05-30 18:38:08 UTC (rev 2555)
+++ branches/Cog/nscogsrc/vm/cointerp.c	2012-06-07 19:29:52 UTC (rev 2556)
@@ -1,9 +1,9 @@
 /* Automatically generated by
-	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.159 uuid: cbf7f95a-6fe2-4578-898e-47afb8524be4
+	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.161 uuid: d9d960b4-9f66-43a2-9d90-4fb58d541adc
    from
-	CoInterpreter VMMaker.oscog-eem.159 uuid: cbf7f95a-6fe2-4578-898e-47afb8524be4
+	CoInterpreter VMMaker.oscog-eem.161 uuid: d9d960b4-9f66-43a2-9d90-4fb58d541adc
  */
-static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.159 uuid: cbf7f95a-6fe2-4578-898e-47afb8524be4 " __DATE__ ;
+static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.161 uuid: d9d960b4-9f66-43a2-9d90-4fb58d541adc " __DATE__ ;
 char *__interpBuildInfo = __buildInfo;
 
 
@@ -1916,7 +1916,7 @@
 	/* 575 */ (void (*)(void))0,
  0 };
 static void (*externalPrimitiveTable[MaxExternalPrimitiveTableSize + 1 /* 4097 */])(void);
-const char *interpreterVersion = "Newspeak Virtual Machine CoInterpreter_VMMaker.oscog-eem.159";
+const char *interpreterVersion = "Newspeak Virtual Machine CoInterpreter_VMMaker.oscog-eem.161";
 sqInt minBackwardJumpCountForCompile = MinBackwardJumpCountForCompile /* 10 */;
 volatile int sendTrace;
 
@@ -22497,7 +22497,7 @@
 
 /*	This is a helper for primitiveObjectPointsTo so it *does not* check the
 	frameContext field because that is an implicit self-reference not present
-	in the stale .
+	in the state .
  */
 
 static sqInt

Modified: branches/Cog/nscogsrc/vm/gcc3x-cointerp.c
===================================================================
--- branches/Cog/nscogsrc/vm/gcc3x-cointerp.c	2012-05-30 18:38:08 UTC (rev 2555)
+++ branches/Cog/nscogsrc/vm/gcc3x-cointerp.c	2012-06-07 19:29:52 UTC (rev 2556)
@@ -2,11 +2,11 @@
 
 
 /* Automatically generated by
-	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.159 uuid: cbf7f95a-6fe2-4578-898e-47afb8524be4
+	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.161 uuid: d9d960b4-9f66-43a2-9d90-4fb58d541adc
    from
-	CoInterpreter VMMaker.oscog-eem.159 uuid: cbf7f95a-6fe2-4578-898e-47afb8524be4
+	CoInterpreter VMMaker.oscog-eem.161 uuid: d9d960b4-9f66-43a2-9d90-4fb58d541adc
  */
-static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.159 uuid: cbf7f95a-6fe2-4578-898e-47afb8524be4 " __DATE__ ;
+static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.161 uuid: d9d960b4-9f66-43a2-9d90-4fb58d541adc " __DATE__ ;
 char *__interpBuildInfo = __buildInfo;
 
 
@@ -1919,7 +1919,7 @@
 	/* 575 */ (void (*)(void))0,
  0 };
 static void (*externalPrimitiveTable[MaxExternalPrimitiveTableSize + 1 /* 4097 */])(void);
-const char *interpreterVersion = "Newspeak Virtual Machine CoInterpreter_VMMaker.oscog-eem.159";
+const char *interpreterVersion = "Newspeak Virtual Machine CoInterpreter_VMMaker.oscog-eem.161";
 sqInt minBackwardJumpCountForCompile = MinBackwardJumpCountForCompile /* 10 */;
 volatile int sendTrace;
 
@@ -22501,7 +22501,7 @@
 
 /*	This is a helper for primitiveObjectPointsTo so it *does not* check the
 	frameContext field because that is an implicit self-reference not present
-	in the stale .
+	in the state .
  */
 
 static sqInt


Property changes on: branches/Cog/platforms/Cross/vm/sqSCCSVersion.h
___________________________________________________________________
Modified: checkindate
   - Wed May  2 16:06:54 PDT 2012
   + Thu Jun  7 12:25:51 PDT 2012

Modified: branches/Cog/platforms/unix/plugins/SocketPlugin/sqUnixSocket.c
===================================================================
--- branches/Cog/platforms/unix/plugins/SocketPlugin/sqUnixSocket.c	2012-05-30 18:38:08 UTC (rev 2555)
+++ branches/Cog/platforms/unix/plugins/SocketPlugin/sqUnixSocket.c	2012-06-07 19:29:52 UTC (rev 2556)
@@ -1,17 +1,17 @@
 /* sqUnixSocket.c -- Unix socket support
  * 
- *   Copyright (C) 1996-2006 by Ian Piumarta and other authors/contributors
+ *   Copyright (C) 1996-2007 by Ian Piumarta and other authors/contributors
  *                              listed elsewhere in this file.
  *   All rights reserved.
  *   
  *   This file is part of Unix Squeak.
  * 
- *   Permission is hereby granted, free of charge, to any person obtaining a
- *   copy of this software and associated documentation files (the "Software"),
- *   to deal in the Software without restriction, including without limitation
- *   the rights to use, copy, modify, merge, publish, distribute, sublicense,
- *   and/or sell copies of the Software, and to permit persons to whom the
- *   Software is furnished to do so, subject to the following conditions:
+ *   Permission is hereby granted, free of charge, to any person obtaining a copy
+ *   of this software and associated documentation files (the "Software"), to deal
+ *   in the Software without restriction, including without limitation the rights
+ *   to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ *   copies of the Software, and to permit persons to whom the Software is
+ *   furnished to do so, subject to the following conditions:
  * 
  *   The above copyright notice and this permission notice shall be included in
  *   all copies or substantial portions of the Software.
@@ -20,9 +20,9 @@
  *   IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  *   FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  *   AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- *   LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- *   FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- *   DEALINGS IN THE SOFTWARE.
+ *   LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ *   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ *   SOFTWARE.
  */
 
 /* Author: Ian.Piumarta at inria.fr
@@ -73,7 +73,9 @@
 #   include <time.h>
 # endif
 # include <sys/param.h>
+# include <sys/stat.h>
 # include <sys/socket.h>
+# include <sys/un.h>
 # include <netinet/in.h>
 # include <netinet/udp.h>
 # include <netinet/tcp.h>
@@ -104,7 +106,7 @@
     };
 # else /* !ACORN */
     extern int aioLastTick, aioThisTick;
-#   define FPRINTF(X) { aioThisTick= ioMSecs();  fprintf(stderr, "%8d %8d ", aioThisTick, aioThisTick - aioLastTick);  aioLastTick= aioThisTick;  fprintf X; }
+#   define FPRINTF(X) { aioThisTick= ioLowResMSecs();  fprintf(stderr, "%8d %8d ", aioThisTick, aioThisTick - aioLastTick);  aioLastTick= aioThisTick;  fprintf X; }
 # endif
 #else /* !DEBUG */
 # define FPRINTF(X)
@@ -117,6 +119,7 @@
 #define UDPSocketType	 	1
 #define RAWSocketType		2
 
+
 /*** Resolver states ***/
 
 #define ResolverUninitialised	0
@@ -142,6 +145,14 @@
 static char   localHostName[MAXHOSTNAMELEN];
 static u_long localHostAddress;	/* GROSS IPv4 ASSUMPTION! */
 
+union sockaddr_any
+{
+  struct sockaddr	sa;
+  struct sockaddr_un	saun;
+  struct sockaddr_in	sin;
+  struct sockaddr_in6	sin6;
+};
+
 typedef struct privateSocketStruct
 {
   int s;			/* Unix socket */
@@ -150,7 +161,10 @@
   int writeSema;		/* write io notification semaphore */
   int sockState;		/* connection + data state */
   int sockError;		/* errno after socket error */
-  struct sockaddr_in peer;	/* default send/recv address for UDP */
+  union sockaddr_any peer;	/* default send/recv address for UDP */
+  socklen_t peerSize;		/* dynamic sizeof(peer) */
+  union sockaddr_any sender;	/* sender address for last UDP receive */
+  socklen_t senderSize;		/* dynamic sizeof(sender) */
   int multiListen;		/* whether to listen for multiple connections */
   int acceptedSock;		/* a connection that has been accepted */
 } privateSocketStruct;
@@ -178,10 +192,11 @@
 #define _PSP(S)		(((S)->privateSocketPtr))
 #define PSP(S)		((privateSocketStruct *)((S)->privateSocketPtr))
 
-#define SOCKET(S)	(PSP(S)->s)
-#define SOCKETSTATE(S)	(PSP(S)->sockState)
-#define SOCKETERROR(S)	(PSP(S)->sockError)
-#define SOCKETPEER(S)	(PSP(S)->peer)
+#define SOCKET(S)		(PSP(S)->s)
+#define SOCKETSTATE(S)		(PSP(S)->sockState)
+#define SOCKETERROR(S)		(PSP(S)->sockError)
+#define SOCKETPEER(S)		(PSP(S)->peer)
+#define SOCKETPEERSIZE(S)	(PSP(S)->peerSize)
 
 
 /*** Resolver state ***/
@@ -504,26 +519,34 @@
 
 /* create a new socket */
 
-void sqSocketCreateNetTypeSocketTypeRecvBytesSendBytesSemaID(SocketPtr s, sqInt netType, sqInt socketType, sqInt recvBufSize, sqInt sendBufSize, sqInt semaIndex)
+void sqSocketCreateNetTypeSocketTypeRecvBytesSendBytesSemaID(SocketPtr s, sqInt domain, sqInt socketType, sqInt recvBufSize, sqInt sendBufSize, sqInt semaIndex)
 {
-  sqSocketCreateNetTypeSocketTypeRecvBytesSendBytesSemaIDReadSemaIDWriteSemaID(s, netType, socketType,recvBufSize, sendBufSize, semaIndex, semaIndex, semaIndex);
+  sqSocketCreateNetTypeSocketTypeRecvBytesSendBytesSemaIDReadSemaIDWriteSemaID(s, domain, socketType,recvBufSize, sendBufSize, semaIndex, semaIndex, semaIndex);
 }
 
-void sqSocketCreateNetTypeSocketTypeRecvBytesSendBytesSemaIDReadSemaIDWriteSemaID(SocketPtr s, sqInt netType, sqInt socketType, sqInt recvBufSize, sqInt sendBufSize, sqInt semaIndex, sqInt readSemaIndex, sqInt writeSemaIndex)
+void sqSocketCreateNetTypeSocketTypeRecvBytesSendBytesSemaIDReadSemaIDWriteSemaID(SocketPtr s, sqInt domain, sqInt socketType, sqInt recvBufSize, sqInt sendBufSize, sqInt semaIndex, sqInt readSemaIndex, sqInt writeSemaIndex)
 {
   int newSocket= -1;
   privateSocketStruct *pss;
 
+  switch (domain)
+    {
+    case 0:	domain= AF_INET;	break;	/* SQ_SOCKET_DOMAIN_UNSPECIFIED */
+    case 1:	domain= AF_UNIX;	break;	/* SQ_SOCKET_DOMAIN_LOCAL */
+    case 2:	domain= AF_INET;	break;	/* SQ_SOCKET_DOMAIN_INET4 */
+    case 3:	domain= AF_INET6;	break;	/* SQ_SOCKET_DOMAIN_INET6 */
+    }
+
   s->sessionID= 0;
   if (TCPSocketType == socketType)
     {
       /* --- TCP --- */
-      newSocket= socket(AF_INET, SOCK_STREAM, 0);
+      newSocket= socket(domain, SOCK_STREAM, 0);
     }
   else if (UDPSocketType == socketType)
     {
       /* --- UDP --- */
-      newSocket= socket(AF_INET, SOCK_DGRAM, 0);
+      newSocket= socket(domain, SOCK_DGRAM, 0);
     }
   if (-1 == newSocket)
     {
@@ -558,9 +581,9 @@
   pss->sockError= 0;
   /* initial UDP peer := wildcard */
   memset(&pss->peer, 0, sizeof(pss->peer));
-  pss->peer.sin_family= AF_INET;
-  pss->peer.sin_port= 0;
-  pss->peer.sin_addr.s_addr= INADDR_ANY;
+  pss->peer.sin.sin_family= AF_INET;
+  pss->peer.sin.sin_port= 0;
+  pss->peer.sin.sin_addr.s_addr= INADDR_ANY;
   /* Squeak socket */
   s->sessionID= thisNetSession;
   s->socketType= socketType;
@@ -569,7 +592,7 @@
   /* Note: socket is in BLOCKING mode until aioEnable is called for it! */
 }
 
-void sqSocketCreateRawProtoTypeRecvBytesSendBytesSemaIDReadSemaIDWriteSemaID(SocketPtr s, sqInt netType, sqInt protocol, sqInt recvBufSize, sqInt sendBufSize, sqInt semaIndex, sqInt readSemaIndex, sqInt writeSemaIndex)
+void sqSocketCreateRawProtoTypeRecvBytesSendBytesSemaIDReadSemaIDWriteSemaID(SocketPtr s, sqInt domain, sqInt protocol, sqInt recvBufSize, sqInt sendBufSize, sqInt semaIndex, sqInt readSemaIndex, sqInt writeSemaIndex)
 {
   int newSocket= -1;
   privateSocketStruct *pss;
@@ -605,9 +628,9 @@
   pss->sockError= 0;
   /* initial UDP peer := wildcard */
   memset(&pss->peer, 0, sizeof(pss->peer));
-  pss->peer.sin_family= AF_INET;
-  pss->peer.sin_port= 0;
-  pss->peer.sin_addr.s_addr= INADDR_ANY;
+  pss->peer.sin.sin_family= AF_INET;
+  pss->peer.sin.sin_port= 0;
+  pss->peer.sin.sin_addr.s_addr= INADDR_ANY;
   /* Squeak socket */
   s->sessionID= thisNetSession;
   s->socketType= RAWSocketType;
@@ -718,7 +741,8 @@
       /* --- UDP/RAW --- */
       if (SOCKET(s) >= 0)
 	{
-	  memcpy((void *)&SOCKETPEER(s), (void *)&saddr, sizeof(SOCKETPEER(s)));
+	  memcpy((void *)&SOCKETPEER(s), (void *)&saddr, sizeof(saddr));
+	  SOCKETPEERSIZE(s)= sizeof(struct sockaddr_in);
 	  SOCKETSTATE(s)= Connected;
 	}
     }
@@ -931,7 +955,7 @@
       return ntohl(saddr.sin_addr.s_addr);
     }
   /* --- UDP/RAW --- */
-  return ntohl(SOCKETPEER(s).sin_addr.s_addr);
+  return ntohl(SOCKETPEER(s).sin.sin_addr.s_addr);
 }
 
 
@@ -969,7 +993,7 @@
       return ntohs(saddr.sin_port);
     }
   /* --- UDP/RAW --- */
-  return ntohs(SOCKETPEER(s).sin_port);
+  return ntohs(SOCKETPEER(s).sin.sin_port);
 }
 
 
@@ -1033,6 +1057,9 @@
 
   if (!socketValid(s))
     return -1;
+
+  SOCKETPEERSIZE(s)= 0;
+
   if (TCPSocketType != s->socketType)
     {
       /* --- UDP/RAW --- */
@@ -1048,6 +1075,7 @@
 	  FPRINTF((stderr, "UDP receiveData(%d) < 1 [a:%d]\n", SOCKET(s), errno));
 	  return 0;
 	}
+      SOCKETPEERSIZE(s)= addrSize;
     }
   else
     {
@@ -1129,7 +1157,7 @@
 */ 
 sqInt sqSocketReceiveUDPDataBufCountaddressportmoreFlag(SocketPtr s, char *buf, sqInt bufSize,  sqInt *address,  sqInt *port, sqInt *moreFlag)
 {
-  if (socketValid(s) && (TCPSocketType != s->socketType))
+  if (socketValid(s) && (TCPSocketType != s->socketType)) /* --- UDP/RAW --- */
     {
       struct sockaddr_in saddr;
       socklen_t addrSize= sizeof(saddr);
@@ -1403,6 +1431,7 @@
     {
       PSP(s)->sockError= errno;
       interpreterProxy->success(false);
+      return;
     }
 }
 
@@ -1431,9 +1460,9 @@
 
 sqInt sqResolverStatus(void)
 {
-  if(!thisNetSession)
+  if (!thisNetSession)
     return ResolverUninitialised;
-  if(lastError != 0)
+  if (lastError != 0)
     return ResolverError;
   return ResolverSuccess;
 }
@@ -1467,3 +1496,703 @@
   /* we're done before we even started */
   interpreterProxy->signalSemaphoreWithIndex(resolverSema);
 }
+
+
+/* ikp 2007-06-07: Generalised primitives for IPv6, &c. */
+
+/* flags */
+
+#define SQ_SOCKET_NUMERIC		(1<<0)
+#define SQ_SOCKET_PASSIVE		(1<<1)
+
+/* family */
+
+#define SQ_SOCKET_FAMILY_UNSPECIFIED	0
+#define SQ_SOCKET_FAMILY_LOCAL		1
+#define SQ_SOCKET_FAMILY_INET4		2
+#define SQ_SOCKET_FAMILY_INET6		3
+#define SQ_SOCKET_FAMILY_MAX		4
+
+/* type */
+
+#define SQ_SOCKET_TYPE_UNSPECIFIED	0
+#define SQ_SOCKET_TYPE_STREAM		1
+#define SQ_SOCKET_TYPE_DGRAM		2
+#define SQ_SOCKET_TYPE_MAX		3
+
+/* protocol */
+
+#define SQ_SOCKET_PROTOCOL_UNSPECIFIED	0
+#define SQ_SOCKET_PROTOCOL_TCP		1
+#define SQ_SOCKET_PROTOCOL_UDP		2
+#define SQ_SOCKET_PROTOCOL_MAX		3
+
+void  sqResolverGetAddressInfoHostSizeServiceSizeFlagsFamilyTypeProtocol(char *hostName, sqInt hostSize, char *servName, sqInt servSize,
+									 sqInt flags, sqInt family, sqInt type, sqInt protocol);
+sqInt sqResolverGetAddressInfoSize(void);
+void  sqResolverGetAddressInfoResultSize(char *addr, sqInt addrSize);
+sqInt sqResolverGetAddressInfoFamily(void);
+sqInt sqResolverGetAddressInfoType(void);
+sqInt sqResolverGetAddressInfoProtocol(void);
+sqInt sqResolverGetAddressInfoNext(void);
+
+sqInt sqSocketAddressSizeGetPort(char *addr, sqInt addrSize);
+void  sqSocketAddressSizeSetPort(char *addr, sqInt addrSize, sqInt port);
+
+void  sqResolverGetNameInfoSizeFlags(char *addr, sqInt addrSize, sqInt flags);
+sqInt sqResolverGetNameInfoHostSize(void);
+void  sqResolverGetNameInfoHostResultSize(char *name, sqInt nameSize);
+sqInt sqResolverGetNameInfoServiceSize(void);
+void  sqResolverGetNameInfoServiceResultSize(char *name, sqInt nameSize);
+
+sqInt sqResolverHostNameSize(void);
+void  sqResolverHostNameResultSize(char *name, sqInt nameSize);
+
+void  sqSocketBindToAddressSize(SocketPtr s, char *addr, sqInt addrSize);
+void  sqSocketListenBacklog(SocketPtr s, sqInt backlogSize);
+void  sqSocketConnectToAddressSize(SocketPtr s, char *addr, sqInt addrSize);
+
+sqInt sqSocketLocalAddressSize(SocketPtr s);
+void  sqSocketLocalAddressResultSize(SocketPtr s, char *addr, int addrSize);
+sqInt sqSocketRemoteAddressSize(SocketPtr s);
+void  sqSocketRemoteAddressResultSize(SocketPtr s, char *addr, int addrSize);
+
+sqInt sqSocketSendUDPToSizeDataBufCount(SocketPtr s, char *addr, sqInt addrSize, char *buf, sqInt bufSize);
+sqInt sqSocketReceiveUDPDataBufCount(SocketPtr s, char *buf, sqInt bufSize);
+
+
+/* ---- address and service lookup ---- */
+
+
+static struct addrinfo *addrList= 0;
+static struct addrinfo *addrInfo= 0;
+static struct addrinfo *localInfo= 0;
+
+
+void sqResolverGetAddressInfoHostSizeServiceSizeFlagsFamilyTypeProtocol(char *hostName, sqInt hostSize, char *servName, sqInt servSize,
+									sqInt flags, sqInt family, sqInt type, sqInt protocol)
+{
+  char host[MAXHOSTNAMELEN+1], serv[MAXHOSTNAMELEN+1];
+  struct addrinfo request;
+  int gaiError= 0;
+
+  FPRINTF((stderr, "GetAddressInfo %d %d %d %d %d %d\n", hostSize, servSize, flags, family, type, protocol));
+
+  if (addrList)
+    {
+      freeaddrinfo(addrList);
+      addrList= addrInfo= 0;
+    }
+
+  if (localInfo)
+    {
+      free(localInfo->ai_addr);
+      free(localInfo);
+      localInfo= addrInfo= 0;
+    }
+
+  if ((!thisNetSession)
+      || (hostSize < 0) || (hostSize > MAXHOSTNAMELEN)
+      || (servSize < 0) || (servSize > MAXHOSTNAMELEN)
+      || (family   < 0) || (family   >= SQ_SOCKET_FAMILY_MAX)
+      || (type     < 0) || (type     >= SQ_SOCKET_TYPE_MAX)
+      || (protocol < 0) || (protocol >= SQ_SOCKET_PROTOCOL_MAX))
+    goto fail;
+
+  if (hostSize)
+    memcpy(host, hostName, hostSize);
+  host[hostSize]= '\0';
+
+  if (servSize)
+    memcpy(serv, servName, servSize);
+  serv[servSize]= '\0';
+
+  FPRINTF((stderr, "  -> GetAddressInfo %s %s\n", host, serv));
+
+  if (servSize && (family == SQ_SOCKET_FAMILY_LOCAL) && (servSize < (int)sizeof(((struct sockaddr_un *)0)->sun_path)) && !(flags & SQ_SOCKET_NUMERIC))
+    {
+      struct stat st;
+      if ((0 == stat(servName, &st)) && (st.st_mode & S_IFSOCK))
+	{
+	  struct sockaddr_un *saun= calloc(1, sizeof(struct sockaddr_un));
+	  localInfo= (struct addrinfo *)calloc(1, sizeof(struct addrinfo));
+	  localInfo->ai_family= AF_UNIX;
+	  localInfo->ai_socktype= SOCK_STREAM;
+	  localInfo->ai_addrlen= sizeof(struct sockaddr_un);
+	  localInfo->ai_addr= (struct sockaddr *)saun;
+	  /*saun->sun_len= sizeof(struct sockaddr_un);*/
+	  saun->sun_family= AF_UNIX;
+	  memcpy(saun->sun_path, servName, servSize);
+	  saun->sun_path[servSize]= '\0';
+	  addrInfo= localInfo;
+	  interpreterProxy->signalSemaphoreWithIndex(resolverSema);
+	  return;
+	}
+    }
+
+  memset(&request, 0, sizeof(request));
+
+  if (flags & SQ_SOCKET_NUMERIC)	request.ai_flags |= AI_NUMERICHOST;
+  if (flags & SQ_SOCKET_PASSIVE)	request.ai_flags |= AI_PASSIVE;
+
+  switch (family)
+    {
+    case SQ_SOCKET_FAMILY_LOCAL:	request.ai_family= AF_UNIX;		break;
+    case SQ_SOCKET_FAMILY_INET4:	request.ai_family= AF_INET;		break;
+    case SQ_SOCKET_FAMILY_INET6:	request.ai_family= AF_INET6;		break;
+    }
+
+  switch (type)
+    {
+    case SQ_SOCKET_TYPE_STREAM:		request.ai_socktype= SOCK_STREAM;	break;
+    case SQ_SOCKET_TYPE_DGRAM:		request.ai_socktype= SOCK_DGRAM;	break;
+    }
+
+  switch (protocol)
+    {
+    case SQ_SOCKET_PROTOCOL_TCP:	request.ai_protocol= IPPROTO_TCP;	break;
+    case SQ_SOCKET_PROTOCOL_UDP:	request.ai_protocol= IPPROTO_UDP;	break;
+    }
+
+  gaiError= getaddrinfo(hostSize ? host : 0, servSize ? serv : 0, &request, &addrList);
+
+  if (gaiError)
+    {
+      /* Linux gives you either <netdb.h> with   correct NI_* bit definitions and no  EAI_* definitions at all
+	 or                <bind/netdb.h> with incorrect NI_* bit definitions and the EAI_* definitions we need.
+	 We cannot distinguish between impossible constraints and genuine lookup failure, so err conservatively. */
+#    if defined(EAI_BADHINTS)
+      if (EAI_BADHINTS != gaiError)
+	{
+	  fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(gaiError));
+	  lastError= gaiError;
+	  goto fail;
+	}
+#    else
+      fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(gaiError));
+#    endif
+      addrList= 0;	/* succeed with zero results for impossible constraints */
+    }
+
+  addrInfo= addrList;
+  interpreterProxy->signalSemaphoreWithIndex(resolverSema);
+  return;
+
+ fail:
+  interpreterProxy->success(false);
+  return;
+}
+
+
+struct addressHeader
+{
+  int	sessionID;
+  int	size;
+};
+
+#define AddressHeaderSize	sizeof(struct addressHeader)
+
+#define addressHeader(A)	((struct addressHeader *)(A))
+#define socketAddress(A)	((struct sockaddr *)((char *)(A) + AddressHeaderSize))
+
+#define addressValid(A, S)	(thisNetSession && (thisNetSession == addressHeader(A)->sessionID) && (addressHeader(A)->size == (int)((S) - AddressHeaderSize)))
+#define addressSize(A)		(addressHeader(A)->size)
+
+
+#if 0
+static void dumpAddr(struct sockaddr *addr, int addrSize)
+{
+  int i;
+  for (i= 0;  i < addrSize;  ++i)
+    fprintf(stderr, "%02x ", ((unsigned char *)addr)[i]);
+  fprintf(stderr, " ");
+  switch (addr->sa_family)
+    {
+    case AF_UNIX:	fprintf(stderr, "local\n"); break;
+    case AF_INET:	fprintf(stderr, "inet\n"); break;
+    case AF_INET6:	fprintf(stderr, "inet6\n"); break;
+    default:		fprintf(stderr, "?\n"); break;
+    }
+}
+#endif
+
+sqInt sqResolverGetAddressInfoSize(void)
+{
+  if (!addrInfo)
+    return -1;
+  return AddressHeaderSize + addrInfo->ai_addrlen;
+}
+
+
+void sqResolverGetAddressInfoResultSize(char *addr, sqInt addrSize)
+{
+  if ((!addrInfo) || (addrSize < (int)(AddressHeaderSize + addrInfo->ai_addrlen)))
+    {
+      interpreterProxy->success(false);
+      return;
+    }
+
+  addressHeader(addr)->sessionID= thisNetSession;
+  addressHeader(addr)->size=      addrInfo->ai_addrlen;
+  memcpy(socketAddress(addr), addrInfo->ai_addr, addrInfo->ai_addrlen);
+  /*dumpAddr(socketAddress(addr), addrSize - AddressHeaderSize);*/
+}
+
+
+sqInt sqResolverGetAddressInfoFamily(void)
+{
+  if (!addrInfo)
+    {
+      interpreterProxy->success(false);
+      return 0;
+    }
+
+  switch (addrInfo->ai_family)
+    {
+    case AF_UNIX:	return SQ_SOCKET_FAMILY_LOCAL;
+    case AF_INET:	return SQ_SOCKET_FAMILY_INET4;
+    case AF_INET6:	return SQ_SOCKET_FAMILY_INET6;
+    }
+
+  return SQ_SOCKET_FAMILY_UNSPECIFIED;
+}
+
+
+sqInt sqResolverGetAddressInfoType(void)
+{
+  if (!addrInfo)
+    {
+      interpreterProxy->success(false);
+      return 0;
+    }
+
+  switch (addrInfo->ai_socktype)
+    {
+    case SOCK_STREAM:	return SQ_SOCKET_TYPE_STREAM;
+    case SOCK_DGRAM:	return SQ_SOCKET_TYPE_DGRAM;
+    }
+
+  return SQ_SOCKET_TYPE_UNSPECIFIED;
+}
+
+
+sqInt sqResolverGetAddressInfoProtocol(void)
+{
+  if (!addrInfo)
+    {
+      interpreterProxy->success(false);
+      return 0;
+    }
+
+  switch (addrInfo->ai_protocol)
+    {
+    case IPPROTO_TCP:	return SQ_SOCKET_PROTOCOL_TCP;
+    case IPPROTO_UDP:	return SQ_SOCKET_PROTOCOL_UDP;
+    }
+
+ return SQ_SOCKET_PROTOCOL_UNSPECIFIED;
+}
+
+
+sqInt sqResolverGetAddressInfoNext(void)
+{
+  return (addrInfo && (addrInfo= addrInfo->ai_next)) ? true : false;
+}
+
+
+/* ---- address manipulation ---- */
+
+
+sqInt sqSocketAddressSizeGetPort(char *addr, sqInt addrSize)
+{
+  if (addressValid(addr, addrSize))
+    switch (socketAddress(addr)->sa_family)
+      {
+      case AF_INET:	return ntohs(((struct sockaddr_in  *)socketAddress(addr))->sin_port);
+      case AF_INET6:	return ntohs(((struct sockaddr_in6 *)socketAddress(addr))->sin6_port);
+      }
+
+  interpreterProxy->success(false);
+  return 0;
+}
+
+
+void sqSocketAddressSizeSetPort(char *addr, sqInt addrSize, sqInt port)
+{
+  if (addressValid(addr, addrSize))
+    switch (socketAddress(addr)->sa_family)
+      {
+      case AF_INET:	((struct sockaddr_in  *)socketAddress(addr))->sin_port= htons(port);	return;
+      case AF_INET6:	((struct sockaddr_in6 *)socketAddress(addr))->sin6_port= htons(port);	return;
+      }
+
+  interpreterProxy->success(false);
+}
+
+
+/* ---- host name lookup ---- */
+
+
+static char hostNameInfo[MAXHOSTNAMELEN+1];
+static char servNameInfo[MAXHOSTNAMELEN+1];
+
+static int nameInfoValid= 0;
+
+
+void sqResolverGetNameInfoSizeFlags(char *addr, sqInt addrSize, sqInt flags)
+{
+  int niFlags= 0;
+  int gaiError= 0;
+
+  FPRINTF((stderr, "GetNameInfoSizeFlags %p %d %d\n", addr, addrSize, flags));
+
+  nameInfoValid= 0;
+
+  if (!addressValid(addr, addrSize))
+    goto fail;
+
+  niFlags |= NI_NOFQDN;
+
+  if (flags & SQ_SOCKET_NUMERIC) niFlags |= (NI_NUMERICHOST | NI_NUMERICSERV);
+
+  /*dumpAddr(socketAddress(addr), addrSize - AddressHeaderSize);  fprintf(stderr, "%02x\n", niFlags);*/
+
+  gaiError= getnameinfo(socketAddress(addr), addrSize - AddressHeaderSize,
+			hostNameInfo, sizeof(hostNameInfo),
+			servNameInfo, sizeof(servNameInfo),
+			niFlags);
+
+  if (gaiError)
+    {
+      fprintf(stderr, "getnameinfo: %s\n", gai_strerror(gaiError));
+      lastError= gaiError;
+      goto fail;
+    }
+
+  nameInfoValid= 1;
+  interpreterProxy->signalSemaphoreWithIndex(resolverSema);
+  return;
+
+ fail:
+  interpreterProxy->success(false);
+}
+
+
+sqInt sqResolverGetNameInfoHostSize(void)
+{
+  if (!nameInfoValid)
+    {
+      interpreterProxy->success(false);
+      return 0;
+    }
+  return strlen(hostNameInfo);
+}
+
+
+void sqResolverGetNameInfoHostResultSize(char *name, sqInt nameSize)
+{
+  int len;
+
+  if (!nameInfoValid)
+    goto fail;
+
+  len= strlen(hostNameInfo);
+  if (nameSize < len)
+    goto fail;
+
+  memcpy(name, hostNameInfo, len);
+  return;
+
+ fail:
+  interpreterProxy->success(false);
+}
+
+
+sqInt sqResolverGetNameInfoServiceSize(void)
+{
+  if (!nameInfoValid)
+    {
+      interpreterProxy->success(false);
+      return 0;
+    }
+  return strlen(servNameInfo);
+}
+
+
+void sqResolverGetNameInfoServiceResultSize(char *name, sqInt nameSize)
+{
+  int len;
+
+  if (!nameInfoValid)
+    goto fail;
+
+  len= strlen(servNameInfo);
+  if (nameSize < len)
+    goto fail;
+
+  memcpy(name, servNameInfo, len);
+  return;
+
+ fail:
+  interpreterProxy->success(false);
+}
+
+
+sqInt sqResolverHostNameSize(void)
+{
+  char buf[MAXHOSTNAMELEN+1];
+  if (gethostname(buf, sizeof(buf)))
+    {
+      interpreterProxy->success(false);
+      return 0;
+    }
+  return strlen(buf);
+}
+
+
+void sqResolverHostNameResultSize(char *name, sqInt nameSize)
+{
+  char buf[MAXHOSTNAMELEN+1];
+  int len;
+  if (gethostname(buf, sizeof(buf)) || (nameSize < (len= strlen(buf))))
+    {
+      interpreterProxy->success(false);
+      return;
+    }
+  memcpy(name, buf, len);
+}
+
+
+/* ---- circuit setup ---- */
+
+
+void sqSocketBindToAddressSize(SocketPtr s, char *addr, sqInt addrSize)
+{
+  privateSocketStruct *pss= PSP(s);
+
+  if (!(socketValid(s) && addressValid(addr, addrSize)))
+    goto fail;
+
+  if (bind(SOCKET(s), socketAddress(addr), addressSize(addr)) == 0)
+    return;
+
+  pss->sockError= errno;
+
+ fail:
+  interpreterProxy->success(false);
+}
+
+
+void sqSocketListenBacklog(SocketPtr s, sqInt backlogSize)
+{
+  if (!socketValid(s))
+    goto fail;
+
+  if ((backlogSize > 1) && (s->socketType != TCPSocketType))
+    goto fail;
+
+  PSP(s)->multiListen= (backlogSize > 1);
+
+  FPRINTF((stderr, "listenBacklog(%d, %d)\n", SOCKET(s), backlogSize));
+
+  if (TCPSocketType == s->socketType)
+    {
+      listen(SOCKET(s), backlogSize);	/* acceptHandler catches errors */
+      SOCKETSTATE(s)= WaitingForConnection;
+      aioEnable(SOCKET(s), PSP(s), 0);
+      aioHandle(SOCKET(s), acceptHandler, AIO_RX); /* R => accept() */
+    }
+
+  return;
+
+ fail:
+  interpreterProxy->success(false);
+  return;
+}
+
+
+void sqSocketConnectToAddressSize(SocketPtr s, char *addr, sqInt addrSize)
+{
+  /* TCP => open a connection.
+   * UDP => set remote address.
+   */
+  if (!(socketValid(s) && addressValid(addr, addrSize)))
+    {
+      interpreterProxy->success(false);
+      return;
+    }
+
+  FPRINTF((stderr, "connectToAddressSize(%d)\n", SOCKET(s)));
+
+  if (TCPSocketType != s->socketType)	/* --- UDP/RAW --- */
+    {
+      if (SOCKET(s) >= 0)
+	{
+	  memcpy((void *)&SOCKETPEER(s), socketAddress(addr), addressSize(addr));
+	  SOCKETPEERSIZE(s)= addressSize(addr);
+	  SOCKETSTATE(s)= Connected;
+	}
+    }
+  else					/* --- TCP --- */
+    {
+      int result;
+      aioEnable(SOCKET(s), PSP(s), 0);
+      result= connect(SOCKET(s), socketAddress(addr), addressSize(addr));
+      FPRINTF((stderr, "connect() => %d\n", result));
+      if (result == 0)
+	{
+	  /* connection completed synchronously */
+	  SOCKETSTATE(s)= Connected;
+	  notify(PSP(s), CONN_NOTIFY);
+	  setLinger(SOCKET(s), 1);
+	}
+      else
+	{
+	  if (errno == EINPROGRESS || errno == EWOULDBLOCK)
+	    {
+	      /* asynchronous connection in progress */
+	      SOCKETSTATE(s)= WaitingForConnection;
+	      aioHandle(SOCKET(s), connectHandler, AIO_WX);  /* W => connect() */
+	    }
+	  else
+	    {
+	      /* connection error */
+	      perror("sqConnectToAddressSize");
+	      SOCKETSTATE(s)= Unconnected;
+	      SOCKETERROR(s)= errno;
+	      notify(PSP(s), CONN_NOTIFY);
+	    }
+	}
+    }
+}
+
+
+sqInt sqSocketLocalAddressSize(SocketPtr s)
+{
+  union sockaddr_any saddr;
+  socklen_t saddrSize= sizeof(saddr);
+
+  if (!socketValid(s))
+    return -1;
+
+  if (getsockname(SOCKET(s), &saddr.sa, &saddrSize))
+    return 0;
+
+  return AddressHeaderSize + saddrSize;
+}
+
+
+void sqSocketLocalAddressResultSize(SocketPtr s, char *addr, int addrSize)
+{
+  union sockaddr_any saddr;
+  socklen_t saddrSize= sizeof(saddr);
+
+  if (!socketValid(s))
+    goto fail;
+
+  if (getsockname(SOCKET(s), &saddr.sa, &saddrSize))
+    goto fail;
+
+  if (addrSize != (int)(AddressHeaderSize + saddrSize))
+    goto fail;
+
+  addressHeader(addr)->sessionID= thisNetSession;
+  addressHeader(addr)->size=      saddrSize;
+  memcpy(socketAddress(addr), &saddr.sa, saddrSize);
+  return;
+
+ fail:
+  interpreterProxy->success(false);
+  return;
+}
+
+
+sqInt sqSocketRemoteAddressSize(SocketPtr s)
+{
+  union sockaddr_any saddr;
+  socklen_t saddrSize= sizeof(saddr);
+
+  if (!socketValid(s))
+    return -1;
+
+  if (TCPSocketType == s->socketType)		/* --- TCP --- */
+    {
+      if (0 == getpeername(SOCKET(s), &saddr.sa, &saddrSize))
+	{
+	  if (saddrSize < sizeof(SOCKETPEER(s)))
+	    {
+	      memcpy(&SOCKETPEER(s), &saddr.sa, saddrSize);
+	      return AddressHeaderSize + (SOCKETPEERSIZE(s)= saddrSize);
+	    }
+	}
+    }
+  else if (SOCKETPEERSIZE(s))			/* --- UDP/RAW --- */
+    {
+      return AddressHeaderSize + SOCKETPEERSIZE(s);
+    }
+
+  return -1;
+}
+
+
+void sqSocketRemoteAddressResultSize(SocketPtr s, char *addr, int addrSize)
+{
+  if (!socketValid(s)
+   || !SOCKETPEERSIZE(s)
+   || (addrSize != (int)(AddressHeaderSize + SOCKETPEERSIZE(s)))) {
+    interpreterProxy->success(false);
+    return;
+  }
+
+  addressHeader(addr)->sessionID= thisNetSession;
+  addressHeader(addr)->size=      SOCKETPEERSIZE(s);
+  memcpy(socketAddress(addr), &SOCKETPEER(s), SOCKETPEERSIZE(s));
+  SOCKETPEERSIZE(s)= 0;
+}
+
+
+/* ---- communication ---- */
+
+
+sqInt sqSocketSendUDPToSizeDataBufCount(SocketPtr s, char *addr, sqInt addrSize, char *buf, sqInt bufSize)
+{
+  FPRINTF((stderr, "sendTo(%d)\n", SOCKET(s)));
+  if (socketValid(s) && addressValid(addr, addrSize) && (TCPSocketType != s->socketType)) /* --- UDP/RAW --- */
+    {
+      int nsent= sendto(SOCKET(s), buf, bufSize, 0, socketAddress(addr), addrSize - AddressHeaderSize);
+      if (nsent >= 0)
+	return nsent;
+	
+      if (errno == EWOULDBLOCK)	/* asynchronous write in progress */
+	return 0;
+
+      FPRINTF((stderr, "UDP send failed\n"));
+      SOCKETERROR(s)= errno;
+    }
+
+  interpreterProxy->success(false);
+  return 0;
+}
+
+
+sqInt sqSocketReceiveUDPDataBufCount(SocketPtr s, char *buf, sqInt bufSize)
+{
+  FPRINTF((stderr, "recvFrom(%d)\n", SOCKET(s)));
+  if (socketValid(s) && (TCPSocketType != s->socketType)) /* --- UDP/RAW --- */
+    {
+      socklen_t saddrSize= sizeof(SOCKETPEER(s));
+      int nread= recvfrom(SOCKET(s), buf, bufSize, 0, &SOCKETPEER(s).sa, &saddrSize);
+      if (nread >= 0)
+	{
+	  SOCKETPEERSIZE(s)= saddrSize;
+	  return nread;
+	}
+      SOCKETPEERSIZE(s)= 0;
+      if (errno == EWOULDBLOCK)	/* asynchronous read in progress */
+	return 0;
+      SOCKETERROR(s)= errno;
+      FPRINTF((stderr, "receiveData(%d)= %da\n", SOCKET(s), 0));
+    }
+  interpreterProxy->success(false);
+  return 0;
+}

Added: branches/Cog/processors/IA32/linuxbochs/bochsconfig.h
===================================================================
--- branches/Cog/processors/IA32/linuxbochs/bochsconfig.h	                        (rev 0)
+++ branches/Cog/processors/IA32/linuxbochs/bochsconfig.h	2012-06-07 19:29:52 UTC (rev 2556)
@@ -0,0 +1 @@
+link config.h
\ No newline at end of file


Property changes on: branches/Cog/processors/IA32/linuxbochs/bochsconfig.h
___________________________________________________________________
Added: svn:special
   + *

Modified: branches/Cog/src/plugins/SocketPlugin/SocketPlugin.c
===================================================================
--- branches/Cog/src/plugins/SocketPlugin/SocketPlugin.c	2012-05-30 18:38:08 UTC (rev 2555)
+++ branches/Cog/src/plugins/SocketPlugin/SocketPlugin.c	2012-06-07 19:29:52 UTC (rev 2556)
@@ -1,9 +1,9 @@
 /* Automatically generated by
-	SmartSyntaxPluginCodeGenerator VMMaker-oscog.40 uuid: 637db40c-33c6-4263-816e-1b8cc19e3c99
+	SmartSyntaxPluginCodeGenerator VMMaker.oscog-eem.161 uuid: d9d960b4-9f66-43a2-9d90-4fb58d541adc
    from
-	SocketPlugin VMMaker-oscog.40 uuid: 637db40c-33c6-4263-816e-1b8cc19e3c99
+	SocketPlugin VMMaker.oscog-eem.161 uuid: d9d960b4-9f66-43a2-9d90-4fb58d541adc
  */
-static char __buildInfo[] = "SocketPlugin VMMaker-oscog.40 uuid: 637db40c-33c6-4263-816e-1b8cc19e3c99 " __DATE__ ;
+static char __buildInfo[] = "SocketPlugin VMMaker.oscog-eem.161 uuid: d9d960b4-9f66-43a2-9d90-4fb58d541adc " __DATE__ ;
 
 
 
@@ -38,6 +38,8 @@
 
 
 /*** Constants ***/
+#define BytesPerWord 4
+#define MULTIPLEBYTECODESETS 0
 
 
 /*** Function Prototypes ***/
@@ -55,6 +57,20 @@
 EXPORT(sqInt) primitiveResolverAbortLookup(void);
 EXPORT(sqInt) primitiveResolverAddressLookupResult(void);
 EXPORT(sqInt) primitiveResolverError(void);
+EXPORT(sqInt) primitiveResolverGetAddressInfo(void);
+EXPORT(sqInt) primitiveResolverGetAddressInfoFamily(void);
+EXPORT(sqInt) primitiveResolverGetAddressInfoNext(void);
+EXPORT(sqInt) primitiveResolverGetAddressInfoProtocol(void);
+EXPORT(sqInt) primitiveResolverGetAddressInfoResult(void);
+EXPORT(sqInt) primitiveResolverGetAddressInfoSize(void);
+EXPORT(sqInt) primitiveResolverGetAddressInfoType(void);
+EXPORT(sqInt) primitiveResolverGetNameInfo(void);
+EXPORT(sqInt) primitiveResolverGetNameInfoHostResult(void);
+EXPORT(sqInt) primitiveResolverGetNameInfoHostSize(void);
+EXPORT(sqInt) primitiveResolverGetNameInfoServiceResult(void);
+EXPORT(sqInt) primitiveResolverGetNameInfoServiceSize(void);
+EXPORT(sqInt) primitiveResolverHostNameResult(void);
+EXPORT(sqInt) primitiveResolverHostNameSize(void);
 EXPORT(sqInt) primitiveResolverLocalAddress(void);
 EXPORT(sqInt) primitiveResolverNameLookupResult(void);
 EXPORT(sqInt) primitiveResolverStartAddressLookup(void);
@@ -63,9 +79,13 @@
 EXPORT(sqInt) primitiveSocketAbortConnection(void);
 EXPORT(sqInt) primitiveSocketAccept(void);
 EXPORT(sqInt) primitiveSocketAccept3Semaphores(void);
+EXPORT(sqInt) primitiveSocketAddressGetPort(void);
+EXPORT(sqInt) primitiveSocketAddressSetPort(void);
+EXPORT(sqInt) primitiveSocketBindTo(void);
 EXPORT(sqInt) primitiveSocketBindToPort(void);
 EXPORT(sqInt) primitiveSocketCloseConnection(void);
 EXPORT(sqInt) primitiveSocketConnectionStatus(void);
+EXPORT(sqInt) primitiveSocketConnectTo(void);
 EXPORT(sqInt) primitiveSocketConnectToPort(void);
 EXPORT(sqInt) primitiveSocketCreate(void);
 EXPORT(sqInt) primitiveSocketCreate3Semaphores(void);
@@ -76,13 +96,18 @@
 EXPORT(sqInt) primitiveSocketListenOnPort(void);
 EXPORT(sqInt) primitiveSocketListenOnPortBacklog(void);
 EXPORT(sqInt) primitiveSocketListenOnPortBacklogInterface(void);
+EXPORT(sqInt) primitiveSocketListenWithBacklog(void);
 EXPORT(sqInt) primitiveSocketListenWithOrWithoutBacklog(void);
 EXPORT(sqInt) primitiveSocketLocalAddress(void);
+EXPORT(sqInt) primitiveSocketLocalAddressResult(void);
+EXPORT(sqInt) primitiveSocketLocalAddressSize(void);
 EXPORT(sqInt) primitiveSocketLocalPort(void);
 EXPORT(sqInt) primitiveSocketReceiveDataAvailable(void);
 EXPORT(sqInt) primitiveSocketReceiveDataBufCount(void);
 EXPORT(sqInt) primitiveSocketReceiveUDPDataBufCount(void);
 EXPORT(sqInt) primitiveSocketRemoteAddress(void);
+EXPORT(sqInt) primitiveSocketRemoteAddressResult(void);
+EXPORT(sqInt) primitiveSocketRemoteAddressSize(void);
 EXPORT(sqInt) primitiveSocketRemotePort(void);
 EXPORT(sqInt) primitiveSocketSendDataBufCount(void);
 EXPORT(sqInt) primitiveSocketSendDone(void);
@@ -103,9 +128,9 @@
 struct VirtualMachine* interpreterProxy;
 static const char *moduleName =
 #ifdef SQUEAK_BUILTIN_PLUGIN
-	"SocketPlugin VMMaker-oscog.40 (i)"
+	"SocketPlugin VMMaker.oscog-eem.161 (i)"
 #else
-	"SocketPlugin VMMaker-oscog.40 (e)"
+	"SocketPlugin VMMaker.oscog-eem.161 (e)"
 #endif
 ;
 static void * sCCLOPfn;
@@ -182,7 +207,7 @@
 moduleUnloaded(char *aModuleName)
 {
 	if ((strcmp(aModuleName, "SecurityPlugin")) == 0) {
-		sDSAfn = sHSAfn = sCCTPfn = sCCLOPfn = sCCSOTfn = 0;
+		sDSAfn = (sHSAfn = (sCCTPfn = (sCCLOPfn = (sCCSOTfn = 0))));
 	}
 }
 
@@ -295,6 +320,321 @@
 }
 
 EXPORT(sqInt)
+primitiveResolverGetAddressInfo(void)
+{
+	sqInt family;
+	sqInt flags;
+	char *hostName;
+	sqInt hostSize;
+	sqInt protocol;
+	char *servName;
+	sqInt servSize;
+	sqInt type;
+
+	interpreterProxy->success(interpreterProxy->isBytes(interpreterProxy->stackValue(5)));
+	hostName = ((char *) (interpreterProxy->firstIndexableField(interpreterProxy->stackValue(5))));
+	interpreterProxy->success(interpreterProxy->isBytes(interpreterProxy->stackValue(4)));
+	servName = ((char *) (interpreterProxy->firstIndexableField(interpreterProxy->stackValue(4))));
+	flags = interpreterProxy->stackIntegerValue(3);
+	family = interpreterProxy->stackIntegerValue(2);
+	type = interpreterProxy->stackIntegerValue(1);
+	protocol = interpreterProxy->stackIntegerValue(0);
+	if (interpreterProxy->failed()) {
+		return null;
+	}
+	if (!(interpreterProxy->failed())) {
+		hostSize = interpreterProxy->byteSizeOf(((sqInt)(long)(hostName) - 4));
+		servSize = interpreterProxy->byteSizeOf(((sqInt)(long)(servName) - 4));
+		sqResolverGetAddressInfoHostSizeServiceSizeFlagsFamilyTypeProtocol(hostName, hostSize, servName, servSize, flags, family, type, protocol);
+	}
+	if (interpreterProxy->failed()) {
+		return null;
+	}
+	interpreterProxy->pop(6);
+	return null;
+}
+
+EXPORT(sqInt)
+primitiveResolverGetAddressInfoFamily(void)
+{
+	sqInt family;
+	sqInt _return_value;
+
+	if (!(interpreterProxy->failed())) {
+		family = sqResolverGetAddressInfoFamily();
+		_return_value = interpreterProxy->integerObjectOf(family);
+		if (interpreterProxy->failed()) {
+			return null;
+		}
+		interpreterProxy->popthenPush(1, _return_value);
+		return null;
+	}
+	if (interpreterProxy->failed()) {
+		return null;
+	}
+	return null;
+}
+
+EXPORT(sqInt)
+primitiveResolverGetAddressInfoNext(void)
+{
+	sqInt more;
+	sqInt _return_value;
+
+	more = sqResolverGetAddressInfoNext();
+	if (interpreterProxy->failed()) {
+		return null;
+	}
+	_return_value = (more) ? interpreterProxy->trueObject(): interpreterProxy->falseObject();
+	if (interpreterProxy->failed()) {
+		return null;
+	}
+	interpreterProxy->popthenPush(1, _return_value);
+	return null;
+}
+
+EXPORT(sqInt)
+primitiveResolverGetAddressInfoProtocol(void)
+{
+	sqInt protocol;
+	sqInt _return_value;
+
+	if (!(interpreterProxy->failed())) {
+		protocol = sqResolverGetAddressInfoProtocol();
+		_return_value = interpreterProxy->integerObjectOf(protocol);
+		if (interpreterProxy->failed()) {
+			return null;
+		}
+		interpreterProxy->popthenPush(1, _return_value);
+		return null;
+	}
+	if (interpreterProxy->failed()) {
+		return null;
+	}
+	return null;
+}
+
+EXPORT(sqInt)
+primitiveResolverGetAddressInfoResult(void)
+{
+	sqInt addrSize;
+	char *socketAddress;
+
+	interpreterProxy->success(interpreterProxy->isBytes(interpreterProxy->stackValue(0)));
+	socketAddress = ((char *) (interpreterProxy->firstIndexableField(interpreterProxy->stackValue(0))));
+	if (interpreterProxy->failed()) {
+		return null;
+	}
+	if (!(interpreterProxy->failed())) {
+		addrSize = interpreterProxy->byteSizeOf(((sqInt)(long)(socketAddress) - 4));
+		sqResolverGetAddressInfoResultSize(socketAddress, addrSize);
+	}
+	if (interpreterProxy->failed()) {
+		return null;
+	}
+	interpreterProxy->pop(1);
+	return null;
+}
+
+EXPORT(sqInt)
+primitiveResolverGetAddressInfoSize(void)
+{
+	sqInt size;
+	sqInt _return_value;
+
+	if (!(interpreterProxy->failed())) {
+		size = sqResolverGetAddressInfoSize();
+		_return_value = interpreterProxy->integerObjectOf(size);
+		if (interpreterProxy->failed()) {
+			return null;
+		}
+		interpreterProxy->popthenPush(1, _return_value);
+		return null;
+	}
+	if (interpreterProxy->failed()) {
+		return null;
+	}
+	return null;
+}
+
+EXPORT(sqInt)
+primitiveResolverGetAddressInfoType(void)
+{
+	sqInt type;
+	sqInt _return_value;
+
+	if (!(interpreterProxy->failed())) {
+		type = sqResolverGetAddressInfoType();
+		_return_value = interpreterProxy->integerObjectOf(type);
+		if (interpreterProxy->failed()) {
+			return null;
+		}
+		interpreterProxy->popthenPush(1, _return_value);
+		return null;
+	}
+	if (interpreterProxy->failed()) {
+		return null;
+	}
+	return null;
+}
+
+EXPORT(sqInt)
+primitiveResolverGetNameInfo(void)
+{
+	char *addrBase;
+	sqInt addrSize;
+	sqInt flags;
+	sqInt socketAddress;
+
+	socketAddress = interpreterProxy->stackValue(1);
+	flags = interpreterProxy->stackIntegerValue(0);
+	if (interpreterProxy->failed()) {
+		return null;
+	}
+	if (!(interpreterProxy->failed())) {
+		addrSize = interpreterProxy->byteSizeOf(socketAddress);
+		addrBase = ((char *) (interpreterProxy->firstIndexableField(socketAddress)));
+		sqResolverGetNameInfoSizeFlags(addrBase, addrSize, flags);
+	}
+	if (interpreterProxy->failed()) {
+		return null;
+	}
+	interpreterProxy->pop(2);
+	return null;
+}
+
+EXPORT(sqInt)
+primitiveResolverGetNameInfoHostResult(void)
+{
+	sqInt addrSize;
+	char *socketName;
+
+	interpreterProxy->success(interpreterProxy->isBytes(interpreterProxy->stackValue(0)));
+	socketName = ((char *) (interpreterProxy->firstIndexableField(interpreterProxy->stackValue(0))));
+	if (interpreterProxy->failed()) {
+		return null;
+	}
+	if (!(interpreterProxy->failed())) {
+		addrSize = interpreterProxy->byteSizeOf(((sqInt)(long)(socketName) - 4));
+		sqResolverGetNameInfoHostResultSize(socketName, addrSize);
+	}
+	if (interpreterProxy->failed()) {
+		return null;
+	}
+	interpreterProxy->pop(1);
+	return null;
+}
+
+EXPORT(sqInt)
+primitiveResolverGetNameInfoHostSize(void)
+{
+	sqInt size;
+	sqInt _return_value;
+
+	if (!(interpreterProxy->failed())) {
+		size = sqResolverGetNameInfoHostSize();
+		_return_value = interpreterProxy->integerObjectOf(size);
+		if (interpreterProxy->failed()) {
+			return null;
+		}
+		interpreterProxy->popthenPush(1, _return_value);
+		return null;
+	}
+	if (interpreterProxy->failed()) {
+		return null;
+	}
+	return null;
+}
+
+EXPORT(sqInt)
+primitiveResolverGetNameInfoServiceResult(void)
+{
+	sqInt addrSize;
+	char *socketName;
+
+	interpreterProxy->success(interpreterProxy->isBytes(interpreterProxy->stackValue(0)));
+	socketName = ((char *) (interpreterProxy->firstIndexableField(interpreterProxy->stackValue(0))));
+	if (interpreterProxy->failed()) {
+		return null;
+	}
+	if (!(interpreterProxy->failed())) {
+		addrSize = interpreterProxy->byteSizeOf(((sqInt)(long)(socketName) - 4));
+		sqResolverGetNameInfoServiceResultSize(socketName, addrSize);
+	}
+	if (interpreterProxy->failed()) {
+		return null;
+	}
+	interpreterProxy->pop(1);
+	return null;
+}
+
+EXPORT(sqInt)
+primitiveResolverGetNameInfoServiceSize(void)
+{
+	sqInt size;
+	sqInt _return_value;
+
+	if (!(interpreterProxy->failed())) {
+		size = sqResolverGetNameInfoServiceSize();
+		_return_value = interpreterProxy->integerObjectOf(size);
+		if (interpreterProxy->failed()) {
+			return null;
+		}
+		interpreterProxy->popthenPush(1, _return_value);
+		return null;
+	}
+	if (interpreterProxy->failed()) {
+		return null;
+	}
+	return null;
+}
+
+EXPORT(sqInt)
+primitiveResolverHostNameResult(void)
+{
+	sqInt nameSize;
+	char *nameString;
+
+	interpreterProxy->success(interpreterProxy->isBytes(interpreterProxy->stackValue(0)));
+	nameString = ((char *) (interpreterProxy->firstIndexableField(interpreterProxy->stackValue(0))));
+	if (interpreterProxy->failed()) {
+		return null;
+	}
+	if (!(interpreterProxy->failed())) {
+		nameSize = interpreterProxy->byteSizeOf(((sqInt)(long)(nameString) - 4));
+		sqResolverHostNameResultSize(nameString, nameSize);
+	}
+	if (interpreterProxy->failed()) {
+		return null;
+	}
+	interpreterProxy->pop(1);
+	return null;
+}
+
+EXPORT(sqInt)
+primitiveResolverHostNameSize(void)
+{
+	sqInt size;
+	sqInt _return_value;
+
+	if (!(interpreterProxy->failed())) {
+		size = sqResolverHostNameSize();
+		if (!(interpreterProxy->failed())) {
+			_return_value = interpreterProxy->integerObjectOf(size);
+			if (interpreterProxy->failed()) {
+				return null;
+			}
+			interpreterProxy->popthenPush(1, _return_value);
+			return null;
+		}
+	}
+	if (interpreterProxy->failed()) {
+		return null;
+	}
+	return null;
+}
+
+EXPORT(sqInt)
 primitiveResolverLocalAddress(void)
 {
 	sqInt addr;
@@ -396,7 +736,6 @@
 {
 	SocketPtr  s;
 	sqInt socket;
-	void *socketIndex;
 
 	socket = interpreterProxy->stackValue(0);
 	if (interpreterProxy->failed()) {
@@ -405,13 +744,9 @@
 	/* begin socketValueOf: */
 	interpreterProxy->success((interpreterProxy->isBytes(socket))
 	 && ((interpreterProxy->byteSizeOf(socket)) == (socketRecordSize())));
-	if (interpreterProxy->failed()) {
-		s = null;
-		goto l1;
-	}
-	socketIndex = ((SocketPtr) (interpreterProxy->firstIndexableField(socket)));
-	s = socketIndex;
-l1:	/* end socketValueOf: */;
+	s = (interpreterProxy->failed()
+		? null
+		: ((SocketPtr) (interpreterProxy->firstIndexableField(socket))));
 	if (!(interpreterProxy->failed())) {
 		sqSocketAbortConnection(s);
 	}
@@ -430,8 +765,6 @@
 	sqInt semaIndex;
 	sqInt sendBufSize;
 	SocketPtr  serverSocket;
-	void *socketIndex;
-	void *socketIndex1;
 	sqInt socketOop;
 	sqInt sockHandle;
 
@@ -445,25 +778,17 @@
 	/* begin socketValueOf: */
 	interpreterProxy->success((interpreterProxy->isBytes(sockHandle))
 	 && ((interpreterProxy->byteSizeOf(sockHandle)) == (socketRecordSize())));
-	if (interpreterProxy->failed()) {
-		serverSocket = null;
-		goto l2;
-	}
-	socketIndex1 = ((SocketPtr) (interpreterProxy->firstIndexableField(sockHandle)));
-	serverSocket = socketIndex1;
-l2:	/* end socketValueOf: */;
+	serverSocket = (interpreterProxy->failed()
+		? null
+		: ((SocketPtr) (interpreterProxy->firstIndexableField(sockHandle))));
 	if (!(interpreterProxy->failed())) {
 		socketOop = interpreterProxy->instantiateClassindexableSize(interpreterProxy->classByteArray(), socketRecordSize());
 		/* begin socketValueOf: */
 		interpreterProxy->success((interpreterProxy->isBytes(socketOop))
 		 && ((interpreterProxy->byteSizeOf(socketOop)) == (socketRecordSize())));
-		if (interpreterProxy->failed()) {
-			s = null;
-			goto l1;
-		}
-		socketIndex = ((SocketPtr) (interpreterProxy->firstIndexableField(socketOop)));
-		s = socketIndex;
-	l1:	/* end socketValueOf: */;
+		s = (interpreterProxy->failed()
+			? null
+			: ((SocketPtr) (interpreterProxy->firstIndexableField(socketOop))));
 		sqSocketAcceptFromRecvBytesSendBytesSemaID(s, serverSocket, recvBufSize, sendBufSize, semaIndex);
 	}
 	if (interpreterProxy->failed()) {
@@ -483,8 +808,6 @@
 	sqInt semaIndex;
 	sqInt sendBufSize;
 	SocketPtr  serverSocket;
-	void *socketIndex;
-	void *socketIndex1;
 	sqInt socketOop;
 	sqInt sockHandle;
 
@@ -500,25 +823,17 @@
 	/* begin socketValueOf: */
 	interpreterProxy->success((interpreterProxy->isBytes(sockHandle))
 	 && ((interpreterProxy->byteSizeOf(sockHandle)) == (socketRecordSize())));
-	if (interpreterProxy->failed()) {
-		serverSocket = null;
-		goto l2;
-	}
-	socketIndex1 = ((SocketPtr) (interpreterProxy->firstIndexableField(sockHandle)));
-	serverSocket = socketIndex1;
-l2:	/* end socketValueOf: */;
+	serverSocket = (interpreterProxy->failed()
+		? null
+		: ((SocketPtr) (interpreterProxy->firstIndexableField(sockHandle))));
 	if (!(interpreterProxy->failed())) {
 		socketOop = interpreterProxy->instantiateClassindexableSize(interpreterProxy->classByteArray(), socketRecordSize());
 		/* begin socketValueOf: */
 		interpreterProxy->success((interpreterProxy->isBytes(socketOop))
 		 && ((interpreterProxy->byteSizeOf(socketOop)) == (socketRecordSize())));
-		if (interpreterProxy->failed()) {
-			s = null;
-			goto l1;
-		}
-		socketIndex = ((SocketPtr) (interpreterProxy->firstIndexableField(socketOop)));
-		s = socketIndex;
-	l1:	/* end socketValueOf: */;
+		s = (interpreterProxy->failed()
+			? null
+			: ((SocketPtr) (interpreterProxy->firstIndexableField(socketOop))));
 		sqSocketAcceptFromRecvBytesSendBytesSemaIDReadSemaIDWriteSemaID(s, serverSocket, recvBufSize, sendBufSize, semaIndex, aReadSema, aWriteSema);
 	}
 	if (interpreterProxy->failed()) {
@@ -529,6 +844,95 @@
 }
 
 EXPORT(sqInt)
+primitiveSocketAddressGetPort(void)
+{
+	sqInt addr;
+	char *addrBase;
+	sqInt addrSize;
+	sqInt port;
+	sqInt _return_value;
+
+	addr = interpreterProxy->stackValue(0);
+	if (interpreterProxy->failed()) {
+		return null;
+	}
+	addrSize = interpreterProxy->byteSizeOf(addr);
+	addrBase = ((char *) (interpreterProxy->firstIndexableField(addr)));
+	if (!(interpreterProxy->failed())) {
+		port = sqSocketAddressSizeGetPort(addrBase, addrSize);
+		if (!(interpreterProxy->failed())) {
+			_return_value = interpreterProxy->integerObjectOf(port);
+			if (interpreterProxy->failed()) {
+				return null;
+			}
+			interpreterProxy->popthenPush(1, _return_value);
+			return null;
+		}
+	}
+	if (interpreterProxy->failed()) {
+		return null;
+	}
+	return null;
+}
+
+EXPORT(sqInt)
+primitiveSocketAddressSetPort(void)
+{
+	sqInt addr;
+	char *addrBase;
+	sqInt addrSize;
+	sqInt portNumber;
+
+	portNumber = interpreterProxy->stackIntegerValue(0);
+	addr = interpreterProxy->stackValue(1);
+	if (interpreterProxy->failed()) {
+		return null;
+	}
+	addrSize = interpreterProxy->byteSizeOf(addr);
+	addrBase = ((char *) (interpreterProxy->firstIndexableField(addr)));
+	if (!(interpreterProxy->failed())) {
+		sqSocketAddressSizeSetPort(addrBase, addrSize, portNumber);
+	}
+	if (interpreterProxy->failed()) {
+		return null;
+	}
+	interpreterProxy->pop(1);
+	return null;
+}
+
+EXPORT(sqInt)
+primitiveSocketBindTo(void)
+{
+	char *addrBase;
+	sqInt addrSize;
+	SocketPtr s;
+	sqInt socket;
+	sqInt socketAddress;
+
+	socket = interpreterProxy->stackValue(1);
+	socketAddress = interpreterProxy->stackValue(0);
+	if (interpreterProxy->failed()) {
+		return null;
+	}
+	/* begin socketValueOf: */
+	interpreterProxy->success((interpreterProxy->isBytes(socket))
+	 && ((interpreterProxy->byteSizeOf(socket)) == (socketRecordSize())));
+	s = (interpreterProxy->failed()
+		? null
+		: ((SocketPtr) (interpreterProxy->firstIndexableField(socket))));
+	addrSize = interpreterProxy->byteSizeOf(socketAddress);
+	addrBase = ((char *) (interpreterProxy->firstIndexableField(socketAddress)));
+	if (!(interpreterProxy->failed())) {
+		sqSocketBindToAddressSize(s, addrBase, addrSize);
+	}
+	if (interpreterProxy->failed()) {
+		return null;
+	}
+	interpreterProxy->pop(2);
+	return null;
+}
+
+EXPORT(sqInt)
 primitiveSocketBindToPort(void)
 {
 	sqInt addr;
@@ -536,7 +940,6 @@
 	sqInt port;
 	SocketPtr s;
 	sqInt socket;
-	void *socketIndex;
 	sqInt sz;
 
 	socket = interpreterProxy->stackValue(2);
@@ -557,13 +960,9 @@
 	/* begin socketValueOf: */
 	interpreterProxy->success((interpreterProxy->isBytes(socket))
 	 && ((interpreterProxy->byteSizeOf(socket)) == (socketRecordSize())));
-	if (interpreterProxy->failed()) {
-		s = null;
-		goto l2;
-	}
-	socketIndex = ((SocketPtr) (interpreterProxy->firstIndexableField(socket)));
-	s = socketIndex;
-l2:	/* end socketValueOf: */;
+	s = (interpreterProxy->failed()
+		? null
+		: ((SocketPtr) (interpreterProxy->firstIndexableField(socket))));
 	if (!(interpreterProxy->failed())) {
 		sqSocketBindToPort(s, addr, port);
 	}
@@ -579,7 +978,6 @@
 {
 	SocketPtr  s;
 	sqInt socket;
-	void *socketIndex;
 
 	socket = interpreterProxy->stackValue(0);
 	if (interpreterProxy->failed()) {
@@ -588,13 +986,9 @@
 	/* begin socketValueOf: */
 	interpreterProxy->success((interpreterProxy->isBytes(socket))
 	 && ((interpreterProxy->byteSizeOf(socket)) == (socketRecordSize())));
-	if (interpreterProxy->failed()) {
-		s = null;
-		goto l1;
-	}
-	socketIndex = ((SocketPtr) (interpreterProxy->firstIndexableField(socket)));
-	s = socketIndex;
-l1:	/* end socketValueOf: */;
+	s = (interpreterProxy->failed()
+		? null
+		: ((SocketPtr) (interpreterProxy->firstIndexableField(socket))));
 	if (!(interpreterProxy->failed())) {
 		sqSocketCloseConnection(s);
 	}
@@ -610,7 +1004,6 @@
 {
 	SocketPtr  s;
 	sqInt socket;
-	void *socketIndex;
 	sqInt status;
 	sqInt _return_value;
 
@@ -621,13 +1014,9 @@
 	/* begin socketValueOf: */
 	interpreterProxy->success((interpreterProxy->isBytes(socket))
 	 && ((interpreterProxy->byteSizeOf(socket)) == (socketRecordSize())));
-	if (interpreterProxy->failed()) {
-		s = null;
-		goto l1;
-	}
-	socketIndex = ((SocketPtr) (interpreterProxy->firstIndexableField(socket)));
-	s = socketIndex;
-l1:	/* end socketValueOf: */;
+	s = (interpreterProxy->failed()
+		? null
+		: ((SocketPtr) (interpreterProxy->firstIndexableField(socket))));
 	if (!(interpreterProxy->failed())) {
 		status = sqSocketConnectionStatus(s);
 	}
@@ -640,6 +1029,38 @@
 }
 
 EXPORT(sqInt)
+primitiveSocketConnectTo(void)
+{
+	char *addrBase;
+	sqInt addrSize;
+	SocketPtr s;
+	sqInt socket;
+	sqInt socketAddress;
+
+	socket = interpreterProxy->stackValue(1);
+	socketAddress = interpreterProxy->stackValue(0);
+	if (interpreterProxy->failed()) {
+		return null;
+	}
+	/* begin socketValueOf: */
+	interpreterProxy->success((interpreterProxy->isBytes(socket))
+	 && ((interpreterProxy->byteSizeOf(socket)) == (socketRecordSize())));
+	s = (interpreterProxy->failed()
+		? null
+		: ((SocketPtr) (interpreterProxy->firstIndexableField(socket))));
+	addrSize = interpreterProxy->byteSizeOf(socketAddress);
+	addrBase = ((char *) (interpreterProxy->firstIndexableField(socketAddress)));
+	if (!(interpreterProxy->failed())) {
+		sqSocketConnectToAddressSize(s, addrBase, addrSize);
+	}
+	if (interpreterProxy->failed()) {
+		return null;
+	}
+	interpreterProxy->pop(2);
+	return null;
+}
+
+EXPORT(sqInt)
 primitiveSocketConnectToPort(void)
 {
 	sqInt addr;
@@ -648,7 +1069,6 @@
 	sqInt port;
 	SocketPtr s;
 	sqInt socket;
-	void *socketIndex;
 	sqInt sz;
 
 	socket = interpreterProxy->stackValue(2);
@@ -668,7 +1088,7 @@
 l1:	/* end netAddressToInt: */;
 	if (sCCTPfn != 0) {
 		okToConnect =  ((int (*) (int, int)) sCCTPfn)(addr, port);
-		if (!(okToConnect)) {
+		if (!okToConnect) {
 			interpreterProxy->primitiveFail();
 			return null;
 		}
@@ -676,13 +1096,9 @@
 	/* begin socketValueOf: */
 	interpreterProxy->success((interpreterProxy->isBytes(socket))
 	 && ((interpreterProxy->byteSizeOf(socket)) == (socketRecordSize())));
-	if (interpreterProxy->failed()) {
-		s = null;
-		goto l2;
-	}
-	socketIndex = ((SocketPtr) (interpreterProxy->firstIndexableField(socket)));
-	s = socketIndex;
-l2:	/* end socketValueOf: */;
+	s = (interpreterProxy->failed()
+		? null
+		: ((SocketPtr) (interpreterProxy->firstIndexableField(socket))));
 	if (!(interpreterProxy->failed())) {
 		sqSocketConnectToPort(s, addr, port);
 	}
@@ -702,7 +1118,6 @@
 	SocketPtr  s;
 	sqInt semaIndex;
 	sqInt sendBufSize;
-	void *socketIndex;
 	sqInt socketOop;
 	sqInt socketType;
 
@@ -716,7 +1131,7 @@
 	}
 	if (sCCSOTfn != 0) {
 		okToCreate =  ((int (*) (int, int)) sCCSOTfn)(netType, socketType);
-		if (!(okToCreate)) {
+		if (!okToCreate) {
 			interpreterProxy->primitiveFail();
 			return null;
 		}
@@ -725,13 +1140,9 @@
 	/* begin socketValueOf: */
 	interpreterProxy->success((interpreterProxy->isBytes(socketOop))
 	 && ((interpreterProxy->byteSizeOf(socketOop)) == (socketRecordSize())));
-	if (interpreterProxy->failed()) {
-		s = null;
-		goto l1;
-	}
-	socketIndex = ((SocketPtr) (interpreterProxy->firstIndexableField(socketOop)));
-	s = socketIndex;
-l1:	/* end socketValueOf: */;
+	s = (interpreterProxy->failed()
+		? null
+		: ((SocketPtr) (interpreterProxy->firstIndexableField(socketOop))));
 	sqSocketCreateNetTypeSocketTypeRecvBytesSendBytesSemaID(s, netType, socketType, recvBufSize, sendBufSize, semaIndex);
 	if (interpreterProxy->failed()) {
 		return null;
@@ -751,7 +1162,6 @@
 	SocketPtr  s;
 	sqInt semaIndex;
 	sqInt sendBufSize;
-	void *socketIndex;
 	sqInt socketOop;
 	sqInt socketType;
 
@@ -767,7 +1177,7 @@
 	}
 	if (sCCSOTfn != 0) {
 		okToCreate =  ((int (*) (int, int)) sCCSOTfn)(netType, socketType);
-		if (!(okToCreate)) {
+		if (!okToCreate) {
 			interpreterProxy->primitiveFail();
 			return null;
 		}
@@ -776,13 +1186,9 @@
 	/* begin socketValueOf: */
 	interpreterProxy->success((interpreterProxy->isBytes(socketOop))
 	 && ((interpreterProxy->byteSizeOf(socketOop)) == (socketRecordSize())));
-	if (interpreterProxy->failed()) {
-		s = null;
-		goto l1;
-	}
-	socketIndex = ((SocketPtr) (interpreterProxy->firstIndexableField(socketOop)));
-	s = socketIndex;
-l1:	/* end socketValueOf: */;
+	s = (interpreterProxy->failed()
+		? null
+		: ((SocketPtr) (interpreterProxy->firstIndexableField(socketOop))));
 	sqSocketCreateNetTypeSocketTypeRecvBytesSendBytesSemaIDReadSemaIDWriteSemaID(s, netType, socketType, recvBufSize, sendBufSize, semaIndex, aReadSema, aWriteSema);
 	if (interpreterProxy->failed()) {
 		return null;
@@ -803,7 +1209,6 @@
 	SocketPtr  s;
 	sqInt semaIndex;
 	sqInt sendBufSize;
-	void *socketIndex;
 	sqInt socketOop;
 
 	netType = interpreterProxy->stackIntegerValue(6);
@@ -818,7 +1223,7 @@
 	}
 	if (sCCSOTfn != 0) {
 		okToCreate =  ((int (*) (int, int)) sCCSOTfn)(netType, protoType);
-		if (!(okToCreate)) {
+		if (!okToCreate) {
 			interpreterProxy->primitiveFail();
 			return null;
 		}
@@ -827,13 +1232,9 @@
 	/* begin socketValueOf: */
 	interpreterProxy->success((interpreterProxy->isBytes(socketOop))
 	 && ((interpreterProxy->byteSizeOf(socketOop)) == (socketRecordSize())));
-	if (interpreterProxy->failed()) {
-		s = null;
-		goto l1;
-	}
-	socketIndex = ((SocketPtr) (interpreterProxy->firstIndexableField(socketOop)));
-	s = socketIndex;
-l1:	/* end socketValueOf: */;
+	s = (interpreterProxy->failed()
+		? null
+		: ((SocketPtr) (interpreterProxy->firstIndexableField(socketOop))));
 	sqSocketCreateRawProtoTypeRecvBytesSendBytesSemaIDReadSemaIDWriteSemaID(s, netType, protoType, recvBufSize, sendBufSize, semaIndex, aReadSema, aWriteSema);
 	if (interpreterProxy->failed()) {
 		return null;
@@ -847,7 +1248,6 @@
 {
 	SocketPtr s;
 	sqInt socket;
-	void *socketIndex;
 
 	socket = interpreterProxy->stackValue(0);
 	if (interpreterProxy->failed()) {
@@ -856,13 +1256,9 @@
 	/* begin socketValueOf: */
 	interpreterProxy->success((interpreterProxy->isBytes(socket))
 	 && ((interpreterProxy->byteSizeOf(socket)) == (socketRecordSize())));
-	if (interpreterProxy->failed()) {
-		s = null;
-		goto l1;
-	}
-	socketIndex = ((SocketPtr) (interpreterProxy->firstIndexableField(socket)));
-	s = socketIndex;
-l1:	/* end socketValueOf: */;
+	s = (interpreterProxy->failed()
+		? null
+		: ((SocketPtr) (interpreterProxy->firstIndexableField(socket))));
 	if (!(interpreterProxy->failed())) {
 		sqSocketDestroy(s);
 	}
@@ -879,7 +1275,6 @@
 	sqInt err;
 	SocketPtr  s;
 	sqInt socket;
-	void *socketIndex;
 	sqInt _return_value;
 
 	socket = interpreterProxy->stackValue(0);
@@ -889,13 +1284,9 @@
 	/* begin socketValueOf: */
 	interpreterProxy->success((interpreterProxy->isBytes(socket))
 	 && ((interpreterProxy->byteSizeOf(socket)) == (socketRecordSize())));
-	if (interpreterProxy->failed()) {
-		s = null;
-		goto l1;
-	}
-	socketIndex = ((SocketPtr) (interpreterProxy->firstIndexableField(socket)));
-	s = socketIndex;
-l1:	/* end socketValueOf: */;
+	s = (interpreterProxy->failed()
+		? null
+		: ((SocketPtr) (interpreterProxy->firstIndexableField(socket))));
 	if (!(interpreterProxy->failed())) {
 		err = sqSocketError(s);
 	}
@@ -918,7 +1309,6 @@
 	sqInt returnedValue;
 	SocketPtr s;
 	sqInt socket;
-	void *socketIndex;
 
 	socket = interpreterProxy->stackValue(1);
 	optionName = interpreterProxy->stackValue(0);
@@ -928,13 +1318,9 @@
 	/* begin socketValueOf: */
 	interpreterProxy->success((interpreterProxy->isBytes(socket))
 	 && ((interpreterProxy->byteSizeOf(socket)) == (socketRecordSize())));
-	if (interpreterProxy->failed()) {
-		s = null;
-		goto l1;
-	}
-	socketIndex = ((SocketPtr) (interpreterProxy->firstIndexableField(socket)));
-	s = socketIndex;
-l1:	/* end socketValueOf: */;
+	s = (interpreterProxy->failed()
+		? null
+		: ((SocketPtr) (interpreterProxy->firstIndexableField(socket))));
 	interpreterProxy->success(interpreterProxy->isBytes(optionName));
 	optionNameStart = ((char *) (interpreterProxy->firstIndexableField(optionName)));
 	optionNameSize = interpreterProxy->slotSizeOf(optionName);
@@ -968,7 +1354,6 @@
 	sqInt port;
 	SocketPtr  s;
 	sqInt socket;
-	void *socketIndex;
 
 	socket = interpreterProxy->stackValue(1);
 	port = interpreterProxy->stackIntegerValue(0);
@@ -978,21 +1363,19 @@
 	/* begin socketValueOf: */
 	interpreterProxy->success((interpreterProxy->isBytes(socket))
 	 && ((interpreterProxy->byteSizeOf(socket)) == (socketRecordSize())));
-	if (interpreterProxy->failed()) {
-		s = null;
-		goto l1;
-	}
-	socketIndex = ((SocketPtr) (interpreterProxy->firstIndexableField(socket)));
-	s = socketIndex;
-l1:	/* end socketValueOf: */;
+	s = (interpreterProxy->failed()
+		? null
+		: ((SocketPtr) (interpreterProxy->firstIndexableField(socket))));
 	if (sCCLOPfn != 0) {
 		okToListen =  ((int (*) (SocketPtr, int)) sCCLOPfn)(s, port);
-		if (!(okToListen)) {
+		if (!okToListen) {
 			interpreterProxy->primitiveFail();
 			return null;
 		}
 	}
-	sqSocketListenOnPort(s, port);
+	if (!(interpreterProxy->failed())) {
+		sqSocketListenOnPort(s, port);
+	}
 	if (interpreterProxy->failed()) {
 		return null;
 	}
@@ -1013,7 +1396,6 @@
 	sqInt port;
 	SocketPtr s;
 	sqInt socket;
-	void *socketIndex;
 
 	socket = interpreterProxy->stackValue(2);
 	port = interpreterProxy->stackIntegerValue(1);
@@ -1024,16 +1406,12 @@
 	/* begin socketValueOf: */
 	interpreterProxy->success((interpreterProxy->isBytes(socket))
 	 && ((interpreterProxy->byteSizeOf(socket)) == (socketRecordSize())));
-	if (interpreterProxy->failed()) {
-		s = null;
-		goto l1;
-	}
-	socketIndex = ((SocketPtr) (interpreterProxy->firstIndexableField(socket)));
-	s = socketIndex;
-l1:	/* end socketValueOf: */;
+	s = (interpreterProxy->failed()
+		? null
+		: ((SocketPtr) (interpreterProxy->firstIndexableField(socket))));
 	if (sCCLOPfn != 0) {
 		okToListen =  ((int (*) (SocketPtr, int)) sCCLOPfn)(s, port);
-		if (!(okToListen)) {
+		if (!okToListen) {
 			interpreterProxy->primitiveFail();
 			return null;
 		}
@@ -1062,7 +1440,6 @@
 	sqInt port;
 	SocketPtr s;
 	sqInt socket;
-	void *socketIndex;
 	sqInt sz;
 
 	socket = interpreterProxy->stackValue(3);
@@ -1076,16 +1453,12 @@
 	/* begin socketValueOf: */
 	interpreterProxy->success((interpreterProxy->isBytes(socket))
 	 && ((interpreterProxy->byteSizeOf(socket)) == (socketRecordSize())));
-	if (interpreterProxy->failed()) {
-		s = null;
-		goto l2;
-	}
-	socketIndex = ((SocketPtr) (interpreterProxy->firstIndexableField(socket)));
-	s = socketIndex;
-l2:	/* end socketValueOf: */;
+	s = (interpreterProxy->failed()
+		? null
+		: ((SocketPtr) (interpreterProxy->firstIndexableField(socket))));
 	if (sCCLOPfn != 0) {
 		okToListen =  ((int (*) (SocketPtr, int)) sCCLOPfn)(s, port);
-		if (!(okToListen)) {
+		if (!okToListen) {
 			interpreterProxy->primitiveFail();
 			return null;
 		}
@@ -1106,7 +1479,35 @@
 	return null;
 }
 
+EXPORT(sqInt)
+primitiveSocketListenWithBacklog(void)
+{
+	sqInt backlogSize;
+	SocketPtr s;
+	sqInt socket;
 
+	socket = interpreterProxy->stackValue(1);
+	backlogSize = interpreterProxy->stackIntegerValue(0);
+	if (interpreterProxy->failed()) {
+		return null;
+	}
+	/* begin socketValueOf: */
+	interpreterProxy->success((interpreterProxy->isBytes(socket))
+	 && ((interpreterProxy->byteSizeOf(socket)) == (socketRecordSize())));
+	s = (interpreterProxy->failed()
+		? null
+		: ((SocketPtr) (interpreterProxy->firstIndexableField(socket))));
+	if (!(interpreterProxy->failed())) {
+		sqSocketListenBacklog(s, backlogSize);
+	}
+	if (interpreterProxy->failed()) {
+		return null;
+	}
+	interpreterProxy->pop(2);
+	return null;
+}
+
+
 /*	Backward compatibility */
 
 EXPORT(sqInt)
@@ -1126,7 +1527,6 @@
 	sqInt addr;
 	SocketPtr s;
 	sqInt socket;
-	void *socketIndex;
 	sqInt _return_value;
 
 	socket = interpreterProxy->stackValue(0);
@@ -1136,13 +1536,9 @@
 	/* begin socketValueOf: */
 	interpreterProxy->success((interpreterProxy->isBytes(socket))
 	 && ((interpreterProxy->byteSizeOf(socket)) == (socketRecordSize())));
-	if (interpreterProxy->failed()) {
-		s = null;
-		goto l1;
-	}
-	socketIndex = ((SocketPtr) (interpreterProxy->firstIndexableField(socket)));
-	s = socketIndex;
-l1:	/* end socketValueOf: */;
+	s = (interpreterProxy->failed()
+		? null
+		: ((SocketPtr) (interpreterProxy->firstIndexableField(socket))));
 	addr = sqSocketLocalAddress(s);
 	_return_value = intToNetAddress(addr);
 	if (interpreterProxy->failed()) {
@@ -1153,12 +1549,76 @@
 }
 
 EXPORT(sqInt)
+primitiveSocketLocalAddressResult(void)
+{
+	char *addrBase;
+	sqInt addrSize;
+	SocketPtr s;
+	sqInt socket;
+	sqInt socketAddress;
+
+	socket = interpreterProxy->stackValue(1);
+	socketAddress = interpreterProxy->stackValue(0);
+	if (interpreterProxy->failed()) {
+		return null;
+	}
+	/* begin socketValueOf: */
+	interpreterProxy->success((interpreterProxy->isBytes(socket))
+	 && ((interpreterProxy->byteSizeOf(socket)) == (socketRecordSize())));
+	s = (interpreterProxy->failed()
+		? null
+		: ((SocketPtr) (interpreterProxy->firstIndexableField(socket))));
+	addrSize = interpreterProxy->byteSizeOf(socketAddress);
+	addrBase = ((char *) (interpreterProxy->firstIndexableField(socketAddress)));
+	if (!(interpreterProxy->failed())) {
+		sqSocketLocalAddressResultSize(s, addrBase, addrSize);
+	}
+	if (interpreterProxy->failed()) {
+		return null;
+	}
+	interpreterProxy->pop(2);
+	return null;
+}
+
+EXPORT(sqInt)
+primitiveSocketLocalAddressSize(void)
+{
+	SocketPtr s;
+	sqInt size;
+	sqInt socket;
+	sqInt _return_value;
+
+	socket = interpreterProxy->stackValue(0);
+	if (interpreterProxy->failed()) {
+		return null;
+	}
+	/* begin socketValueOf: */
+	interpreterProxy->success((interpreterProxy->isBytes(socket))
+	 && ((interpreterProxy->byteSizeOf(socket)) == (socketRecordSize())));
+	s = (interpreterProxy->failed()
+		? null
+		: ((SocketPtr) (interpreterProxy->firstIndexableField(socket))));
+	if (interpreterProxy->failed()) {
+		return null;
+	}
+	size = sqSocketLocalAddressSize(s);
+	if (interpreterProxy->failed()) {
+		return null;
+	}
+	_return_value = interpreterProxy->integerObjectOf(size);
+	if (interpreterProxy->failed()) {
+		return null;
+	}
+	interpreterProxy->popthenPush(2, _return_value);
+	return null;
+}
+
+EXPORT(sqInt)
 primitiveSocketLocalPort(void)
 {
 	sqInt port;
 	SocketPtr  s;
 	sqInt socket;
-	void *socketIndex;
 	sqInt _return_value;
 
 	socket = interpreterProxy->stackValue(0);
@@ -1168,13 +1628,9 @@
 	/* begin socketValueOf: */
 	interpreterProxy->success((interpreterProxy->isBytes(socket))
 	 && ((interpreterProxy->byteSizeOf(socket)) == (socketRecordSize())));
-	if (interpreterProxy->failed()) {
-		s = null;
-		goto l1;
-	}
-	socketIndex = ((SocketPtr) (interpreterProxy->firstIndexableField(socket)));
-	s = socketIndex;
-l1:	/* end socketValueOf: */;
+	s = (interpreterProxy->failed()
+		? null
+		: ((SocketPtr) (interpreterProxy->firstIndexableField(socket))));
 	port = sqSocketLocalPort(s);
 	_return_value = interpreterProxy->integerObjectOf(port);
 	if (interpreterProxy->failed()) {
@@ -1190,7 +1646,6 @@
 	sqInt dataIsAvailable;
 	SocketPtr s;
 	sqInt socket;
-	void *socketIndex;
 	sqInt _return_value;
 
 	socket = interpreterProxy->stackValue(0);
@@ -1200,13 +1655,9 @@
 	/* begin socketValueOf: */
 	interpreterProxy->success((interpreterProxy->isBytes(socket))
 	 && ((interpreterProxy->byteSizeOf(socket)) == (socketRecordSize())));
-	if (interpreterProxy->failed()) {
-		s = null;
-		goto l1;
-	}
-	socketIndex = ((SocketPtr) (interpreterProxy->firstIndexableField(socket)));
-	s = socketIndex;
-l1:	/* end socketValueOf: */;
+	s = (interpreterProxy->failed()
+		? null
+		: ((SocketPtr) (interpreterProxy->firstIndexableField(socket))));
 	dataIsAvailable = sqSocketReceiveDataAvailable(s);
 	_return_value = (dataIsAvailable) ? interpreterProxy->trueObject(): interpreterProxy->falseObject();
 	if (interpreterProxy->failed()) {
@@ -1227,7 +1678,6 @@
 	sqInt count;
 	SocketPtr s;
 	sqInt socket;
-	void *socketIndex;
 	sqInt startIndex;
 	sqInt _return_value;
 
@@ -1241,13 +1691,9 @@
 	/* begin socketValueOf: */
 	interpreterProxy->success((interpreterProxy->isBytes(socket))
 	 && ((interpreterProxy->byteSizeOf(socket)) == (socketRecordSize())));
-	if (interpreterProxy->failed()) {
-		s = null;
-		goto l1;
-	}
-	socketIndex = ((SocketPtr) (interpreterProxy->firstIndexableField(socket)));
-	s = socketIndex;
-l1:	/* end socketValueOf: */;
+	s = (interpreterProxy->failed()
+		? null
+		: ((SocketPtr) (interpreterProxy->firstIndexableField(socket))));
 	interpreterProxy->success(interpreterProxy->isWordsOrBytes(array));
 	if (interpreterProxy->isWords(array)) {
 		byteSize = 4;
@@ -1257,7 +1703,7 @@
 	}
 	interpreterProxy->success((startIndex >= 1)
 	 && ((count >= 0)
- && (((startIndex + count) - 1) <= (interpreterProxy->slotSizeOf(array)))));
+	 && (((startIndex + count) - 1) <= (interpreterProxy->slotSizeOf(array)))));
 	if (!(interpreterProxy->failed())) {
 
 		/* Note: adjust bufStart for zero-origin indexing */
@@ -1289,7 +1735,6 @@
 	sqInt results;
 	SocketPtr s;
 	sqInt socket;
-	void *socketIndex;
 	sqInt startIndex;
 
 	socket = interpreterProxy->stackValue(3);
@@ -1302,13 +1747,9 @@
 	/* begin socketValueOf: */
 	interpreterProxy->success((interpreterProxy->isBytes(socket))
 	 && ((interpreterProxy->byteSizeOf(socket)) == (socketRecordSize())));
-	if (interpreterProxy->failed()) {
-		s = null;
-		goto l1;
-	}
-	socketIndex = ((SocketPtr) (interpreterProxy->firstIndexableField(socket)));
-	s = socketIndex;
-l1:	/* end socketValueOf: */;
+	s = (interpreterProxy->failed()
+		? null
+		: ((SocketPtr) (interpreterProxy->firstIndexableField(socket))));
 	interpreterProxy->success(interpreterProxy->isWordsOrBytes(array));
 	if (interpreterProxy->isWords(array)) {
 		byteSize = 4;
@@ -1318,7 +1759,7 @@
 	}
 	interpreterProxy->success((startIndex >= 1)
 	 && ((count >= 0)
- && (((startIndex + count) - 1) <= (interpreterProxy->slotSizeOf(array)))));
+	 && (((startIndex + count) - 1) <= (interpreterProxy->slotSizeOf(array)))));
 	if (!(interpreterProxy->failed())) {
 
 		/* Note: adjust bufStart for zero-origin indexing */
@@ -1361,7 +1802,6 @@
 	sqInt addr;
 	SocketPtr s;
 	sqInt socket;
-	void *socketIndex;
 	sqInt _return_value;
 
 	socket = interpreterProxy->stackValue(0);
@@ -1371,13 +1811,9 @@
 	/* begin socketValueOf: */
 	interpreterProxy->success((interpreterProxy->isBytes(socket))
 	 && ((interpreterProxy->byteSizeOf(socket)) == (socketRecordSize())));
-	if (interpreterProxy->failed()) {
-		s = null;
-		goto l1;
-	}
-	socketIndex = ((SocketPtr) (interpreterProxy->firstIndexableField(socket)));
-	s = socketIndex;
-l1:	/* end socketValueOf: */;
+	s = (interpreterProxy->failed()
+		? null
+		: ((SocketPtr) (interpreterProxy->firstIndexableField(socket))));
 	addr = sqSocketRemoteAddress(s);
 	_return_value = intToNetAddress(addr);
 	if (interpreterProxy->failed()) {
@@ -1388,12 +1824,76 @@
 }
 
 EXPORT(sqInt)
+primitiveSocketRemoteAddressResult(void)
+{
+	char *addrBase;
+	sqInt addrSize;
+	SocketPtr s;
+	sqInt socket;
+	sqInt socketAddress;
+
+	socket = interpreterProxy->stackValue(1);
+	socketAddress = interpreterProxy->stackValue(0);
+	if (interpreterProxy->failed()) {
+		return null;
+	}
+	/* begin socketValueOf: */
+	interpreterProxy->success((interpreterProxy->isBytes(socket))
+	 && ((interpreterProxy->byteSizeOf(socket)) == (socketRecordSize())));
+	s = (interpreterProxy->failed()
+		? null
+		: ((SocketPtr) (interpreterProxy->firstIndexableField(socket))));
+	addrSize = interpreterProxy->byteSizeOf(socketAddress);
+	addrBase = ((char *) (interpreterProxy->firstIndexableField(socketAddress)));
+	if (!(interpreterProxy->failed())) {
+		sqSocketRemoteAddressResultSize(s, addrBase, addrSize);
+	}
+	if (interpreterProxy->failed()) {
+		return null;
+	}
+	interpreterProxy->pop(2);
+	return null;
+}
+
+EXPORT(sqInt)
+primitiveSocketRemoteAddressSize(void)
+{
+	SocketPtr s;
+	sqInt size;
+	sqInt socket;
+	sqInt _return_value;
+
+	socket = interpreterProxy->stackValue(0);
+	if (interpreterProxy->failed()) {
+		return null;
+	}
+	/* begin socketValueOf: */
+	interpreterProxy->success((interpreterProxy->isBytes(socket))
+	 && ((interpreterProxy->byteSizeOf(socket)) == (socketRecordSize())));
+	s = (interpreterProxy->failed()
+		? null
+		: ((SocketPtr) (interpreterProxy->firstIndexableField(socket))));
+	if (interpreterProxy->failed()) {
+		return null;
+	}
+	size = sqSocketRemoteAddressSize(s);
+	if (interpreterProxy->failed()) {
+		return null;
+	}
+	_return_value = interpreterProxy->integerObjectOf(size);
+	if (interpreterProxy->failed()) {
+		return null;
+	}
+	interpreterProxy->popthenPush(2, _return_value);
+	return null;
+}
+
+EXPORT(sqInt)
 primitiveSocketRemotePort(void)
 {
 	sqInt port;
 	SocketPtr s;
 	sqInt socket;
-	void *socketIndex;
 	sqInt _return_value;
 
 	socket = interpreterProxy->stackValue(0);
@@ -1403,13 +1903,9 @@
 	/* begin socketValueOf: */
 	interpreterProxy->success((interpreterProxy->isBytes(socket))
 	 && ((interpreterProxy->byteSizeOf(socket)) == (socketRecordSize())));
-	if (interpreterProxy->failed()) {
-		s = null;
-		goto l1;
-	}
-	socketIndex = ((SocketPtr) (interpreterProxy->firstIndexableField(socket)));
-	s = socketIndex;
-l1:	/* end socketValueOf: */;
+	s = (interpreterProxy->failed()
+		? null
+		: ((SocketPtr) (interpreterProxy->firstIndexableField(socket))));
 	port = sqSocketRemotePort(s);
 	_return_value = interpreterProxy->integerObjectOf(port);
 	if (interpreterProxy->failed()) {
@@ -1430,7 +1926,6 @@
 	sqInt count;
 	SocketPtr s;
 	sqInt socket;
-	void *socketIndex;
 	sqInt startIndex;
 	sqInt _return_value;
 
@@ -1444,13 +1939,9 @@
 	/* begin socketValueOf: */
 	interpreterProxy->success((interpreterProxy->isBytes(socket))
 	 && ((interpreterProxy->byteSizeOf(socket)) == (socketRecordSize())));
-	if (interpreterProxy->failed()) {
-		s = null;
-		goto l1;
-	}
-	socketIndex = ((SocketPtr) (interpreterProxy->firstIndexableField(socket)));
-	s = socketIndex;
-l1:	/* end socketValueOf: */;
+	s = (interpreterProxy->failed()
+		? null
+		: ((SocketPtr) (interpreterProxy->firstIndexableField(socket))));
 	interpreterProxy->success(interpreterProxy->isWordsOrBytes(array));
 	if (interpreterProxy->isWords(array)) {
 		byteSize = 4;
@@ -1460,7 +1951,7 @@
 	}
 	interpreterProxy->success((startIndex >= 1)
 	 && ((count >= 0)
- && (((startIndex + count) - 1) <= (interpreterProxy->slotSizeOf(array)))));
+	 && (((startIndex + count) - 1) <= (interpreterProxy->slotSizeOf(array)))));
 	if (!(interpreterProxy->failed())) {
 
 		/* Note: adjust bufStart for zero-origin indexing */
@@ -1483,7 +1974,6 @@
 	sqInt done;
 	SocketPtr s;
 	sqInt socket;
-	void *socketIndex;
 	sqInt _return_value;
 
 	socket = interpreterProxy->stackValue(0);
@@ -1493,13 +1983,9 @@
 	/* begin socketValueOf: */
 	interpreterProxy->success((interpreterProxy->isBytes(socket))
 	 && ((interpreterProxy->byteSizeOf(socket)) == (socketRecordSize())));
-	if (interpreterProxy->failed()) {
-		s = null;
-		goto l1;
-	}
-	socketIndex = ((SocketPtr) (interpreterProxy->firstIndexableField(socket)));
-	s = socketIndex;
-l1:	/* end socketValueOf: */;
+	s = (interpreterProxy->failed()
+		? null
+		: ((SocketPtr) (interpreterProxy->firstIndexableField(socket))));
 	done = sqSocketSendDone(s);
 	_return_value = (done) ? interpreterProxy->trueObject(): interpreterProxy->falseObject();
 	if (interpreterProxy->failed()) {
@@ -1523,7 +2009,6 @@
 	sqInt portNumber;
 	SocketPtr s;
 	sqInt socket;
-	void *socketIndex;
 	sqInt startIndex;
 	sqInt sz;
 	sqInt _return_value;
@@ -1541,13 +2026,9 @@
 	/* begin socketValueOf: */
 	interpreterProxy->success((interpreterProxy->isBytes(socket))
 	 && ((interpreterProxy->byteSizeOf(socket)) == (socketRecordSize())));
-	if (interpreterProxy->failed()) {
-		s = null;
-		goto l2;
-	}
-	socketIndex = ((SocketPtr) (interpreterProxy->firstIndexableField(socket)));
-	s = socketIndex;
-l2:	/* end socketValueOf: */;
+	s = (interpreterProxy->failed()
+		? null
+		: ((SocketPtr) (interpreterProxy->firstIndexableField(socket))));
 	interpreterProxy->success(interpreterProxy->isWordsOrBytes(array));
 	if (interpreterProxy->isWords(array)) {
 		byteSize = 4;
@@ -1557,7 +2038,7 @@
 	}
 	interpreterProxy->success((startIndex >= 1)
 	 && ((count >= 0)
- && (((startIndex + count) - 1) <= (interpreterProxy->slotSizeOf(array)))));
+	 && (((startIndex + count) - 1) <= (interpreterProxy->slotSizeOf(array)))));
 	if (!(interpreterProxy->failed())) {
 
 		/* Note: adjust bufStart for zero-origin indexing */
@@ -1596,7 +2077,6 @@
 	sqInt returnedValue;
 	SocketPtr s;
 	sqInt socket;
-	void *socketIndex;
 
 	socket = interpreterProxy->stackValue(2);
 	optionName = interpreterProxy->stackValue(1);
@@ -1607,13 +2087,9 @@
 	/* begin socketValueOf: */
 	interpreterProxy->success((interpreterProxy->isBytes(socket))
 	 && ((interpreterProxy->byteSizeOf(socket)) == (socketRecordSize())));
-	if (interpreterProxy->failed()) {
-		s = null;
-		goto l1;
-	}
-	socketIndex = ((SocketPtr) (interpreterProxy->firstIndexableField(socket)));
-	s = socketIndex;
-l1:	/* end socketValueOf: */;
+	s = (interpreterProxy->failed()
+		? null
+		: ((SocketPtr) (interpreterProxy->firstIndexableField(socket))));
 	interpreterProxy->success(interpreterProxy->isBytes(optionName));
 	optionNameStart = ((char *) (interpreterProxy->firstIndexableField(optionName)));
 	optionNameSize = interpreterProxy->slotSizeOf(optionName);
@@ -1677,15 +2153,11 @@
 static SocketPtr
 socketValueOf(sqInt socketOop)
 {
-	void *socketIndex;
-
 	interpreterProxy->success((interpreterProxy->isBytes(socketOop))
 	 && ((interpreterProxy->byteSizeOf(socketOop)) == (socketRecordSize())));
-	if (interpreterProxy->failed()) {
-		return null;
-	}
-	socketIndex = ((SocketPtr) (interpreterProxy->firstIndexableField(socketOop)));
-	return socketIndex;
+	return (interpreterProxy->failed()
+		? null
+		: ((SocketPtr) (interpreterProxy->firstIndexableField(socketOop))));
 }
 
 static void
@@ -1707,6 +2179,20 @@
 	{"SocketPlugin", "primitiveResolverAbortLookup", (void*)primitiveResolverAbortLookup},
 	{"SocketPlugin", "primitiveResolverAddressLookupResult", (void*)primitiveResolverAddressLookupResult},
 	{"SocketPlugin", "primitiveResolverError", (void*)primitiveResolverError},
+	{"SocketPlugin", "primitiveResolverGetAddressInfo", (void*)primitiveResolverGetAddressInfo},
+	{"SocketPlugin", "primitiveResolverGetAddressInfoFamily", (void*)primitiveResolverGetAddressInfoFamily},
+	{"SocketPlugin", "primitiveResolverGetAddressInfoNext", (void*)primitiveResolverGetAddressInfoNext},
+	{"SocketPlugin", "primitiveResolverGetAddressInfoProtocol", (void*)primitiveResolverGetAddressInfoProtocol},
+	{"SocketPlugin", "primitiveResolverGetAddressInfoResult", (void*)primitiveResolverGetAddressInfoResult},
+	{"SocketPlugin", "primitiveResolverGetAddressInfoSize", (void*)primitiveResolverGetAddressInfoSize},
+	{"SocketPlugin", "primitiveResolverGetAddressInfoType", (void*)primitiveResolverGetAddressInfoType},
+	{"SocketPlugin", "primitiveResolverGetNameInfo", (void*)primitiveResolverGetNameInfo},
+	{"SocketPlugin", "primitiveResolverGetNameInfoHostResult", (void*)primitiveResolverGetNameInfoHostResult},
+	{"SocketPlugin", "primitiveResolverGetNameInfoHostSize", (void*)primitiveResolverGetNameInfoHostSize},
+	{"SocketPlugin", "primitiveResolverGetNameInfoServiceResult", (void*)primitiveResolverGetNameInfoServiceResult},
+	{"SocketPlugin", "primitiveResolverGetNameInfoServiceSize", (void*)primitiveResolverGetNameInfoServiceSize},
+	{"SocketPlugin", "primitiveResolverHostNameResult", (void*)primitiveResolverHostNameResult},
+	{"SocketPlugin", "primitiveResolverHostNameSize", (void*)primitiveResolverHostNameSize},
 	{"SocketPlugin", "primitiveResolverLocalAddress", (void*)primitiveResolverLocalAddress},
 	{"SocketPlugin", "primitiveResolverNameLookupResult", (void*)primitiveResolverNameLookupResult},
 	{"SocketPlugin", "primitiveResolverStartAddressLookup", (void*)primitiveResolverStartAddressLookup},
@@ -1715,9 +2201,13 @@
 	{"SocketPlugin", "primitiveSocketAbortConnection", (void*)primitiveSocketAbortConnection},
 	{"SocketPlugin", "primitiveSocketAccept", (void*)primitiveSocketAccept},
 	{"SocketPlugin", "primitiveSocketAccept3Semaphores", (void*)primitiveSocketAccept3Semaphores},
+	{"SocketPlugin", "primitiveSocketAddressGetPort", (void*)primitiveSocketAddressGetPort},
+	{"SocketPlugin", "primitiveSocketAddressSetPort", (void*)primitiveSocketAddressSetPort},
+	{"SocketPlugin", "primitiveSocketBindTo", (void*)primitiveSocketBindTo},
 	{"SocketPlugin", "primitiveSocketBindToPort", (void*)primitiveSocketBindToPort},
 	{"SocketPlugin", "primitiveSocketCloseConnection", (void*)primitiveSocketCloseConnection},
 	{"SocketPlugin", "primitiveSocketConnectionStatus", (void*)primitiveSocketConnectionStatus},
+	{"SocketPlugin", "primitiveSocketConnectTo", (void*)primitiveSocketConnectTo},
 	{"SocketPlugin", "primitiveSocketConnectToPort", (void*)primitiveSocketConnectToPort},
 	{"SocketPlugin", "primitiveSocketCreate", (void*)primitiveSocketCreate},
 	{"SocketPlugin", "primitiveSocketCreate3Semaphores", (void*)primitiveSocketCreate3Semaphores},
@@ -1728,13 +2218,18 @@
 	{"SocketPlugin", "primitiveSocketListenOnPort", (void*)primitiveSocketListenOnPort},
 	{"SocketPlugin", "primitiveSocketListenOnPortBacklog", (void*)primitiveSocketListenOnPortBacklog},
 	{"SocketPlugin", "primitiveSocketListenOnPortBacklogInterface", (void*)primitiveSocketListenOnPortBacklogInterface},
+	{"SocketPlugin", "primitiveSocketListenWithBacklog", (void*)primitiveSocketListenWithBacklog},
 	{"SocketPlugin", "primitiveSocketListenWithOrWithoutBacklog", (void*)primitiveSocketListenWithOrWithoutBacklog},
 	{"SocketPlugin", "primitiveSocketLocalAddress", (void*)primitiveSocketLocalAddress},
+	{"SocketPlugin", "primitiveSocketLocalAddressResult", (void*)primitiveSocketLocalAddressResult},
+	{"SocketPlugin", "primitiveSocketLocalAddressSize", (void*)primitiveSocketLocalAddressSize},
 	{"SocketPlugin", "primitiveSocketLocalPort", (void*)primitiveSocketLocalPort},
 	{"SocketPlugin", "primitiveSocketReceiveDataAvailable", (void*)primitiveSocketReceiveDataAvailable},
 	{"SocketPlugin", "primitiveSocketReceiveDataBufCount", (void*)primitiveSocketReceiveDataBufCount},
 	{"SocketPlugin", "primitiveSocketReceiveUDPDataBufCount", (void*)primitiveSocketReceiveUDPDataBufCount},
 	{"SocketPlugin", "primitiveSocketRemoteAddress", (void*)primitiveSocketRemoteAddress},
+	{"SocketPlugin", "primitiveSocketRemoteAddressResult", (void*)primitiveSocketRemoteAddressResult},
+	{"SocketPlugin", "primitiveSocketRemoteAddressSize", (void*)primitiveSocketRemoteAddressSize},
 	{"SocketPlugin", "primitiveSocketRemotePort", (void*)primitiveSocketRemotePort},
 	{"SocketPlugin", "primitiveSocketSendDataBufCount", (void*)primitiveSocketSendDataBufCount},
 	{"SocketPlugin", "primitiveSocketSendDone", (void*)primitiveSocketSendDone},

Modified: branches/Cog/src/plugins/UnixOSProcessPlugin/UnixOSProcessPlugin.c
===================================================================
--- branches/Cog/src/plugins/UnixOSProcessPlugin/UnixOSProcessPlugin.c	2012-05-30 18:38:08 UTC (rev 2555)
+++ branches/Cog/src/plugins/UnixOSProcessPlugin/UnixOSProcessPlugin.c	2012-06-07 19:29:52 UTC (rev 2556)
@@ -1,9 +1,9 @@
 /* Automatically generated by
-	VMPluginCodeGenerator VMMaker.oscog-eem.154 uuid: 5cbb57c7-0a54-4b7e-848c-1f292759f1fa
+	VMPluginCodeGenerator VMMaker.oscog-eem.161 uuid: d9d960b4-9f66-43a2-9d90-4fb58d541adc
    from
-	UnixOSProcessPlugin VMConstruction-Plugins-OSProcessPlugin.oscog-eem.34 uuid: 90d36152-4f89-4764-b476-2cc44c195139
+	UnixOSProcessPlugin VMConstruction-Plugins-OSProcessPlugin.oscog-eem.35 uuid: 15acec73-e0e7-4cc0-a521-1c4204a4b5b7
  */
-static char __buildInfo[] = "UnixOSProcessPlugin VMConstruction-Plugins-OSProcessPlugin.oscog-eem.34 uuid: 90d36152-4f89-4764-b476-2cc44c195139 " __DATE__ ;
+static char __buildInfo[] = "UnixOSProcessPlugin VMConstruction-Plugins-OSProcessPlugin.oscog-eem.35 uuid: 15acec73-e0e7-4cc0-a521-1c4204a4b5b7 " __DATE__ ;
 
 
 
@@ -109,6 +109,7 @@
 EXPORT(sqInt) primitiveChdir(void);
 EXPORT(sqInt) primitiveCreatePipe(void);
 EXPORT(sqInt) primitiveCreatePipeWithSessionIdentifier(void);
+EXPORT(sqInt) primitiveDup(sqInt fileDescriptor);
 EXPORT(sqInt) primitiveDupTo(sqInt oldFileDescriptor, sqInt newFileDescriptor);
 EXPORT(sqInt) primitiveEnvironmentAt(void);
 EXPORT(sqInt) primitiveEnvironmentAtSymbol(void);
@@ -249,9 +250,9 @@
 struct VirtualMachine* interpreterProxy;
 static const char *moduleName =
 #ifdef SQUEAK_BUILTIN_PLUGIN
-	"UnixOSProcessPlugin VMConstruction-Plugins-OSProcessPlugin.oscog-eem.34 (i)"
+	"UnixOSProcessPlugin VMConstruction-Plugins-OSProcessPlugin.oscog-eem.35 (i)"
 #else
-	"UnixOSProcessPlugin VMConstruction-Plugins-OSProcessPlugin.oscog-eem.34 (e)"
+	"UnixOSProcessPlugin VMConstruction-Plugins-OSProcessPlugin.oscog-eem.35 (e)"
 #endif
 ;
 static void *originalSigHandlers[NSIG];
@@ -1292,11 +1293,11 @@
 	path = transientCStringFromString(interpreterProxy->stackObjectValue(0));
 	if (chdir(path)) {
 		interpreterProxy->pop(2);
-		interpreterProxy->push(interpreterProxy->nilObject());
+		interpreterProxy->pushInteger(errno);
 	}
 	else {
 		interpreterProxy->pop(2);
-		interpreterProxy->pushInteger(errno);
+		interpreterProxy->push(interpreterProxy->nilObject());
 	}
 }
 
@@ -1420,6 +1421,24 @@
 }
 
 
+/*	Call dup() to duplicate a file descriptor using the next available
+	descriptor. Answer
+	the new file descriptor or -1 on failure.
+ */
+
+EXPORT(sqInt)
+primitiveDup(sqInt fileDescriptor)
+{
+    sqInt fd;
+    int result;
+
+	fd = interpreterProxy->stackIntegerValue(0);
+	result = dup(fd);
+	interpreterProxy->pop(2);
+	interpreterProxy->pushInteger(result);
+}
+
+
 /*	Call dup2() to duplicate a file descriptor. Answer the duplicated file
 	descriptor or -1 on failure. */
 
@@ -4440,6 +4459,7 @@
 	{"UnixOSProcessPlugin", "primitiveChdir", (void*)primitiveChdir},
 	{"UnixOSProcessPlugin", "primitiveCreatePipe", (void*)primitiveCreatePipe},
 	{"UnixOSProcessPlugin", "primitiveCreatePipeWithSessionIdentifier", (void*)primitiveCreatePipeWithSessionIdentifier},
+	{"UnixOSProcessPlugin", "primitiveDup", (void*)primitiveDup},
 	{"UnixOSProcessPlugin", "primitiveDupTo", (void*)primitiveDupTo},
 	{"UnixOSProcessPlugin", "primitiveEnvironmentAt", (void*)primitiveEnvironmentAt},
 	{"UnixOSProcessPlugin", "primitiveEnvironmentAtSymbol", (void*)primitiveEnvironmentAtSymbol},

Modified: branches/Cog/src/vm/cointerp.c
===================================================================
--- branches/Cog/src/vm/cointerp.c	2012-05-30 18:38:08 UTC (rev 2555)
+++ branches/Cog/src/vm/cointerp.c	2012-06-07 19:29:52 UTC (rev 2556)
@@ -1,9 +1,9 @@
 /* Automatically generated by
-	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.159 uuid: cbf7f95a-6fe2-4578-898e-47afb8524be4
+	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.161 uuid: d9d960b4-9f66-43a2-9d90-4fb58d541adc
    from
-	CoInterpreter VMMaker.oscog-eem.159 uuid: cbf7f95a-6fe2-4578-898e-47afb8524be4
+	CoInterpreter VMMaker.oscog-eem.161 uuid: d9d960b4-9f66-43a2-9d90-4fb58d541adc
  */
-static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.159 uuid: cbf7f95a-6fe2-4578-898e-47afb8524be4 " __DATE__ ;
+static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.161 uuid: d9d960b4-9f66-43a2-9d90-4fb58d541adc " __DATE__ ;
 char *__interpBuildInfo = __buildInfo;
 
 
@@ -1906,7 +1906,7 @@
 	/* 575 */ (void (*)(void))0,
  0 };
 static void (*externalPrimitiveTable[MaxExternalPrimitiveTableSize + 1 /* 4097 */])(void);
-const char *interpreterVersion = "Croquet Closure Cog VM [CoInterpreter VMMaker.oscog-eem.159]";
+const char *interpreterVersion = "Croquet Closure Cog VM [CoInterpreter VMMaker.oscog-eem.161]";
 sqInt minBackwardJumpCountForCompile = MinBackwardJumpCountForCompile /* 10 */;
 volatile int sendTrace;
 
@@ -21821,7 +21821,7 @@
 
 /*	This is a helper for primitiveObjectPointsTo so it *does not* check the
 	frameContext field because that is an implicit self-reference not present
-	in the stale .
+	in the state .
  */
 
 static sqInt

Modified: branches/Cog/src/vm/cointerpmt.c
===================================================================
--- branches/Cog/src/vm/cointerpmt.c	2012-05-30 18:38:08 UTC (rev 2555)
+++ branches/Cog/src/vm/cointerpmt.c	2012-06-07 19:29:52 UTC (rev 2556)
@@ -1,9 +1,9 @@
 /* Automatically generated by
-	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.159 uuid: cbf7f95a-6fe2-4578-898e-47afb8524be4
+	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.161 uuid: d9d960b4-9f66-43a2-9d90-4fb58d541adc
    from
-	CoInterpreterMT VMMaker.oscog-eem.159 uuid: cbf7f95a-6fe2-4578-898e-47afb8524be4
+	CoInterpreterMT VMMaker.oscog-eem.161 uuid: d9d960b4-9f66-43a2-9d90-4fb58d541adc
  */
-static char __buildInfo[] = "CoInterpreterMT VMMaker.oscog-eem.159 uuid: cbf7f95a-6fe2-4578-898e-47afb8524be4 " __DATE__ ;
+static char __buildInfo[] = "CoInterpreterMT VMMaker.oscog-eem.161 uuid: d9d960b4-9f66-43a2-9d90-4fb58d541adc " __DATE__ ;
 char *__interpBuildInfo = __buildInfo;
 
 
@@ -2005,7 +2005,7 @@
 	/* 575 */ (void (*)(void))0,
  0 };
 static void (*externalPrimitiveTable[MaxExternalPrimitiveTableSize + 1 /* 4097 */])(void);
-const char *interpreterVersion = "Croquet Closure Cog MT VM [CoInterpreterMT VMMaker.oscog-eem.159]";
+const char *interpreterVersion = "Croquet Closure Cog MT VM [CoInterpreterMT VMMaker.oscog-eem.161]";
 sqInt minBackwardJumpCountForCompile = MinBackwardJumpCountForCompile /* 10 */;
 volatile int sendTrace;
 sqInt willNotThreadWarnCount;
@@ -22581,7 +22581,7 @@
 
 /*	This is a helper for primitiveObjectPointsTo so it *does not* check the
 	frameContext field because that is an implicit self-reference not present
-	in the stale .
+	in the state .
  */
 
 static sqInt

Modified: branches/Cog/src/vm/gcc3x-cointerp.c
===================================================================
--- branches/Cog/src/vm/gcc3x-cointerp.c	2012-05-30 18:38:08 UTC (rev 2555)
+++ branches/Cog/src/vm/gcc3x-cointerp.c	2012-06-07 19:29:52 UTC (rev 2556)
@@ -2,11 +2,11 @@
 
 
 /* Automatically generated by
-	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.159 uuid: cbf7f95a-6fe2-4578-898e-47afb8524be4
+	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.161 uuid: d9d960b4-9f66-43a2-9d90-4fb58d541adc
    from
-	CoInterpreter VMMaker.oscog-eem.159 uuid: cbf7f95a-6fe2-4578-898e-47afb8524be4
+	CoInterpreter VMMaker.oscog-eem.161 uuid: d9d960b4-9f66-43a2-9d90-4fb58d541adc
  */
-static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.159 uuid: cbf7f95a-6fe2-4578-898e-47afb8524be4 " __DATE__ ;
+static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.161 uuid: d9d960b4-9f66-43a2-9d90-4fb58d541adc " __DATE__ ;
 char *__interpBuildInfo = __buildInfo;
 
 
@@ -1909,7 +1909,7 @@
 	/* 575 */ (void (*)(void))0,
  0 };
 static void (*externalPrimitiveTable[MaxExternalPrimitiveTableSize + 1 /* 4097 */])(void);
-const char *interpreterVersion = "Croquet Closure Cog VM [CoInterpreter VMMaker.oscog-eem.159]";
+const char *interpreterVersion = "Croquet Closure Cog VM [CoInterpreter VMMaker.oscog-eem.161]";
 sqInt minBackwardJumpCountForCompile = MinBackwardJumpCountForCompile /* 10 */;
 volatile int sendTrace;
 
@@ -21825,7 +21825,7 @@
 
 /*	This is a helper for primitiveObjectPointsTo so it *does not* check the
 	frameContext field because that is an implicit self-reference not present
-	in the stale .
+	in the state .
  */
 
 static sqInt

Modified: branches/Cog/src/vm/gcc3x-cointerpmt.c
===================================================================
--- branches/Cog/src/vm/gcc3x-cointerpmt.c	2012-05-30 18:38:08 UTC (rev 2555)
+++ branches/Cog/src/vm/gcc3x-cointerpmt.c	2012-06-07 19:29:52 UTC (rev 2556)
@@ -2,11 +2,11 @@
 
 
 /* Automatically generated by
-	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.159 uuid: cbf7f95a-6fe2-4578-898e-47afb8524be4
+	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.161 uuid: d9d960b4-9f66-43a2-9d90-4fb58d541adc
    from
-	CoInterpreterMT VMMaker.oscog-eem.159 uuid: cbf7f95a-6fe2-4578-898e-47afb8524be4
+	CoInterpreterMT VMMaker.oscog-eem.161 uuid: d9d960b4-9f66-43a2-9d90-4fb58d541adc
  */
-static char __buildInfo[] = "CoInterpreterMT VMMaker.oscog-eem.159 uuid: cbf7f95a-6fe2-4578-898e-47afb8524be4 " __DATE__ ;
+static char __buildInfo[] = "CoInterpreterMT VMMaker.oscog-eem.161 uuid: d9d960b4-9f66-43a2-9d90-4fb58d541adc " __DATE__ ;
 char *__interpBuildInfo = __buildInfo;
 
 
@@ -2008,7 +2008,7 @@
 	/* 575 */ (void (*)(void))0,
  0 };
 static void (*externalPrimitiveTable[MaxExternalPrimitiveTableSize + 1 /* 4097 */])(void);
-const char *interpreterVersion = "Croquet Closure Cog MT VM [CoInterpreterMT VMMaker.oscog-eem.159]";
+const char *interpreterVersion = "Croquet Closure Cog MT VM [CoInterpreterMT VMMaker.oscog-eem.161]";
 sqInt minBackwardJumpCountForCompile = MinBackwardJumpCountForCompile /* 10 */;
 volatile int sendTrace;
 sqInt willNotThreadWarnCount;
@@ -22585,7 +22585,7 @@
 
 /*	This is a helper for primitiveObjectPointsTo so it *does not* check the
 	frameContext field because that is an implicit self-reference not present
-	in the stale .
+	in the state .
  */
 
 static sqInt



More information about the Vm-dev mailing list