--- /dev/null
+/* 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.
+ */
+
+extern crate libc;
+
+use std::os::raw::c_char;
+use std::ffi::{CString};
+use std::path::Path;
+
+pub enum Level {
+ NotSet = -1,
+ None = 0,
+ Emergency,
+ Alert,
+ Critical,
+ Error,
+ Warning,
+ Notice,
+ Info,
+ Perf,
+ Config,
+ Debug,
+}
+
+pub static mut LEVEL: i32 = Level::NotSet as i32;
+
+extern {
+ fn SCLogMessage(level: libc::c_int,
+ filename: *const c_char,
+ line: libc::c_uint,
+ function: *const c_char,
+ code: libc::c_int,
+ message: *const c_char) -> libc::c_int;
+}
+
+pub fn get_log_level() -> i32 {
+ unsafe {
+ LEVEL
+ }
+}
+
+fn basename(filename: &str) -> &str {
+ let path = Path::new(filename);
+ for os_str in path.file_name() {
+ for basename in os_str.to_str() {
+ return basename;
+ }
+ }
+ return filename;
+}
+
+pub fn sclog(level: Level, file: &str, line: u32, function: &str,
+ code: i32, message: &str)
+{
+ let filename = basename(file);
+
+ unsafe {
+ SCLogMessage(level as i32,
+ CString::new(filename).unwrap().as_ptr(),
+ line,
+ CString::new(function).unwrap().as_ptr(),
+ code,
+ CString::new(message).unwrap().as_ptr());
+ }
+}
+
+/// Return the function name, but for now just return <rust> as Rust
+/// has no macro to return the function name, but may in the future,
+/// see: https://github.com/rust-lang/rfcs/pull/1719
+macro_rules!function {
+ () => {{ "<rust>" }}
+}
+
+#[macro_export]
+macro_rules!do_log {
+ ($level:expr, $file:expr, $line:expr, $function:expr, $code:expr,
+ $($arg:tt)*) => {
+ if get_log_level() >= $level as i32 {
+ sclog($level, $file, $line, $function, $code,
+ &(format!($($arg)*)));
+ }
+ }
+}
+
+#[macro_export]
+macro_rules!SCLogNotice {
+ ($($arg:tt)*) => {
+ do_log!(Level::Notice, file!(), line!(), function!(), 0, $($arg)*);
+ }
+}
+
+#[macro_export]
+macro_rules!SCLogInfo {
+ ($($arg:tt)*) => {
+ do_log!(Level::Info, file!(), line!(), function!(), 0, $($arg)*);
+ }
+}
+
+#[macro_export]
+macro_rules!SCLogPerf {
+ ($($arg:tt)*) => {
+ do_log!(Level::Perf, file!(), line!(), function!(), 0, $($arg)*);
+ }
+}
+
+#[macro_export]
+macro_rules!SCLogConfig {
+ ($($arg:tt)*) => {
+ do_log!(Level::Config, file!(), line!(), function!(), 0, $($arg)*);
+ }
+}
+
+#[macro_export]
+macro_rules!SCLogDebug {
+ ($($arg:tt)*) => {
+ do_log!(Level::Debug, file!(), line!(), function!(), 0, $($arg)*);
+ }
+}
+
+#[no_mangle]
+pub extern "C" fn rs_log_init(level: i32) {
+ unsafe {
+ LEVEL = level;
+ }
+}
--- /dev/null
+/* 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.
+ */
+
+void rs_log_init(int32_t level);