From 2285c28566e76d0c3c68e90d9ac66e8da7ac18ea Mon Sep 17 00:00:00 2001
From: rswindell <>
Date: Fri, 23 Aug 2002 05:18:03 +0000
Subject: [PATCH] Created sendto() method - usage: sendto(data,ip_addr,port),
 connect() call is no longer needed for UDP sockets.

---
 src/sbbs3/js_socket.c | 59 +++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 59 insertions(+)

diff --git a/src/sbbs3/js_socket.c b/src/sbbs3/js_socket.c
index 84873ebb1e..763bb602e9 100644
--- a/src/sbbs3/js_socket.c
+++ b/src/sbbs3/js_socket.c
@@ -252,6 +252,64 @@ js_send(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 	return(JS_TRUE);
 }
 
+static JSBool
+js_sendto(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
+{
+	char*		cp;
+	int			len;
+	ulong		ip_addr;
+	ushort		port;
+	JSString*	data_str;
+	JSString*	ip_str;
+	private_t*	p;
+	SOCKADDR_IN	addr;
+
+	if((p=(private_t*)JS_GetPrivate(cx,obj))==NULL)
+		return(JS_FALSE);
+
+	*rval = BOOLEAN_TO_JSVAL(JS_FALSE);
+
+	if(argc<3)
+		return(JS_FALSE);
+
+	/* data */
+	data_str = JS_ValueToString(cx, argv[0]);
+	cp = JS_GetStringBytes(data_str);
+	len = strlen(cp);
+
+	/* address */
+	ip_str = JS_ValueToString(cx, argv[1]);
+	dbprintf(FALSE, p, "resolving hostname: %s", JS_GetStringBytes(ip_str));
+	if((ip_addr=resolve_ip(JS_GetStringBytes(ip_str)))==0) {
+		p->last_error=ERROR_VALUE;
+		dbprintf(TRUE, p, "resolve_ip failed with error %d",ERROR_VALUE);
+		*rval = BOOLEAN_TO_JSVAL(JS_FALSE);
+		return(JS_TRUE);
+	}
+
+	/* port */
+	port = (ushort)JSVAL_TO_INT(argv[2]);
+
+	dbprintf(FALSE, p, "sending %d bytes to port %u at %s"
+		,len, port, JS_GetStringBytes(ip_str));
+
+	memset(&addr,0,sizeof(addr));
+	addr.sin_addr.s_addr = ip_addr;
+	addr.sin_family = AF_INET;
+	addr.sin_port   = htons(port);
+
+	if(sendto(p->sock,cp,len,0 /* flags */,(SOCKADDR*)&addr,sizeof(addr))==len) {
+		dbprintf(FALSE, p, "sent %u bytes",len);
+		*rval = BOOLEAN_TO_JSVAL(JS_TRUE);
+	} else {
+		p->last_error=ERROR_VALUE;
+		dbprintf(TRUE, p, "send of %u bytes failed",len);
+	}
+
+	return(JS_TRUE);
+}
+
+
 static JSBool
 js_sendfile(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 {
@@ -801,6 +859,7 @@ static JSFunctionSpec js_socket_functions[] = {
 	{"bind",			js_bind,			0},		/* bind to a port */
 	{"connect",         js_connect,         2},		/* connect to an IP address and port */
 	{"send",			js_send,			1},		/* send a string */
+	{"sendto",			js_sendto,			3},		/* send a string to address and port */
 	{"sendfile",		js_sendfile,		1},		/* send a file */
 	{"write",			js_send,			1},		/* send a string */
 	{"recv",			js_recv,			0},		/* receive a string */
-- 
GitLab