mirror of
https://github.com/ivabus/privod
synced 2024-11-23 08:55:08 +03:00
Initial commit
Signed-off-by: Ivan Bushchik <ivabus@ivabus.dev>
This commit is contained in:
commit
d1d432d350
8 changed files with 206 additions and 0 deletions
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
/target
|
85
Cargo.lock
generated
Normal file
85
Cargo.lock
generated
Normal file
|
@ -0,0 +1,85 @@
|
||||||
|
# This file is automatically @generated by Cargo.
|
||||||
|
# It is not intended for manual editing.
|
||||||
|
version = 3
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "cc"
|
||||||
|
version = "1.0.83"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0"
|
||||||
|
dependencies = [
|
||||||
|
"libc",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "cfg-if"
|
||||||
|
version = "1.0.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "getrandom"
|
||||||
|
version = "0.2.12"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "190092ea657667030ac6a35e305e62fc4dd69fd98ac98631e5d3a2b1575a12b5"
|
||||||
|
dependencies = [
|
||||||
|
"cfg-if",
|
||||||
|
"libc",
|
||||||
|
"wasi",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "libc"
|
||||||
|
version = "0.2.152"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "13e3bf6590cbc649f4d1a3eefc9d5d6eb746f5200ffb04e5e142700b8faa56e7"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "ppv-lite86"
|
||||||
|
version = "0.2.17"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "privod"
|
||||||
|
version = "0.1.0"
|
||||||
|
dependencies = [
|
||||||
|
"cc",
|
||||||
|
"rand",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "rand"
|
||||||
|
version = "0.8.5"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404"
|
||||||
|
dependencies = [
|
||||||
|
"libc",
|
||||||
|
"rand_chacha",
|
||||||
|
"rand_core",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "rand_chacha"
|
||||||
|
version = "0.3.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88"
|
||||||
|
dependencies = [
|
||||||
|
"ppv-lite86",
|
||||||
|
"rand_core",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "rand_core"
|
||||||
|
version = "0.6.4"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
|
||||||
|
dependencies = [
|
||||||
|
"getrandom",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "wasi"
|
||||||
|
version = "0.11.0+wasi-snapshot-preview1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
|
14
Cargo.toml
Normal file
14
Cargo.toml
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
[package]
|
||||||
|
name = "privod"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2021"
|
||||||
|
|
||||||
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
rand = "0.8.5"
|
||||||
|
|
||||||
|
|
||||||
|
[build-dependencies]
|
||||||
|
cc = "1.0.46"
|
||||||
|
|
20
LICENSE
Normal file
20
LICENSE
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
MIT License
|
||||||
|
|
||||||
|
Copyright (c) 2024 Ivan Bushchik
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is furnished
|
||||||
|
to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in
|
||||||
|
all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
||||||
|
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS
|
||||||
|
OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||||
|
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
|
||||||
|
OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
21
README.md
Normal file
21
README.md
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
# Privod (оптический привод)
|
||||||
|
|
||||||
|
Ejects CD/DVD/BD drive at random time (from 5 secs to 5 mins)
|
||||||
|
|
||||||
|
Linux only.
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
```shell
|
||||||
|
cargo run <PATH_TO_DRIVE>
|
||||||
|
```
|
||||||
|
|
||||||
|
`PATH_TO_DRIVE` is usually `/dev/sr0`
|
||||||
|
|
||||||
|
## TODO
|
||||||
|
|
||||||
|
- [ ] Delay setup
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
The project is licensed under the terms of the [MIT license](./LICENSE).
|
6
build.rs
Normal file
6
build.rs
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
fn main() {
|
||||||
|
cc::Build::new()
|
||||||
|
.file("src/get_status.c")
|
||||||
|
.compile("get_status");
|
||||||
|
println!("cargo:rerun-if-changed=src/get_status.c");
|
||||||
|
}
|
27
src/get_status.c
Normal file
27
src/get_status.c
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
#include <sys/ioctl.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <linux/cdrom.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
int get_status(char *drive_path) {
|
||||||
|
int cdrom;
|
||||||
|
int status=1;
|
||||||
|
|
||||||
|
if ((cdrom = open(drive_path,O_RDONLY | O_NONBLOCK)) < 0) {
|
||||||
|
status=2;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ioctl(cdrom,CDROM_DRIVE_STATUS) == CDS_TRAY_OPEN) {
|
||||||
|
status=0;
|
||||||
|
}
|
||||||
|
|
||||||
|
close(cdrom);
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
void eject(char *drive_path) {
|
||||||
|
// Ignoring everything
|
||||||
|
int cdrom;
|
||||||
|
cdrom = open(drive_path, O_RDONLY | O_NONBLOCK);
|
||||||
|
ioctl (cdrom, CDROMEJECT);
|
||||||
|
}
|
32
src/main.rs
Normal file
32
src/main.rs
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
use rand::Rng;
|
||||||
|
use std::ffi::{c_char, CString};
|
||||||
|
|
||||||
|
#[link(name = "get_status")]
|
||||||
|
extern "C" {
|
||||||
|
pub fn get_status(drive_path: *const c_char) -> std::ffi::c_int;
|
||||||
|
pub fn eject(drive_path: *const c_char);
|
||||||
|
}
|
||||||
|
|
||||||
|
fn sleep_rnd() {
|
||||||
|
let sleeptime = rand::thread_rng().gen_range(5..300);
|
||||||
|
eprintln!("Sleeping for {} secs", &sleeptime);
|
||||||
|
std::thread::sleep(std::time::Duration::from_secs(sleeptime));
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let dr_name = CString::new(std::env::args().collect::<Vec<String>>()[1].as_bytes()).unwrap();
|
||||||
|
println!("{:?}", unsafe { get_status(dr_name.as_ptr()) });
|
||||||
|
unsafe {
|
||||||
|
loop {
|
||||||
|
if get_status(dr_name.as_ptr()) != 0x1 {
|
||||||
|
while get_status(dr_name.as_ptr()) != 0x1_i32 {
|
||||||
|
eprintln!("Status != 0x1, sleeping 100ms");
|
||||||
|
std::thread::sleep(std::time::Duration::from_millis(100));
|
||||||
|
}
|
||||||
|
sleep_rnd()
|
||||||
|
}
|
||||||
|
eject(dr_name.as_ptr());
|
||||||
|
sleep_rnd();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue