diff --git a/src/sbbs3/js_bbs.cpp b/src/sbbs3/js_bbs.cpp index 3f94b952e3d9696d6e50328b63df6ca9dcaad2b1..d3233d44697a6ddec22895a05acd64dae30ed61e 100644 --- a/src/sbbs3/js_bbs.cpp +++ b/src/sbbs3/js_bbs.cpp @@ -2903,6 +2903,7 @@ js_telnet_gate(JSContext *cx, uintN argc, jsval *arglist) jsval *argv=JS_ARGV(cx, arglist); char* addr; uint32 mode=0; + uint32 timeout=10; JSString* js_addr; sbbs_t* sbbs; jsrefcount rc; @@ -2928,15 +2929,22 @@ js_telnet_gate(JSContext *cx, uintN argc, jsval *arglist) return JS_FALSE; } } + if(argc>2 && JSVAL_IS_NUMBER(argv[2])) { + if(!JS_ValueToECMAUint32(cx,argv[2],&timeout)) { + free(addr); + return JS_FALSE; + } + } rc=JS_SUSPENDREQUEST(cx); - sbbs->telnet_gate(addr,mode); + sbbs->telnet_gate(addr,mode,timeout); free(addr); JS_RESUMEREQUEST(cx, rc); return(JS_TRUE); } +#define TG_MODE_UNSPECIFIED ~0 static JSBool js_rlogin_gate(JSContext *cx, uintN argc, jsval *arglist) { @@ -2947,7 +2955,8 @@ js_rlogin_gate(JSContext *cx, uintN argc, jsval *arglist) char* server_user_name=NULL; char* term_type=NULL; bool fail = false; - uint32 mode = 0; + uint32 mode = TG_MODE_UNSPECIFIED; + uint32 timeout = 10; JSString* js_str; sbbs_t* sbbs; jsrefcount rc; @@ -2982,15 +2991,24 @@ js_rlogin_gate(JSContext *cx, uintN argc, jsval *arglist) JSSTRING_TO_MSTRING(cx, js_str, term_type, NULL); } } else if(JSVAL_IS_NUMBER(argv[argn])) { - if(!JS_ValueToECMAUint32(cx,argv[argn],&mode)) { - fail = true; - break; + if(mode == TG_MODE_UNSPECIFIED) { + if(!JS_ValueToECMAUint32(cx,argv[argn],&mode)) { + fail = true; + break; + } + } else { + if(!JS_ValueToECMAUint32(cx,argv[argn],&timeout)) { + fail = true; + break; + } } } } if(!fail) { + if(mode == TG_MODE_UNSPECIFIED) + mode = 0; rc=JS_SUSPENDREQUEST(cx); - sbbs->telnet_gate(addr,mode|TG_RLOGIN,client_user_name,server_user_name,term_type); + sbbs->telnet_gate(addr,mode|TG_RLOGIN,timeout,client_user_name,server_user_name,term_type); JS_RESUMEREQUEST(cx, rc); } FREE_AND_NULL(addr); @@ -4605,12 +4623,12 @@ static jsSyncMethodSpec js_bbs_functions[] = { "(see <tt>EVENT_*</tt> in <tt>sbbsdefs.js</tt> for valid values)") ,310 }, - {"telnet_gate", js_telnet_gate, 1, JSTYPE_VOID, JSDOCSTR("address [,mode=<tt>TG_NONE</tt>]") - ,JSDOCSTR("external Telnet gateway (see <tt>TG_*</tt> in <tt>sbbsdefs.js</tt> for valid <i>mode</i> flags.)") + {"telnet_gate", js_telnet_gate, 1, JSTYPE_VOID, JSDOCSTR("address [,mode=<tt>TG_NONE</tt>] [,timeout=<tt>10</tt>]") + ,JSDOCSTR("external Telnet gateway (see <tt>TG_*</tt> in <tt>sbbsdefs.js</tt> for valid <i>mode</i> flags).") ,310 }, - {"rlogin_gate", js_rlogin_gate, 1, JSTYPE_VOID, JSDOCSTR("address [,client-user-name=<tt>user.alias</tt>, server-user-name=<tt>user.name</tt>, terminal=<tt>console.terminal</tt>] [,mode=<tt>TG_NONE</tt>]") - ,JSDOCSTR("external RLogin gateway (see <tt>TG_*</tt> in <tt>sbbsdefs.js</tt> for valid <i>mode</i> flags.)") + {"rlogin_gate", js_rlogin_gate, 1, JSTYPE_VOID, JSDOCSTR("address [,client-user-name=<tt>user.alias</tt>, server-user-name=<tt>user.name</tt>, terminal=<tt>console.terminal</tt>] [,mode=<tt>TG_NONE</tt>] [,timeout=<tt>10</tt>]") + ,JSDOCSTR("external RLogin gateway (see <tt>TG_*</tt> in <tt>sbbsdefs.js</tt> for valid <i>mode</i> flags).") ,316 }, /* security */ diff --git a/src/sbbs3/sbbs.h b/src/sbbs3/sbbs.h index cdb8cf1d03dca5fafcecc2b2589d6112f294c07b..b8298d725eef4b1584f190b725e83b141cf8fb2b 100644 --- a/src/sbbs3/sbbs.h +++ b/src/sbbs3/sbbs.h @@ -1180,7 +1180,7 @@ public: void catsyslog(int crash); /* telgate.cpp */ - void telnet_gate(char* addr, ulong mode, char* client_user_name=NULL, char* server_user_name=NULL, char* term_type=NULL); // See TG_* for mode bits + void telnet_gate(char* addr, ulong mode, unsigned timeout=10, char* client_user_name=NULL, char* server_user_name=NULL, char* term_type=NULL); // See TG_* for mode bits }; diff --git a/src/sbbs3/telgate.cpp b/src/sbbs3/telgate.cpp index 18e300008f99ed0361d7743742431953fd7e328a..77a7ce3743cb2fe125c5aecae9a50a61e410d1fb 100644 --- a/src/sbbs3/telgate.cpp +++ b/src/sbbs3/telgate.cpp @@ -22,7 +22,7 @@ #include "sbbs.h" #include "telnet.h" -void sbbs_t::telnet_gate(char* destaddr, ulong mode, char* client_user_name, char* server_user_name, char* term_type) +void sbbs_t::telnet_gate(char* destaddr, ulong mode, unsigned timeout, char* client_user_name, char* server_user_name, char* term_type) { char* p; uchar buf[512]; @@ -76,15 +76,6 @@ void sbbs_t::telnet_gate(char* destaddr, ulong mode, char* client_user_name, cha addr.sin_family = AF_INET; addr.sin_port = htons(port); - if((i=connect(remote_socket, (struct sockaddr *)&addr, sizeof(addr)))!=0) { - lprintf(LOG_NOTICE,"!TELGATE ERROR %d (%d) connecting to server: %s" - ,i,ERROR_VALUE, destaddr); - bprintf("!ERROR %d (%d) connecting to server: %s\r\n" - ,i,ERROR_VALUE, destaddr); - close_socket(remote_socket); - return; - } - l=1; if((i = ioctlsocket(remote_socket, FIONBIO, &l))!=0) { @@ -99,6 +90,15 @@ void sbbs_t::telnet_gate(char* destaddr, ulong mode, char* client_user_name, cha ,mode&TG_RLOGIN ? "RLogin" : "Telnet" ,destaddr,port,remote_socket); + if((i=nonblocking_connect(remote_socket, (struct sockaddr *)&addr, sizeof(addr), timeout))!=0) { + lprintf(LOG_NOTICE,"!TELGATE ERROR %d (%d) connecting to server: %s" + ,i,ERROR_VALUE, destaddr); + bprintf("!ERROR %d (%d) connecting to server: %s\r\n" + ,i,ERROR_VALUE, destaddr); + close_socket(remote_socket); + return; + } + if(!(mode&TG_CTRLKEYS)) console|=CON_RAW_IN;