diff --git a/src/sbbs3/js_socket.c b/src/sbbs3/js_socket.c index 90ec8b731ab43b92103f9deb63c6341e20f3e6cb..4c0983ea75156e6d5cc1b9fd6142a9f61ccd653b 100644 --- a/src/sbbs3/js_socket.c +++ b/src/sbbs3/js_socket.c @@ -878,7 +878,7 @@ js_getsockopt(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval return(JS_FALSE); } - opt = sockopt(JS_GetStringBytes(JS_ValueToString(cx,argv[0])),&level); + opt = getSocketOptionByName(JS_GetStringBytes(JS_ValueToString(cx,argv[0])),&level); len = sizeof(val); if(opt!=-1 && getsockopt(p->sock, level, opt, (void*)&val, &len)==0) { @@ -908,7 +908,7 @@ js_setsockopt(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval return(JS_FALSE); } - opt = sockopt(JS_GetStringBytes(JS_ValueToString(cx,argv[0])),&level); + opt = getSocketOptionByName(JS_GetStringBytes(JS_ValueToString(cx,argv[0])),&level); JS_ValueToInt32(cx,argv[1],&val); *rval = BOOLEAN_TO_JSVAL( diff --git a/src/sbbs3/sbbs.h b/src/sbbs3/sbbs.h index 2449effd510c7df3090fffe4739baebcef0aee6c..558b877fa52c21048f79c08c61b58498b5d926fd 100644 --- a/src/sbbs3/sbbs.h +++ b/src/sbbs3/sbbs.h @@ -873,7 +873,6 @@ extern "C" { DLLEXPORT BOOL DLLCALL putmsgptrs(scfg_t* cfg, uint usernumber, subscan_t* subscan); /* sockopt.c */ - DLLEXPORT int DLLCALL sockopt(char* str, int* level); DLLEXPORT int DLLCALL set_socket_options(scfg_t* cfg, SOCKET sock, const char* section ,char* error, size_t errlen); diff --git a/src/sbbs3/sockopts.c b/src/sbbs3/sockopts.c index 3c91df591a612561ba72ce3eb347665146b1a5c6..5d0e4311e2da665efccc2cd26e22d781c51786e8 100644 --- a/src/sbbs3/sockopts.c +++ b/src/sbbs3/sockopts.c @@ -38,134 +38,6 @@ #include "sbbs.h" #include "ini_file.h" /* ini file API */ -static struct { - char* name; - int level; - int value; -} option_names[] = { - { "TYPE", SOL_SOCKET, SO_TYPE }, - { "DEBUG", SOL_SOCKET, SO_DEBUG }, - { "LINGER", SOL_SOCKET, SO_LINGER }, - { "SNDBUF", SOL_SOCKET, SO_SNDBUF }, - { "RCVBUF", SOL_SOCKET, SO_RCVBUF }, - { "SNDLOWAT", SOL_SOCKET, SO_SNDLOWAT }, - { "RCVLOWAT", SOL_SOCKET, SO_RCVLOWAT }, - { "SNDTIMEO", SOL_SOCKET, SO_SNDTIMEO }, - { "RCVTIMEO", SOL_SOCKET, SO_RCVTIMEO }, - { "REUSEADDR", SOL_SOCKET, SO_REUSEADDR }, - { "KEEPALIVE", SOL_SOCKET, SO_KEEPALIVE }, - { "DONTROUTE", SOL_SOCKET, SO_DONTROUTE }, - { "BROADCAST", SOL_SOCKET, SO_BROADCAST }, - { "OOBINLINE", SOL_SOCKET, SO_OOBINLINE }, -#ifdef SO_ACCEPTCONN - { "ACCEPTCONN", SOL_SOCKET, SO_ACCEPTCONN }, -#endif - - /* IPPROTO-level socket options */ - { "TCP_NODELAY", IPPROTO_TCP, TCP_NODELAY }, - /* The following are platform-specific */ -#ifdef TCP_MAXSEG - { "TCP_MAXSEG", IPPROTO_TCP, TCP_MAXSEG }, -#endif -#ifdef TCP_CORK - { "TCP_CORK", IPPROTO_TCP, TCP_CORK }, -#endif -#ifdef TCP_KEEPIDLE - { "TCP_KEEPIDLE", IPPROTO_TCP, TCP_KEEPIDLE }, -#endif -#ifdef TCP_KEEPINTVL - { "TCP_KEEPINTVL", IPPROTO_TCP, TCP_KEEPINTVL }, -#endif -#ifdef TCP_KEEPCNT - { "TCP_KEEPCNT", IPPROTO_TCP, TCP_KEEPCNT }, -#endif -#ifdef TCP_SYNCNT - { "TCP_SYNCNT", IPPROTO_TCP, TCP_SYNCNT }, -#endif -#ifdef TCP_LINGER2 - { "TCP_LINGER2", IPPROTO_TCP, TCP_LINGER2 }, -#endif -#ifdef TCP_DEFER_ACCEPT - { "TCP_DEFER_ACCEPT", IPPROTO_TCP, TCP_DEFER_ACCEPT }, -#endif -#ifdef TCP_WINDOW_CLAMP - { "TCP_WINDOW_CLAMP", IPPROTO_TCP, TCP_WINDOW_CLAMP }, -#endif -#ifdef TCP_QUICKACK - { "TCP_QUICKACK", IPPROTO_TCP, TCP_QUICKACK }, -#endif -#ifdef TCP_NOPUSH - { "TCP_NOPUSH", IPPROTO_TCP, TCP_NOPUSH }, -#endif -#ifdef TCP_NOOPT - { "TCP_NOOPT", IPPROTO_TCP, TCP_NOOPT }, -#endif - { NULL } -}; - -/* This function is used by js_socket.c -> js_get/setsockopt() */ -int DLLCALL sockopt(char* str, int* level) -{ - int i; - - *level=SOL_SOCKET; /* default option level */ - for(i=0;option_names[i].name;i++) { - if(stricmp(str,option_names[i].name)==0) { - *level = option_names[i].level; - return(option_names[i].value); - } - } - if(!isdigit(str[0])) /* unknown option name */ - return(-1); - return(strtoul(str,NULL,0)); -} - -static int iniGetSocketOptions(str_list_t list, SOCKET sock, const char* section - ,char* error, size_t errlen) -{ - int i; - int result; - char* name; - BYTE* vp; - socklen_t len; - int option; - int level; - int value; - LINGER linger; - - for(i=0;option_names[i].name!=NULL;i++) { - name = option_names[i].name; - if(!iniValueExists(list, section, name)) - continue; - value=iniGetInteger(list, section, name, 0); - - vp=(BYTE*)&value; - len=sizeof(value); - - level = option_names[i].level; - option = option_names[i].value; - - if(option == SO_LINGER) { - if(value) { - linger.l_onoff = TRUE; - linger.l_linger = value; - } else { - ZERO_VAR(linger); - } - vp=(BYTE*)&linger; - len=sizeof(linger); - } - - if((result=setsockopt(sock,level,option,vp,len)) != 0) { - safe_snprintf(error,errlen,"%d setting socket option (%s, %d) to %d" - ,ERROR_VALUE, name, option, value); - return(result); - } - } - - return(0); -} - int DLLCALL set_socket_options(scfg_t* cfg, SOCKET sock, const char* section, char* error, size_t errlen) { char cfgfile[MAX_PATH+1]; @@ -190,12 +62,12 @@ int DLLCALL set_socket_options(scfg_t* cfg, SOCKET sock, const char* section, ch return(result); } - result=iniGetSocketOptions(list,sock,ROOT_SECTION,error,errlen); + result=iniGetSocketOptions(list,ROOT_SECTION,sock,error,errlen); if(result==0) - result=iniGetSocketOptions(list,sock,type==SOCK_STREAM ? "tcp":"udp",error,errlen); + result=iniGetSocketOptions(list,type==SOCK_STREAM ? "tcp":"udp",sock,error,errlen); if(result==0 && section!=NULL) - result=iniGetSocketOptions(list,sock,section,error,errlen); + result=iniGetSocketOptions(list,section,sock,error,errlen); iniFreeStringList(list);