0.5.12: Replace link with flink

This commit is contained in:
Jeremy Soller
2025-05-03 12:15:42 -06:00
parent 8f646a63ac
commit fe32c6b89d
8 changed files with 62 additions and 35 deletions
+1 -1
View File
@@ -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 <jackpot51@gmail.com>"]
+6 -5
View File
@@ -72,6 +72,12 @@ pub fn fpath(fd: usize, buf: &mut [u8]) -> Result<usize> {
unsafe { syscall3(SYS_FPATH, fd, buf.as_mut_ptr() as usize, buf.len()) }
}
/// Create a link to a file
pub fn flink<T: AsRef<str>>(fd: usize, path: T) -> Result<usize> {
let path = path.as_ref();
unsafe { syscall3(SYS_FLINK, fd, path.as_ptr() as usize, path.len()) }
}
/// Rename a file
pub fn frename<T: AsRef<str>>(fd: usize, path: T) -> Result<usize> {
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<usize> {
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<usize> {
unsafe { syscall3(SYS_LSEEK, fd, offset as usize, whence) }
+1 -1
View File
@@ -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;
+12
View File
@@ -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<usize> {
Err(Error::new(EBADF))
}
#[allow(unused_variables)]
fn fpath(&self, id: usize, buf: &mut [u8]) -> Result<usize> {
Err(Error::new(EBADF))
+14 -14
View File
@@ -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<Option<usize>> {
Err(Error::new(EBADF))
}
#[allow(unused_variables)]
fn fpath(&self, id: usize, buf: &mut [u8]) -> Result<Option<usize>> {
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<Option<usize>> {
fn mmap_prep(&self, id: usize, offset: u64, size: usize, flags: MapFlags) -> Result<Option<usize>> {
Err(Error::new(EOPNOTSUPP))
}
#[allow(unused_variables)]
fn munmap(
&self,
id: usize,
offset: u64,
size: usize,
flags: MunmapFlags,
) -> Result<Option<usize>> {
fn munmap(&self, id: usize, offset: u64, size: usize, flags: MunmapFlags) -> Result<Option<usize>> {
Err(Error::new(EOPNOTSUPP))
}
}
+14 -14
View File
@@ -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<Option<usize>> {
Err(Error::new(EBADF))
}
#[allow(unused_variables)]
fn fpath(&mut self, id: usize, buf: &mut [u8]) -> Result<Option<usize>> {
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<Option<usize>> {
fn mmap_prep(&mut self, id: usize, offset: u64, size: usize, flags: MapFlags) -> Result<Option<usize>> {
Err(Error::new(EOPNOTSUPP))
}
#[allow(unused_variables)]
fn munmap(
&mut self,
id: usize,
offset: u64,
size: usize,
flags: MunmapFlags,
) -> Result<Option<usize>> {
fn munmap(&mut self, id: usize, offset: u64, size: usize, flags: MunmapFlags) -> Result<Option<usize>> {
Err(Error::new(EOPNOTSUPP))
}
}
+12
View File
@@ -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<usize> {
Err(Error::new(EBADF))
}
#[allow(unused_variables)]
fn fpath(&mut self, id: usize, buf: &mut [u8]) -> Result<usize> {
Err(Error::new(EBADF))
+2
View File
@@ -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,
})