1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
#![warn(missing_docs)]
use std::ffi::CStr;
use std::ffi::CString;
use std::str;
use std::panic::catch_unwind;
use std::env;
use libc::{c_char};
use log::*;
use env_logger::Builder;
mod args;
pub mod verifier;
pub static VERSION: &str = concat!(env!("CARGO_PKG_VERSION"), "\0");
#[no_mangle]
pub extern "C" fn version() -> *const c_char {
VERSION.as_ptr() as *const c_char
}
#[no_mangle]
pub unsafe extern fn init(log_env_var: *const c_char) {
let log_env_var = if !log_env_var.is_null() {
let c_str = CStr::from_ptr(log_env_var);
match c_str.to_str() {
Ok(str) => str,
Err(err) => {
warn!("Failed to parse the environment variable name as a UTF-8 string: {}", err);
"LOG_LEVEL"
}
}
} else {
"LOG_LEVEL"
};
let env = env_logger::Env::new().filter(log_env_var);
let mut builder = Builder::from_env(env);
builder.try_init().unwrap_or(());
}
#[no_mangle]
pub unsafe extern fn free_string(s: *mut c_char) {
if s.is_null() {
return;
}
CString::from_raw(s);
}
#[no_mangle]
pub unsafe extern fn verify(args: *const c_char) -> i32 {
if args.is_null() {
return 2;
}
let result = catch_unwind(|| {
let runtime = tokio::runtime::Runtime::new().unwrap();
runtime.block_on(async {
let args_raw = CStr::from_ptr(args).to_string_lossy().into_owned();
let args: Vec<String> = args_raw.lines().map(|s| s.to_string()).collect();
let result = verifier::handle_args(args).await;
match result {
Ok(_) => 0,
Err(e) => e
}
})
});
match result {
Ok(val) => val,
Err(cause) => {
log::error!("Caught a general panic: {:?}", cause);
3
}
}
}