From 2a303c4b60df865a5a0fa8f76e6df72ae6d06a32 Mon Sep 17 00:00:00 2001 From: jD91mZM2 <me@krake.one> Date: Mon, 30 Jul 2018 10:04:58 +0200 Subject: [PATCH] Implement sys/file.h --- src/platform/src/linux/mod.rs | 4 ++++ src/platform/src/redox/mod.rs | 5 +++++ src/platform/src/types.rs | 1 + src/sys_file/Cargo.toml | 10 ++++++++++ src/sys_file/build.rs | 11 +++++++++++ src/sys_file/cbindgen.toml | 6 ++++++ src/sys_file/src/lib.rs | 21 +++++++++++++++++++++ src/sys_ioctl/cbindgen.toml | 3 +-- 8 files changed, 59 insertions(+), 2 deletions(-) create mode 100644 src/sys_file/Cargo.toml create mode 100644 src/sys_file/build.rs create mode 100644 src/sys_file/cbindgen.toml create mode 100644 src/sys_file/src/lib.rs diff --git a/src/platform/src/linux/mod.rs b/src/platform/src/linux/mod.rs index 692e5f68..f4b0116c 100644 --- a/src/platform/src/linux/mod.rs +++ b/src/platform/src/linux/mod.rs @@ -84,6 +84,10 @@ pub fn fchown(fildes: c_int, owner: uid_t, group: gid_t) -> c_int { e(unsafe { syscall!(FCHOWN, fildes, owner, group) }) as c_int } +pub fn flock(fd: c_int, operation: c_int) -> c_int { + e(unsafe { syscall!(FLOCK, fd, operation) }) as c_int +} + pub fn fstat(fildes: c_int, buf: *mut stat) -> c_int { let empty_cstr: *const c_char = unsafe { ::cstr_from_bytes_with_nul_unchecked(b"\0") }; e(unsafe { syscall!(NEWFSTATAT, fildes, empty_cstr, buf, AT_EMPTY_PATH) }) as c_int diff --git a/src/platform/src/redox/mod.rs b/src/platform/src/redox/mod.rs index 1c13ff2d..80a29e95 100644 --- a/src/platform/src/redox/mod.rs +++ b/src/platform/src/redox/mod.rs @@ -226,6 +226,11 @@ pub fn fcntl(fd: c_int, cmd: c_int, args: c_int) -> c_int { e(syscall::fcntl(fd as usize, cmd as usize, args as usize)) as c_int } +pub fn flock(_fd: c_int, _operation: c_int) -> c_int { + // TODO: Redox does not have file locking yet + 0 +} + pub fn fork() -> pid_t { e(unsafe { syscall::clone(0) }) as pid_t } diff --git a/src/platform/src/types.rs b/src/platform/src/types.rs index 27130234..dbd5364b 100644 --- a/src/platform/src/types.rs +++ b/src/platform/src/types.rs @@ -1,3 +1,4 @@ +use core::mem; #[cfg(target_os = "redox")] use syscall::data::TimeSpec as redox_timespec; // Use repr(u8) as LLVM expects `void*` to be the same as `i8*` to help enable diff --git a/src/sys_file/Cargo.toml b/src/sys_file/Cargo.toml new file mode 100644 index 00000000..1853666e --- /dev/null +++ b/src/sys_file/Cargo.toml @@ -0,0 +1,10 @@ +[package] +name = "sys_file" +version = "0.1.0" +authors = ["jD91mZM2 <me@krake.one>"] + +[build-dependencies] +cbindgen = { path = "../../cbindgen" } + +[dependencies] +platform = { path = "../platform" } diff --git a/src/sys_file/build.rs b/src/sys_file/build.rs new file mode 100644 index 00000000..1009eaee --- /dev/null +++ b/src/sys_file/build.rs @@ -0,0 +1,11 @@ +extern crate cbindgen; + +use std::{env, fs}; + +fn main() { + let crate_dir = env::var("CARGO_MANIFEST_DIR").expect("CARGO_MANIFEST_DIR not set"); + fs::create_dir_all("../../target/include").expect("failed to create include directory"); + cbindgen::generate(crate_dir) + .expect("failed to generate bindings") + .write_to_file("../../target/include/sys/file.h"); +} diff --git a/src/sys_file/cbindgen.toml b/src/sys_file/cbindgen.toml new file mode 100644 index 00000000..457c5dfc --- /dev/null +++ b/src/sys_file/cbindgen.toml @@ -0,0 +1,6 @@ +include_guard = "_SYS_FILE_H" +language = "C" +style = "Tag" + +[enum] +prefix_with_name = true diff --git a/src/sys_file/src/lib.rs b/src/sys_file/src/lib.rs new file mode 100644 index 00000000..2ffb3e04 --- /dev/null +++ b/src/sys_file/src/lib.rs @@ -0,0 +1,21 @@ +//! sys/file.h implementation + +#![no_std] + +extern crate platform; + +use platform::types::*; + +pub const LOCK_SH: usize = 1; +pub const LOCK_EX: usize = 1 << 1; +pub const LOCK_NB: usize = 1 << 2; +pub const LOCK_UN: usize = 1 << 3; + +pub const L_SET: usize = 0; +pub const L_INCR: usize = 1; +pub const L_XTND: usize = 2; + +#[no_mangle] +pub extern "C" fn flock(fd: c_int, operation: c_int) -> c_int { + platform::flock(fd, operation) +} diff --git a/src/sys_ioctl/cbindgen.toml b/src/sys_ioctl/cbindgen.toml index fb4982cc..65ae4ea0 100644 --- a/src/sys_ioctl/cbindgen.toml +++ b/src/sys_ioctl/cbindgen.toml @@ -1,5 +1,4 @@ -sys_includes = [] -include_guard = "_IOCTL_H" +include_guard = "_SYS_IOCTL_H" language = "C" # WORKAROUND: -- GitLab