From: Jason Ish Date: Mon, 1 May 2017 23:13:20 +0000 (-0600) Subject: rust: lua wrapper X-Git-Tag: suricata-4.0.0-beta1~28 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=9d687025e2cc6bde469096f13d8efd32b568b776;p=thirdparty%2Fsuricata.git rust: lua wrapper Rust wrapper for working with lua state. --- diff --git a/configure.ac b/configure.ac index c0b037c656..42d0892499 100644 --- a/configure.ac +++ b/configure.ac @@ -1791,6 +1791,8 @@ fi fi + AM_CONDITIONAL([HAVE_LUA], [test "x$enable_lua" != "xno"]) + # libgeoip AC_ARG_ENABLE(geoip, AS_HELP_STRING([--enable-geoip],[Enable GeoIP support]), diff --git a/rust/Cargo.toml.in b/rust/Cargo.toml.in index 010cf0a487..dd90d4c45d 100644 --- a/rust/Cargo.toml.in +++ b/rust/Cargo.toml.in @@ -8,6 +8,9 @@ crate-type = ["staticlib"] [profile.release] debug = true +[features] +lua = [] + [dependencies] nom = "2.1.0" libc = "0.2.0" diff --git a/rust/Makefile.am b/rust/Makefile.am index e16131a11c..a3255d995b 100644 --- a/rust/Makefile.am +++ b/rust/Makefile.am @@ -25,14 +25,21 @@ else endif if HAVE_RUST + +FEATURES = + +if HAVE_LUA +FEATURES += lua +endif + all-local: if HAVE_PYTHON cd $(top_srcdir)/rust && CARGO_TARGET_DIR=$(abs_builddir)/target \ python ./gen-c-headers.py && \ - cargo build $(RELEASE) $(FROZEN) + cargo build $(RELEASE) $(FROZEN) --features "$(FEATURES)" else cd $(top_srcdir)/rust && CARGO_TARGET_DIR=$(abs_builddir)/target \ - cargo build $(RELEASE) $(FROZEN) + cargo build $(RELEASE) $(FROZEN) --features "$(FEATURES)" endif clean-local: diff --git a/rust/src/lib.rs b/rust/src/lib.rs index f88c8a8298..e1803588eb 100644 --- a/rust/src/lib.rs +++ b/rust/src/lib.rs @@ -24,4 +24,8 @@ pub mod log; pub mod core; pub mod conf; pub mod json; + +#[cfg(feature = "lua")] +pub mod lua; + pub mod dns; diff --git a/rust/src/lua.rs b/rust/src/lua.rs new file mode 100644 index 0000000000..f225dccccd --- /dev/null +++ b/rust/src/lua.rs @@ -0,0 +1,62 @@ +/* Copyright (C) 2017 Open Information Security Foundation + * + * You can copy, redistribute or modify this Program under the terms of + * the GNU General Public License version 2 as published by the Free + * Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * version 2 along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + +use std::ffi::CString; +use std::os::raw::c_char; +use std::os::raw::c_int; +use std::os::raw::c_long; + +/// The Rust place holder for lua_State. +pub enum CLuaState {} + +extern { + fn lua_createtable(lua: *mut CLuaState, narr: c_int, nrec: c_int); + fn lua_settable(lua: *mut CLuaState, idx: c_long); + fn lua_pushstring(lua: *mut CLuaState, s: *const c_char); + fn lua_pushinteger(lua: *mut CLuaState, n: c_long); +} + +pub struct LuaState { + pub lua: *mut CLuaState, +} + +impl LuaState { + + pub fn newtable(&self) { + unsafe { + lua_createtable(self.lua, 0, 0); + } + } + + pub fn settable(&self, idx: i64) { + unsafe { + lua_settable(self.lua, idx); + } + } + + pub fn pushstring(&self, val: &str) { + unsafe { + lua_pushstring(self.lua, CString::new(val).unwrap().as_ptr()); + } + } + + pub fn pushinteger(&self, val: i64) { + unsafe { + lua_pushinteger(self.lua, val); + } + } +}