diff --git a/Cargo.toml b/Cargo.toml index e1e861431e..6ee26a4ad4 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "redox_syscall" -version = "0.5.11" +version = "0.5.12" description = "A Rust library to access raw Redox system calls" license = "MIT" authors = ["Jeremy Soller "] diff --git a/src/call.rs b/src/call.rs index 3ca0e48ef9..1fc7337c73 100644 --- a/src/call.rs +++ b/src/call.rs @@ -72,6 +72,12 @@ pub fn fpath(fd: usize, buf: &mut [u8]) -> Result { unsafe { syscall3(SYS_FPATH, fd, buf.as_mut_ptr() as usize, buf.len()) } } +/// Create a link to a file +pub fn flink>(fd: usize, path: T) -> Result { + let path = path.as_ref(); + unsafe { syscall3(SYS_FLINK, fd, path.as_ptr() as usize, path.len()) } +} + /// Rename a file pub fn frename>(fd: usize, path: T) -> Result { let path = path.as_ref(); @@ -142,11 +148,6 @@ pub unsafe fn futex( ) } -/// Create a link to a file -pub unsafe fn link(old: *const u8, new: *const u8) -> Result { - syscall2(SYS_LINK, old as usize, new as usize) -} - /// Seek to `offset` bytes in a file descriptor pub fn lseek(fd: usize, offset: isize, whence: usize) -> Result { unsafe { syscall3(SYS_LSEEK, fd, offset as usize, whence) } diff --git a/src/number.rs b/src/number.rs index 955cc19bc9..b3af71d7d3 100644 --- a/src/number.rs +++ b/src/number.rs @@ -10,7 +10,6 @@ pub const SYS_ARG_PATH: usize = 0x0300_0000; pub const SYS_RET: usize = 0x00F0_0000; pub const SYS_RET_FILE: usize = 0x0010_0000; -pub const SYS_LINK: usize = SYS_CLASS_PATH | SYS_ARG_PATH | 9; pub const SYS_OPEN: usize = SYS_CLASS_PATH | SYS_RET_FILE | 5; pub const SYS_OPENAT: usize = SYS_CLASS_PATH | SYS_RET_FILE | 7; pub const SYS_RMDIR: usize = SYS_CLASS_PATH | 84; @@ -44,6 +43,7 @@ pub const SYS_FUNMAP_OLD: usize = SYS_CLASS_FILE | 91; pub const SYS_FUNMAP: usize = SYS_CLASS_FILE | 92; pub const SYS_MREMAP: usize = 155; +pub const SYS_FLINK: usize = SYS_CLASS_FILE | SYS_ARG_PATH | 9; pub const SYS_FPATH: usize = SYS_CLASS_FILE | SYS_ARG_MSLICE | 928; pub const SYS_FRENAME: usize = SYS_CLASS_FILE | SYS_ARG_PATH | 38; pub const SYS_FSTAT: usize = SYS_CLASS_FILE | SYS_ARG_MSLICE | 28; diff --git a/src/scheme/scheme.rs b/src/scheme/scheme.rs index 2e77eccc00..4857d09ec8 100644 --- a/src/scheme/scheme.rs +++ b/src/scheme/scheme.rs @@ -53,6 +53,13 @@ pub trait Scheme { SYS_FEVENT => self .fevent(packet.b, EventFlags::from_bits_truncate(packet.c)) .map(|f| f.bits()), + SYS_FLINK => { + if let Some(path) = unsafe { str_from_raw_parts(packet.c as *const u8, packet.d) } { + self.flink(packet.b, path, packet.uid, packet.gid) + } else { + Err(Error::new(EINVAL)) + } + } SYS_FPATH => self.fpath(packet.b, unsafe { slice::from_raw_parts_mut(packet.c as *mut u8, packet.d) }), @@ -184,6 +191,11 @@ pub trait Scheme { Err(Error::new(EBADF)) } + #[allow(unused_variables)] + fn flink(&self, id: usize, path: &str, uid: u32, gid: u32) -> Result { + Err(Error::new(EBADF)) + } + #[allow(unused_variables)] fn fpath(&self, id: usize, buf: &mut [u8]) -> Result { Err(Error::new(EBADF)) diff --git a/src/scheme/scheme_block.rs b/src/scheme/scheme_block.rs index f5a66fa162..b72b3e1d23 100644 --- a/src/scheme/scheme_block.rs +++ b/src/scheme/scheme_block.rs @@ -53,6 +53,13 @@ pub trait SchemeBlock { SYS_FEVENT => self .fevent(packet.b, EventFlags::from_bits_truncate(packet.c)) .map(|f| f.map(|f| f.bits())), + SYS_FLINK => { + if let Some(path) = unsafe { str_from_raw_parts(packet.c as *const u8, packet.d) } { + self.flink(packet.b, path, packet.uid, packet.gid) + } else { + Err(Error::new(EINVAL)) + } + } SYS_FPATH => self.fpath(packet.b, unsafe { slice::from_raw_parts_mut(packet.c as *mut u8, packet.d) }), @@ -184,6 +191,11 @@ pub trait SchemeBlock { Err(Error::new(EBADF)) } + #[allow(unused_variables)] + fn flink(&self, id: usize, path: &str, uid: u32, gid: u32) -> Result> { + Err(Error::new(EBADF)) + } + #[allow(unused_variables)] fn fpath(&self, id: usize, buf: &mut [u8]) -> Result> { Err(Error::new(EBADF)) @@ -225,24 +237,12 @@ pub trait SchemeBlock { } #[allow(unused_variables)] - fn mmap_prep( - &self, - id: usize, - offset: u64, - size: usize, - flags: MapFlags, - ) -> Result> { + fn mmap_prep(&self, id: usize, offset: u64, size: usize, flags: MapFlags) -> Result> { Err(Error::new(EOPNOTSUPP)) } #[allow(unused_variables)] - fn munmap( - &self, - id: usize, - offset: u64, - size: usize, - flags: MunmapFlags, - ) -> Result> { + fn munmap(&self, id: usize, offset: u64, size: usize, flags: MunmapFlags) -> Result> { Err(Error::new(EOPNOTSUPP)) } } diff --git a/src/scheme/scheme_block_mut.rs b/src/scheme/scheme_block_mut.rs index 1ed47c0ffc..8cf7e9f1bb 100644 --- a/src/scheme/scheme_block_mut.rs +++ b/src/scheme/scheme_block_mut.rs @@ -53,6 +53,13 @@ pub trait SchemeBlockMut { SYS_FEVENT => self .fevent(packet.b, EventFlags::from_bits_truncate(packet.c)) .map(|f| f.map(|f| f.bits())), + SYS_FLINK => { + if let Some(path) = unsafe { str_from_raw_parts(packet.c as *const u8, packet.d) } { + self.flink(packet.b, path, packet.uid, packet.gid) + } else { + Err(Error::new(EINVAL)) + } + } SYS_FPATH => self.fpath(packet.b, unsafe { slice::from_raw_parts_mut(packet.c as *mut u8, packet.d) }), @@ -184,6 +191,11 @@ pub trait SchemeBlockMut { Err(Error::new(EBADF)) } + #[allow(unused_variables)] + fn flink(&mut self, id: usize, path: &str, uid: u32, gid: u32) -> Result> { + Err(Error::new(EBADF)) + } + #[allow(unused_variables)] fn fpath(&mut self, id: usize, buf: &mut [u8]) -> Result> { Err(Error::new(EBADF)) @@ -225,24 +237,12 @@ pub trait SchemeBlockMut { } #[allow(unused_variables)] - fn mmap_prep( - &mut self, - id: usize, - offset: u64, - size: usize, - flags: MapFlags, - ) -> Result> { + fn mmap_prep(&mut self, id: usize, offset: u64, size: usize, flags: MapFlags) -> Result> { Err(Error::new(EOPNOTSUPP)) } #[allow(unused_variables)] - fn munmap( - &mut self, - id: usize, - offset: u64, - size: usize, - flags: MunmapFlags, - ) -> Result> { + fn munmap(&mut self, id: usize, offset: u64, size: usize, flags: MunmapFlags) -> Result> { Err(Error::new(EOPNOTSUPP)) } } diff --git a/src/scheme/scheme_mut.rs b/src/scheme/scheme_mut.rs index 24aaf75824..ef14029d37 100644 --- a/src/scheme/scheme_mut.rs +++ b/src/scheme/scheme_mut.rs @@ -53,6 +53,13 @@ pub trait SchemeMut { SYS_FEVENT => self .fevent(packet.b, EventFlags::from_bits_truncate(packet.c)) .map(|f| f.bits()), + SYS_FLINK => { + if let Some(path) = unsafe { str_from_raw_parts(packet.c as *const u8, packet.d) } { + self.flink(packet.b, path, packet.uid, packet.gid) + } else { + Err(Error::new(EINVAL)) + } + } SYS_FPATH => self.fpath(packet.b, unsafe { slice::from_raw_parts_mut(packet.c as *mut u8, packet.d) }), @@ -184,6 +191,11 @@ pub trait SchemeMut { Err(Error::new(EBADF)) } + #[allow(unused_variables)] + fn flink(&mut self, id: usize, path: &str, uid: u32, gid: u32) -> Result { + Err(Error::new(EBADF)) + } + #[allow(unused_variables)] fn fpath(&mut self, id: usize, buf: &mut [u8]) -> Result { Err(Error::new(EBADF)) diff --git a/src/schemev2.rs b/src/schemev2.rs index e225bb7fc1..bc662694e8 100644 --- a/src/schemev2.rs +++ b/src/schemev2.rs @@ -131,6 +131,7 @@ pub enum Opcode { Call = 28, OpenAt = 29, // fd, buf_ptr, buf_len, flags + Flink = 30, } impl Opcode { @@ -172,6 +173,7 @@ impl Opcode { 28 => Call, 29 => OpenAt, + 30 => Flink, _ => return None, })