R .gitignore => os_log/.gitignore +0 -0
R Cargo.toml => os_log/Cargo.toml +4 -0
@@ 2,6 2,10 @@
name = "os_log"
version = "0.1.0"
authors = ["Søren Mortensen <soren@sorenmortensen.com>"]
+build = "build.rs"
[dependencies]
log = { version = "0.4", features = ["std"] }
+
+[build-dependencies]
+bindgen = "0.37"
A os_log/build.rs => os_log/build.rs +39 -0
@@ 0,0 1,39 @@
+//
+// build.rs
+// os_log
+//
+// Created by Søren Mortensen on 28/07/2018.
+// Copyright © 2018 Søren Mortensen. All rights reserved.
+//
+
+extern crate bindgen;
+
+use std::env;
+use std::path::PathBuf;
+use std::process::Command;
+
+fn main() {
+ let wrapper_dir = concat!(env!("CARGO_MANIFEST_DIR"), "/../os_log_wrapper");
+
+ Command::new("make")
+ .current_dir(PathBuf::from(wrapper_dir))
+ .status().unwrap();
+
+ println!("cargo:rustc-link-search=native=../os_log_wrapper/out/");
+ println!("cargo:rustc-link-lib=static=oslogwrapper");
+
+ let bindings = bindgen::Builder::default()
+ // The input header we would like to generate
+ // bindings for.
+ .header("include/os_log.h")
+ // Finish the builder and generate the bindings.
+ .generate()
+ // Unwrap the Result and panic on failure.
+ .expect("Unable to generate bindings");
+
+ // Write the bindings to the $OUT_DIR/bindings.rs file.
+ let out_path = PathBuf::from(env::var("OUT_DIR").unwrap());
+ bindings
+ .write_to_file(out_path.join("os_log.rs"))
+ .expect("Couldn't write bindings!");
+}
A os_log/include/os_log.h => os_log/include/os_log.h +9 -0
@@ 0,0 1,9 @@
+//
+// os_log.h
+// os_log
+//
+// Created by Søren Mortensen on 28/07/2018.
+// Copyright © 2018 Søren Mortensen. All rights reserved.
+//
+
+#include "../../os_log_wrapper/include/os_log_wrapper.h"
A os_log/src/lib.rs => os_log/src/lib.rs +63 -0
@@ 0,0 1,63 @@
+//
+// lib.rs
+// os_log
+//
+// Created by Søren Mortensen on 28/07/2018.
+// Copyright © 2018 Søren Mortensen. All rights reserved.
+//
+
+extern crate log;
+
+pub mod os_log;
+
+use log::{Record, Level, Log, Metadata, SetLoggerError};
+
+use std::ffi::CString;
+
+use os_log::*;
+
+struct OsLog {
+ level: Level,
+}
+
+#[repr(u32)]
+enum OsLogType {
+ Default = OS_LOG_TYPE_DEFAULT,
+ Info = OS_LOG_TYPE_INFO,
+ Debug = OS_LOG_TYPE_DEBUG,
+ Error = OS_LOG_TYPE_ERROR,
+ Fault = OS_LOG_TYPE_FAULT,
+}
+
+impl Log for OsLog {
+ fn enabled(&self, metadata: &Metadata) -> bool {
+ metadata.level() <= self.level
+ }
+
+ fn log(&self, record: &Record) {
+ if self.enabled(record.metadata()) {
+ let string = format!("{}", record.args());
+ let c_string = CString::new(string).unwrap();
+ unsafe { _os_log_fault(c_string.as_ptr()); }
+ }
+ }
+
+ fn flush(&self) {}
+}
+
+pub fn init_with_level(level: Level) -> Result<(), SetLoggerError> {
+ log::set_boxed_logger(Box::new(OsLog { level }))
+ .map(|()| log::set_max_level(level.to_level_filter()))
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+
+ #[test]
+ fn test_thing() {
+ let string = format!("{}", "This is a test log from os_log");
+ let c_string = CString::new(string).unwrap();
+ unsafe { _os_log_fault(c_string.as_ptr()); }
+ }
+}
A os_log/src/os_log.rs => os_log/src/os_log.rs +14 -0
@@ 0,0 1,14 @@
+//
+// os_log.rs
+// os_log
+//
+// Created by Søren Mortensen on 28/07/2018.
+// Copyright © 2018 Søren Mortensen. All rights reserved.
+//
+
+#![allow(non_upper_case_globals)]
+#![allow(non_camel_case_types)]
+#![allow(non_snake_case)]
+#![allow(safe_packed_borrows)]
+
+include!(concat!(env!("OUT_DIR"), "/os_log.rs"));
A os_log_wrapper/.gitignore => os_log_wrapper/.gitignore +59 -0
@@ 0,0 1,59 @@
+
+# Created by https://www.gitignore.io/api/c
+
+### C ###
+# Prerequisites
+*.d
+
+# Object files
+*.o
+*.ko
+*.obj
+*.elf
+
+# Linker output
+*.ilk
+*.map
+*.exp
+
+# Precompiled Headers
+*.gch
+*.pch
+
+# Libraries
+*.lib
+*.a
+*.la
+*.lo
+
+# Shared objects (inc. Windows DLLs)
+*.dll
+*.so
+*.so.*
+*.dylib
+
+# Executables
+*.exe
+*.out
+*.app
+*.i*86
+*.x86_64
+*.hex
+
+# Debug files
+*.dSYM/
+*.su
+*.idb
+*.pdb
+
+# Kernel Module Compile Results
+*.mod*
+*.cmd
+.tmp_versions/
+modules.order
+Module.symvers
+Mkfile.old
+dkms.conf
+
+
+# End of https://www.gitignore.io/api/c
A os_log_wrapper/Makefile => os_log_wrapper/Makefile +36 -0
@@ 0,0 1,36 @@
+CC=clang
+CFLAGS=-I$(IDIR)
+
+IDIR=include
+
+_DEPS = os_log_wrapper.h
+DEPS = $(patsubst %,$(IDIR)/%,$(_DEPS))
+
+ODIR=obj
+
+_OBJ = os_log_wrapper.o
+OBJ = $(patsubst %,$(ODIR)/%,$(_OBJ))
+
+SDIR=src
+
+_SRC = os_log_wrapper.c
+SRC = $(patsubst %,$(SDIR)/%,$(_SRC))
+
+OUTDIR=out
+
+$(ODIR)/%.o: $(SDIR)/%.c $(DEPS)
+ @echo "[Compile]" $<
+ @$(CC) -c -o $@ $< $(CFLAGS)
+
+$(OUTDIR)/liboslogwrapper.a: $(OBJ)
+ @echo "[Link (Static)]" $<
+ @mkdir -p $(OUTDIR)
+ @ar rcs $@ $^
+
+.PHONY: clean
+
+clean:
+ rm -f $(ODIR)/*.o *~ $(INCDIR)/*~
+ rm -rf out
+
+all: liboslogwrapper.a
A os_log_wrapper/include/os_log_wrapper.h => os_log_wrapper/include/os_log_wrapper.h +20 -0
@@ 0,0 1,20 @@
+//
+// os_log_wrapper.h
+// os_log_wrapper
+//
+// Created by Søren Mortensen on 29/07/2018.
+// Copyright © 2018 Søren Mortensen. All rights reserved.
+//
+
+#ifndef oslogwrapper_h
+#define oslogwrapper_h
+
+#include <os/log.h>
+
+void _os_log(const char *str);
+void _os_log_info(const char *str);
+void _os_log_debug(const char *str);
+void _os_log_error(const char *str);
+void _os_log_fault(const char *str);
+
+#endif /* oslogwrapper_h */
A os_log_wrapper/src/os_log_wrapper.c => os_log_wrapper/src/os_log_wrapper.c +29 -0
@@ 0,0 1,29 @@
+//
+// os_log_wrapper.c
+// os_log_wrapper
+//
+// Created by Søren Mortensen on 29/07/2018.
+// Copyright © 2018 Søren Mortensen. All rights reserved.
+//
+
+#include "os_log_wrapper.h"
+
+void _os_log(const char *str) {
+ os_log(OS_LOG_DEFAULT, "%{public}s", str);
+}
+
+void _os_log_info(const char *str) {
+ os_log_info(OS_LOG_DEFAULT, "%{public}s", str);
+}
+
+void _os_log_debug(const char *str) {
+ os_log_debug(OS_LOG_DEFAULT, "%{public}s", str);
+}
+
+void _os_log_error(const char *str) {
+ os_log_error(OS_LOG_DEFAULT, "%{public}s", str);
+}
+
+void _os_log_fault(const char *str) {
+ os_log_fault(OS_LOG_DEFAULT, "%{public}s", str);
+}
D src/lib.rs => src/lib.rs +0 -7
@@ 1,7 0,0 @@
-#[cfg(test)]
-mod tests {
- #[test]
- fn it_works() {
- assert_eq!(2 + 2, 4);
- }
-}