@@ -1310,6 +1310,10 @@ static ERL_NIF_TERM esock_getopt_int_opt(ErlNifEnv* env,
13101310 ESockDescriptor * descP ,
13111311 int level ,
13121312 int opt );
1313+ static ERL_NIF_TERM esock_getopt_uint_opt (ErlNifEnv * env ,
1314+ ESockDescriptor * descP ,
1315+ int level ,
1316+ int opt );
13131317static ERL_NIF_TERM esock_getopt_size_opt (ErlNifEnv * env ,
13141318 ESockDescriptor * descP ,
13151319 int level ,
@@ -1719,6 +1723,11 @@ static ERL_NIF_TERM esock_setopt_int_opt(ErlNifEnv* env,
17191723 int level ,
17201724 int opt ,
17211725 ERL_NIF_TERM eVal );
1726+ static ERL_NIF_TERM esock_setopt_uint_opt (ErlNifEnv * env ,
1727+ ESockDescriptor * descP ,
1728+ int level ,
1729+ int opt ,
1730+ ERL_NIF_TERM eVal );
17221731#if (defined(SO_RCVTIMEO ) || defined(SO_SNDTIMEO )) \
17231732 && defined(ESOCK_USE_RCVSNDTIMEO )
17241733static ERL_NIF_TERM esock_setopt_timeval_opt (ErlNifEnv * env ,
@@ -3762,7 +3771,14 @@ static struct ESockOpt optLevelTCP[] =
37623771#endif
37633772 & esock_atom_nopush },
37643773 {0 , NULL , NULL , & esock_atom_syncnt },
3765- {0 , NULL , NULL , & esock_atom_user_timeout }
3774+ {
3775+ #ifdef TCP_USER_TIMEOUT
3776+ TCP_USER_TIMEOUT ,
3777+ esock_setopt_uint_opt , esock_getopt_uint_opt ,
3778+ #else
3779+ 0 , NULL , NULL ,
3780+ #endif
3781+ & esock_atom_user_timeout }
37663782
37673783 };
37683784
@@ -8302,6 +8318,31 @@ ERL_NIF_TERM esock_setopt_int_opt(ErlNifEnv* env,
83028318
83038319
83048320
8321+ /* esock_setopt_uint_opt - set an option that has an unsigned integer value
8322+ */
8323+
8324+ static
8325+ ERL_NIF_TERM esock_setopt_uint_opt (ErlNifEnv * env ,
8326+ ESockDescriptor * descP ,
8327+ int level ,
8328+ int opt ,
8329+ ERL_NIF_TERM eVal )
8330+ {
8331+ ERL_NIF_TERM result ;
8332+ unsigned int val ;
8333+
8334+ if (GET_UINT (env , eVal , & val )) {
8335+ result =
8336+ esock_setopt_level_opt (env , descP , level , opt ,
8337+ & val , sizeof (val ));
8338+ } else {
8339+ result = esock_make_invalid (env , esock_atom_value );
8340+ }
8341+ return result ;
8342+ }
8343+
8344+
8345+
83058346/* esock_setopt_str_opt - set an option that has an string value
83068347 */
83078348
@@ -9908,6 +9949,24 @@ ERL_NIF_TERM esock_getopt_int_opt(ErlNifEnv* env,
99089949
99099950
99109951
9952+ /* esock_getopt_uint_opt - get an unsigned integer option
9953+ */
9954+ static
9955+ ERL_NIF_TERM esock_getopt_uint_opt (ErlNifEnv * env ,
9956+ ESockDescriptor * descP ,
9957+ int level ,
9958+ int opt )
9959+ {
9960+ unsigned int val ;
9961+
9962+ if (! esock_getopt_uint (descP -> sock , level , opt , & val ))
9963+ return esock_make_error_errno (env , sock_errno ());
9964+
9965+ return esock_make_ok2 (env , MKUI (env , val ));
9966+ }
9967+
9968+
9969+
99119970/* esock_getopt_int - get an integer option
99129971 */
99139972extern
@@ -9932,6 +9991,30 @@ BOOLEAN_T esock_getopt_int(SOCKET sock,
99329991
99339992
99349993
9994+ /* esock_getopt_uint - get an unsigned integer option
9995+ */
9996+ extern
9997+ BOOLEAN_T esock_getopt_uint (SOCKET sock ,
9998+ int level ,
9999+ int opt ,
10000+ unsigned int * valP )
10001+ {
10002+ unsigned int val = 0 ;
10003+ SOCKOPTLEN_T valSz = sizeof (val );
10004+
10005+ #ifdef __WIN32__
10006+ if (sock_getopt (sock , level , opt , (char * ) & val , & valSz ) != 0 )
10007+ #else
10008+ if (sock_getopt (sock , level , opt , & val , & valSz ) != 0 )
10009+ #endif
10010+ return FALSE;
10011+
10012+ * valP = val ;
10013+ return TRUE;
10014+ }
10015+
10016+
10017+
993510018static
993610019ERL_NIF_TERM esock_getopt_size_opt (ErlNifEnv * env ,
993710020 ESockDescriptor * descP ,
0 commit comments