diff --git a/libraries/AP_Scripting/generator/description/bindings.desc b/libraries/AP_Scripting/generator/description/bindings.desc index f269643e1d5..1b2f7e0c4ec 100644 --- a/libraries/AP_Scripting/generator/description/bindings.desc +++ b/libraries/AP_Scripting/generator/description/bindings.desc @@ -549,6 +549,7 @@ ap_object SocketAPM method is_connected boolean ap_object SocketAPM method pollout boolean uint32_t'skip_check ap_object SocketAPM method pollin boolean uint32_t'skip_check ap_object SocketAPM method reuseaddress boolean +ap_object SocketAPM manual sendfile SocketAPM_sendfile 1 ap_object SocketAPM manual close SocketAPM_close 0 ap_object SocketAPM manual recv SocketAPM_recv 1 ap_object SocketAPM manual accept SocketAPM_accept 1 diff --git a/libraries/AP_Scripting/lua_bindings.cpp b/libraries/AP_Scripting/lua_bindings.cpp index ac7b4b83349..8264233e137 100644 --- a/libraries/AP_Scripting/lua_bindings.cpp +++ b/libraries/AP_Scripting/lua_bindings.cpp @@ -19,6 +19,7 @@ #if AP_NETWORKING_ENABLED #include #endif +#include "lua/src/lauxlib.h" extern const AP_HAL::HAL& hal; @@ -836,6 +837,42 @@ int SocketAPM_close(lua_State *L) { return 0; } +/* + socket sendfile, for offloading file send to AP_Networking + */ +int SocketAPM_sendfile(lua_State *L) { + binding_argcheck(L, 2); + + SocketAPM *ud = *check_SocketAPM(L, 1); + + auto *scripting = AP::scripting(); + + if (scripting->num_net_sockets == 0) { + return luaL_argerror(L, 1, "socket close error"); + } + + auto *p = (luaL_Stream *)luaL_checkudata(L, 2, LUA_FILEHANDLE); + int fd = p->f->fd; + bool ret = false; + + // find the socket + for (uint8_t i=0; i_net_sockets[i] == ud) { + ret = AP::network().sendfile(ud, fd); + if (ret) { + // remove from scripting, leave socket and fd open + p->f->fd = -1; + scripting->_net_sockets[i] = nullptr; + scripting->num_net_sockets--; + } + break; + } + } + + lua_pushboolean(L, ret); + return 1; +} + /* receive from a socket to a lua string */ diff --git a/libraries/AP_Scripting/lua_bindings.h b/libraries/AP_Scripting/lua_bindings.h index 41adfd85965..3c5d9528c8d 100644 --- a/libraries/AP_Scripting/lua_bindings.h +++ b/libraries/AP_Scripting/lua_bindings.h @@ -19,6 +19,7 @@ int lua_get_SocketAPM(lua_State *L); int SocketAPM_recv(lua_State *L); int SocketAPM_accept(lua_State *L); int SocketAPM_close(lua_State *L); +int SocketAPM_sendfile(lua_State *L); int lua_mavlink_init(lua_State *L); int lua_mavlink_receive_chan(lua_State *L); int lua_mavlink_register_rx_msgid(lua_State *L);