From e17d60a8f3789a04301474c46584c361f60a09cd Mon Sep 17 00:00:00 2001
From: rswindell <>
Date: Sat, 22 Jun 2002 11:29:24 +0000
Subject: [PATCH] Fixed is_connected property value (was return true before
 connect was called). Created ip_address property: connected IP address in
 dotted decimal format.

---
 src/sbbs3/js_socket.c | 29 ++++++++++++++++++++---------
 1 file changed, 20 insertions(+), 9 deletions(-)

diff --git a/src/sbbs3/js_socket.c b/src/sbbs3/js_socket.c
index f0c7f89128..89b8be6b48 100644
--- a/src/sbbs3/js_socket.c
+++ b/src/sbbs3/js_socket.c
@@ -45,7 +45,9 @@ typedef struct
 	BOOL	external;	/* externally created, don't close */
 	BOOL	debug;
 	BOOL	nonblocking;
+	BOOL	is_connected;
 	int		last_error;
+	SOCKADDR_IN	addr;
 
 } private_t;
 
@@ -137,11 +139,12 @@ js_close(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 
 	close_socket(p->sock);
 
-	p->last_error=ERROR_VALUE;
+	p->last_error = ERROR_VALUE;
 
 	dbprintf(FALSE, p, "closed");
 
-	p->sock=INVALID_SOCKET; 
+	p->sock = INVALID_SOCKET; 
+	p->is_connected = FALSE;
 
 	return(JS_TRUE);
 }
@@ -179,7 +182,6 @@ js_connect(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 	ulong		ip_addr;
 	ushort		port;
 	JSString*	str;
-	SOCKADDR_IN	addr;
 	private_t*	p;
 
 	if((p=(private_t*)JS_GetPrivate(cx,obj))==NULL)
@@ -201,18 +203,19 @@ js_connect(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 
 	dbprintf(FALSE, p, "connecting to port %u at %s", port, JS_GetStringBytes(str));
 
-	memset(&addr,0,sizeof(addr));
-	addr.sin_addr.s_addr = ip_addr;
-	addr.sin_family = AF_INET;
-	addr.sin_port   = htons(port);
+	memset(&p->addr,0,sizeof(p->addr));
+	p->addr.sin_addr.s_addr = ip_addr;
+	p->addr.sin_family = AF_INET;
+	p->addr.sin_port   = htons(port);
 
-	if(connect(p->sock, (struct sockaddr *)&addr, sizeof(addr))!=0) {
+	if(connect(p->sock, (struct sockaddr *)&p->addr, sizeof(p->addr))!=0) {
 		p->last_error=ERROR_VALUE;
 		dbprintf(TRUE, p, "connect failed with error %d",ERROR_VALUE);
 		*rval = BOOLEAN_TO_JSVAL(JS_FALSE);
 		return(JS_TRUE);
 	}
 
+	p->is_connected = TRUE;
 	*rval = BOOLEAN_TO_JSVAL(JS_TRUE);
 	dbprintf(FALSE, p, "connected to port %u at %s", port, JS_GetStringBytes(str));
 
@@ -519,6 +522,7 @@ enum {
 	,SOCK_PROP_DEBUG
 	,SOCK_PROP_DESCRIPTOR
 	,SOCK_PROP_NONBLOCKING
+	,SOCK_PROP_IP_ADDRESS
 };
 
 static JSBool js_socket_set(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
@@ -573,7 +577,10 @@ static JSBool js_socket_get(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
 			*vp = INT_TO_JSVAL(p->last_error);
 			break;
 		case SOCK_PROP_IS_CONNECTED:
-			*vp = BOOLEAN_TO_JSVAL(socket_check(p->sock,NULL));
+			if(!p->is_connected)
+				*vp = JSVAL_FALSE;
+			else
+				*vp = BOOLEAN_TO_JSVAL(socket_check(p->sock,NULL));
 			break;
 		case SOCK_PROP_DATA_WAITING:
 			socket_check(p->sock,&rd);
@@ -595,6 +602,9 @@ static JSBool js_socket_get(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
 		case SOCK_PROP_NONBLOCKING:
 			*vp = BOOLEAN_TO_JSVAL(p->nonblocking);
 			break;
+		case SOCK_PROP_IP_ADDRESS:
+			*vp = STRING_TO_JSVAL(JS_NewStringCopyZ(cx,inet_ntoa(p->addr.sin_addr)));
+			break;
 	}
 
 	return(TRUE);
@@ -612,6 +622,7 @@ static struct JSPropertySpec js_socket_properties[] = {
 	{	"debug"				,SOCK_PROP_DEBUG		,JSPROP_ENUMERATE,	NULL,NULL},
 	{	"descriptor"		,SOCK_PROP_DESCRIPTOR	,JSPROP_ENUMERATE,	NULL,NULL},
 	{	"nonblocking"		,SOCK_PROP_NONBLOCKING	,JSPROP_ENUMERATE,	NULL,NULL},
+	{	"ip_address"		,SOCK_PROP_IP_ADDRESS	,SOCK_PROP_FLAGS,	NULL,NULL},
 	{0}
 };
 
-- 
GitLab