mirror of
https://github.com/ivabus/privod
synced 2024-11-23 08:55:08 +03:00
Wrap C functions
Signed-off-by: Ivan Bushchik <ivabus@ivabus.dev>
This commit is contained in:
parent
105372a965
commit
f356c5528b
2 changed files with 39 additions and 15 deletions
50
src/main.rs
50
src/main.rs
|
@ -2,8 +2,8 @@ use rand::Rng;
|
|||
use std::ffi::{c_char, CString};
|
||||
|
||||
extern "C" {
|
||||
pub fn get_status(drive_path: *const c_char) -> std::ffi::c_int;
|
||||
pub fn eject(drive_path: *const c_char);
|
||||
pub fn c_get_status(drive_path: *const c_char) -> std::ffi::c_int;
|
||||
pub fn c_eject(drive_path: *const c_char);
|
||||
}
|
||||
|
||||
fn sleep_rnd(start: u64, end: u64) {
|
||||
|
@ -12,6 +12,29 @@ fn sleep_rnd(start: u64, end: u64) {
|
|||
std::thread::sleep(std::time::Duration::from_secs(sleeptime));
|
||||
}
|
||||
|
||||
#[derive(PartialEq, Debug)]
|
||||
enum Status {
|
||||
Opened, // 0
|
||||
Closed, // 1
|
||||
Invalid, // 2
|
||||
}
|
||||
|
||||
#[inline(always)]
|
||||
fn get_status(drive_path: &CString) -> Status {
|
||||
let status = unsafe { c_get_status(drive_path.as_ptr()) };
|
||||
match status {
|
||||
0 => Status::Opened,
|
||||
1 => Status::Closed,
|
||||
2 => Status::Invalid,
|
||||
_ => panic!("Invalide status code from C module"),
|
||||
}
|
||||
}
|
||||
|
||||
#[inline(always)]
|
||||
fn eject(drive_path: &CString) {
|
||||
unsafe { c_eject(drive_path.as_ptr()) }
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let args = std::env::args().collect::<Vec<String>>();
|
||||
if args.len() != 2 && args.len() != 4 {
|
||||
|
@ -26,18 +49,19 @@ fn main() {
|
|||
} else {
|
||||
(5, 300)
|
||||
};
|
||||
let dr_name = CString::new(std::env::args().collect::<Vec<String>>()[1].as_bytes()).unwrap();
|
||||
unsafe {
|
||||
loop {
|
||||
if get_status(dr_name.as_ptr()) != 0x1 {
|
||||
while get_status(dr_name.as_ptr()) != 0x1_i32 {
|
||||
eprintln!("Status != closed, sleeping 250ms");
|
||||
std::thread::sleep(std::time::Duration::from_millis(250));
|
||||
}
|
||||
sleep_rnd(start, end)
|
||||
let dr_name = CString::new(args[1].as_bytes()).unwrap();
|
||||
loop {
|
||||
if get_status(&dr_name) != Status::Closed {
|
||||
while get_status(&dr_name) != Status::Closed {
|
||||
eprintln!(
|
||||
"Status != closed ({:?}), sleeping 250ms",
|
||||
get_status(&dr_name)
|
||||
);
|
||||
std::thread::sleep(std::time::Duration::from_millis(250));
|
||||
}
|
||||
eject(dr_name.as_ptr());
|
||||
sleep_rnd(start, end);
|
||||
sleep_rnd(start, end)
|
||||
}
|
||||
eject(&dr_name);
|
||||
sleep_rnd(start, end);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
|
||||
// Status: 0 - opened, 1 - closed, 2 - failed
|
||||
|
||||
int get_status(char *drive_path) {
|
||||
int c_get_status(char *drive_path) {
|
||||
int cdrom;
|
||||
int status=1;
|
||||
|
||||
|
@ -22,7 +22,7 @@ int get_status(char *drive_path) {
|
|||
return status;
|
||||
}
|
||||
|
||||
void eject(char *drive_path) {
|
||||
void c_eject(char *drive_path) {
|
||||
// Ignore everything
|
||||
int cdrom;
|
||||
cdrom = open(drive_path, O_RDONLY | O_NONBLOCK);
|
||||
|
|
Loading…
Reference in a new issue