diff --git a/src/sbbs3/js_socket.c b/src/sbbs3/js_socket.c index 5fd64424951813219715b39b043a4ca5759d2bc7..0f777a9025166dd4c54bc7afa0d9fbf7284df5ea 100644 --- a/src/sbbs3/js_socket.c +++ b/src/sbbs3/js_socket.c @@ -73,11 +73,11 @@ static void dbprintf(BOOL error, private_t* p, char* fmt, ...) static JSBool js_socket_constructor(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { - int type=SOCK_STREAM; /* default = TCP */ + int32 type=SOCK_STREAM; /* default = TCP */ private_t* p; if(argc) - type=JSVAL_TO_INT(argv[0]); + JS_ValueToInt32(cx,argv[0],&type); *rval = JSVAL_VOID; @@ -343,6 +343,7 @@ js_sendto(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { char* cp; int len; + int32 i=0; ulong ip_addr; ushort port; JSString* data_str; @@ -374,7 +375,8 @@ js_sendto(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) } /* port */ - port = (ushort)JSVAL_TO_INT(argv[2]); + JS_ValueToInt32(cx, argv[2], &i); + port = (ushort)i; dbprintf(FALSE, p, "sending %d bytes to port %u at %s" ,len, port, JS_GetStringBytes(ip_str)); @@ -450,7 +452,7 @@ static JSBool js_recv(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { char* buf; - int len=512; + int32 len=512; JSString* str; private_t* p; @@ -459,7 +461,7 @@ js_recv(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) return(JS_FALSE); if(argc) - len = JSVAL_TO_INT(argv[0]); + JS_ValueToInt32(cx,argv[0],&len); if((buf=(char*)malloc(len+1))==NULL) { dbprintf(TRUE, p, "error allocating %u bytes",len+1); @@ -504,7 +506,7 @@ js_recvfrom(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) char* buf; char ip_addr[64]; char port[32]; - int len=512; + int32 len=512; JSString* str; JSObject* retobj; SOCKADDR_IN addr; @@ -516,7 +518,7 @@ js_recvfrom(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) return(JS_FALSE); if(argc) - len = JSVAL_TO_INT(argv[0]); + JS_ValueToInt32(cx,argv[0],&len); if((buf=(char*)malloc(len+1))==NULL) { dbprintf(TRUE, p, "error allocating %u bytes",len+1); @@ -565,7 +567,7 @@ static JSBool js_peek(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { char* buf; - int len; + int32 len; JSString* str; private_t* p; @@ -574,7 +576,7 @@ js_peek(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) return(JS_FALSE); if(argc) - len = JSVAL_TO_INT(argv[0]); + JS_ValueToInt32(cx,argv[0],&len); if((buf=(char*)malloc(len+1))==NULL) { dbprintf(TRUE, p, "error allocating %u bytes",len+1); @@ -605,7 +607,7 @@ js_recvline(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) char ch; char* buf; int i; - int len=512; + int32 len=512; BOOL rd; time_t start; time_t timeout=30; /* seconds */ @@ -616,7 +618,7 @@ js_recvline(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) return(JS_FALSE); if(argc) - len = JSVAL_TO_INT(argv[0]); + JS_ValueToInt32(cx,argv[0],&len); if((buf=(char*)malloc(len+1))==NULL) { dbprintf(TRUE, p, "error allocating %u bytes",len+1); @@ -624,7 +626,7 @@ js_recvline(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) } if(argc>1) - timeout = JSVAL_TO_INT(argv[1]); + JS_ValueToInt32(cx,argv[1],&timeout); start=time(NULL); for(i=0;i<len;) { @@ -727,9 +729,9 @@ js_ioctlsocket(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rva if((p=(private_t*)JS_GetPrivate(cx,obj))==NULL) return(JS_FALSE); - cmd = JSVAL_TO_INT(argv[0]); + JS_ValueToInt32(cx,argv[0],&cmd); if(argc>1) - arg = JSVAL_TO_INT(argv[1]); + JS_ValueToInt32(cx,argv[1],(int32*)&arg); if(ioctlsocket(p->sock,cmd,&arg)==0) *rval = INT_TO_JSVAL(arg); @@ -766,7 +768,7 @@ js_poll(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) if(JSVAL_IS_BOOLEAN(argv[argn])) poll_for_write=JSVAL_TO_BOOLEAN(argv[argn]); else if(JSVAL_IS_INT(argv[argn])) - tv.tv_sec = JSVAL_TO_INT(argv[0]); + tv.tv_sec = JSVAL_TO_INT(argv[argn]); } FD_ZERO(&socket_set); @@ -810,18 +812,18 @@ enum { #ifdef _DEBUG static char* socket_prop_desc[SOCK_PROPERTIES+1] = { - "last occurred error value" - ,"true if socket is in a connected state" - ,"true if data is waiting to be read" - ,"number of bytes waiting to be read" + "error status for the last socket operation that failed - READ ONLY" + ,"<i>true</i> if socket is in a connected state - READ ONLY" + ,"<i>true</i> if data is waiting to be read - READ ONLY" + ,"number of bytes waiting to be read - READ ONLY" ,"enable debug logging" ,"socket descriptor" - ,"non-blocking operation" - ,"local IP address" - ,"local TCP/UDP port" - ,"remote IP address" - ,"remote TCP/UDP port" - ,"socket type (TCP or UDP)" + ,"use non-blocking operation (default is <i>false</i>)" + ,"local IP address (in dotted-decimal format)" + ,"local TCP or UDP port number" + ,"remote IP address (in dotted-decimal format)" + ,"remote TCP or UDP port number" + ,"socket type, SOCK_STREAM (TCP) or SOCK_DGRAM (UDP)" ,NULL }; #endif @@ -840,16 +842,16 @@ static JSBool js_socket_set(JSContext *cx, JSObject *obj, jsval id, jsval *vp) switch(tiny) { case SOCK_PROP_DEBUG: - p->debug = JSVAL_TO_BOOLEAN(*vp); + JS_ValueToBoolean(cx,*vp,&(p->debug)); break; case SOCK_PROP_DESCRIPTOR: - p->sock = JSVAL_TO_INT(*vp); + JS_ValueToInt32(cx,*vp,(int32*)&(p->sock)); break; case SOCK_PROP_LAST_ERROR: - p->last_error = JSVAL_TO_INT(*vp); + JS_ValueToInt32(cx,*vp,(int32*)&(p->last_error)); break; case SOCK_PROP_NONBLOCKING: - p->nonblocking = JSVAL_TO_BOOLEAN(*vp); + JS_ValueToBoolean(cx,*vp,&(p->nonblocking)); ioctlsocket(p->sock,FIONBIO,(ulong*)&(p->nonblocking)); break; } @@ -980,36 +982,36 @@ static JSClass js_socket_class = { static jsMethodSpec js_socket_functions[] = { {"close", js_close, 0, JSTYPE_VOID, "" - ,JSDOCSTR("close socket") + ,JSDOCSTR("close (shutdown) the socket immediately") }, {"bind", js_bind, 0, JSTYPE_BOOLEAN, JSDOCSTR("[port]") - ,JSDOCSTR("bind socket to a port") + ,JSDOCSTR("bind socket to a port (number or service name)") }, - {"connect", js_connect, 2, JSTYPE_BOOLEAN, JSDOCSTR("string host, port") - ,JSDOCSTR("connect to a specific port at the specified IP address or hostname") + {"connect", js_connect, 2, JSTYPE_BOOLEAN, JSDOCSTR("host, port") + ,JSDOCSTR("connect to a remote port (number or service name) on the specified host (IP address or host name)") }, {"listen", js_listen, 0, JSTYPE_BOOLEAN, "" - ,JSDOCSTR("put socket in listening state (use before an accept)") + ,JSDOCSTR("place socket in a state to listen for incoming connections (use before an accept)") }, {"accept", js_accept, 0, JSTYPE_OBJECT, "" - ,JSDOCSTR("accept an incoming connection, returns a new Socket object") + ,JSDOCSTR("accept an incoming connection, returns a new <b>Socket</b> object representing the new connection") }, {"write", js_send, 1, JSTYPE_ALIAS }, - {"send", js_send, 1, JSTYPE_BOOLEAN, JSDOCSTR("string data") + {"send", js_send, 1, JSTYPE_BOOLEAN, JSDOCSTR("data") ,JSDOCSTR("send a string (AKA write)") }, - {"sendto", js_sendto, 3, JSTYPE_BOOLEAN, JSDOCSTR("string data, address, port") - ,JSDOCSTR("send a string to a specific address and port (typically used for UDP sockets)") + {"sendto", js_sendto, 3, JSTYPE_BOOLEAN, JSDOCSTR("data, address, port") + ,JSDOCSTR("send data to a specific host (IP address or host name) and port (number or service name), for UDP sockets") }, - {"sendfile", js_sendfile, 1, JSTYPE_BOOLEAN, JSDOCSTR("string filename") - ,JSDOCSTR("send a file") + {"sendfile", js_sendfile, 1, JSTYPE_BOOLEAN, JSDOCSTR("filename") + ,JSDOCSTR("send an entire file over the socket") }, {"read", js_recv, 1, JSTYPE_ALIAS }, {"recv", js_recv, 0, JSTYPE_STRING, JSDOCSTR("[maxlen]") ,JSDOCSTR("receive a string, default maxlen is 512 characters (AKA read)") }, {"peek", js_peek, 0, JSTYPE_STRING, JSDOCSTR("[maxlen]") - ,JSDOCSTR("receive a string, default maxlen is 512 characters, leave string in receive buffer") + ,JSDOCSTR("receive a string, default maxlen is 512 characters, leaves string in receive buffer") }, {"readline", js_recvline, 0, JSTYPE_ALIAS }, {"readln", js_recvline, 0, JSTYPE_ALIAS }, @@ -1017,19 +1019,19 @@ static jsMethodSpec js_socket_functions[] = { ,JSDOCSTR("receive a line-feed terminated string, default maxlen is 512 characters, default timeout is 30 seconds (AKA readline and readln)") }, {"recvfrom", js_recvfrom, 0, JSTYPE_OBJECT, JSDOCSTR("[maxlen]") - ,JSDOCSTR("receive a string from (typically UDP) socket, return address and port of sender") + ,JSDOCSTR("receive a string from (typically UDP) socket, returns object with <i>ip_address</i> and <i>port</i> of sender along with <i>data</i>") }, - {"getoption", js_getsockopt, 1, JSTYPE_NUMBER, JSDOCSTR("number option") - ,JSDOCSTR("get socket option value") + {"getoption", js_getsockopt, 1, JSTYPE_NUMBER, JSDOCSTR("option") + ,JSDOCSTR("get socket option value, option may be socket option name (see sockopts in sockdefs.js) or number") }, - {"setoption", js_setsockopt, 2, JSTYPE_BOOLEAN, JSDOCSTR("number option, value") - ,JSDOCSTR("set socket option value") + {"setoption", js_setsockopt, 2, JSTYPE_BOOLEAN, JSDOCSTR("option, value") + ,JSDOCSTR("set socket option value, option may be socket option name (see sockopts in sockdefs.js) or number") }, - {"ioctl", js_ioctlsocket, 1, JSTYPE_NUMBER, JSDOCSTR("number cmd [,arg]") - ,JSDOCSTR("send socket IOCTL") + {"ioctl", js_ioctlsocket, 1, JSTYPE_NUMBER, JSDOCSTR("command [,argument]") + ,JSDOCSTR("send socket IOCTL (advanced)") }, {"poll", js_poll, 1, JSTYPE_NUMBER, JSDOCSTR("[number timeout] [,bool write]") - ,JSDOCSTR("poll socket for read or write ability (defaults to read), default timeout value is 0 seconds (immediate timeout)") + ,JSDOCSTR("poll socket for read or write ability (default is <i>read</i>), default timeout value is 0 seconds (immediate timeout)") }, {0} };