From 56cc12509cf8b266a39131e0fa7b2dbbc48ce63e Mon Sep 17 00:00:00 2001 From: Mark Lakes Date: Tue, 27 Mar 2018 09:48:06 +0200 Subject: [PATCH] MINOR: lua: allow socket api settimeout to accept integers, float, and doubles Instead of hlua_socket_settimeout() accepting only integers, allow user to specify float and double as well. Convert to milliseconds much like cli_parse_set_timeout but also sanity check the value. http://w3.impa.br/~diego/software/luasocket/tcp.html#settimeout T. Fournier edit: The main goal is to keep compatibility with the LuaSocket API. This API only accept seconds, so using a float to specify milliseconds is an acceptable way. Update doc. --- doc/lua-api/index.rst | 5 +++-- src/hlua.c | 15 ++++++++++++--- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/doc/lua-api/index.rst b/doc/lua-api/index.rst index e7aa425d95..a83bbde014 100644 --- a/doc/lua-api/index.rst +++ b/doc/lua-api/index.rst @@ -1906,12 +1906,13 @@ Socket class The amount of time to wait is specified as the value parameter, in seconds. - The timeout modes are bot implemented, the only settable timeout is the + The timeout modes are not implemented, the only settable timeout is the inactivity time waiting for complete the internal buffer send or waiting for receive data. :param class_socket socket: Is the manipulated Socket. - :param integer value: The timeout value. + :param float value: The timeout value. Use flotting point to specify + milliseconds. .. _regex_class: diff --git a/src/hlua.c b/src/hlua.c index 633841c6d7..60cf8f9484 100644 --- a/src/hlua.c +++ b/src/hlua.c @@ -11,6 +11,7 @@ */ #include +#include #include #include @@ -2464,6 +2465,7 @@ __LJMP static int hlua_socket_settimeout(struct lua_State *L) { struct hlua_socket *socket; int tmout; + double dtmout; struct xref *peer; struct appctx *appctx; struct stream_interface *si; @@ -2472,19 +2474,26 @@ __LJMP static int hlua_socket_settimeout(struct lua_State *L) MAY_LJMP(check_args(L, 2, "settimeout")); socket = MAY_LJMP(hlua_checksocket(L, 1)); - tmout = MAY_LJMP(luaL_checkinteger(L, 2)) * 1000; + + /* round up for inputs that are fractions and convert to millis */ + dtmout = (0.5 + MAY_LJMP(luaL_checknumber(L, 2))) * 1000; /* Check for negative values */ - if (tmout < 0) + if (dtmout < 0) WILL_LJMP(luaL_error(L, "settimeout: cannot set negatives values")); + if (dtmout > INT_MAX) /* overflow check */ + WILL_LJMP(luaL_error(L, "settimeout: cannot set values larger than %d", INT_MAX)); + + tmout = MS_TO_TICKS((int)dtmout); + /* Check if we run on the same thread than the xreator thread. * We cannot access to the socket if the thread is different. */ if (socket->tid != tid) WILL_LJMP(luaL_error(L, "connect: cannot use socket on other thread")); - /* check for connection break. If some data where read, return it. */ + /* check for connection break. If some data were read, return it. */ peer = xref_get_peer_and_lock(&socket->xref); if (!peer) { hlua_pusherror(L, "socket: not yet initialised, you can't set timeouts.");