0.4.3 - update redox_syscall
This commit is contained in:
+4
-4
@@ -29,12 +29,12 @@ extern "C" fn unmount_handler(_s: usize) {
|
||||
//for, so I put 2. I don't think 0,0 is a valid sa_mask. I don't know what i'm doing here. When u
|
||||
//send it a sigkill, it shuts off the filesystem
|
||||
fn setsig() {
|
||||
use syscall::{sigaction, SigAction, SIGTERM};
|
||||
use syscall::{sigaction, SigAction, SigActionFlags, SIGTERM};
|
||||
|
||||
let sig_action = SigAction {
|
||||
sa_handler: unmount_handler,
|
||||
sa_handler: Some(unmount_handler),
|
||||
sa_mask: [0, 0],
|
||||
sa_flags: 0,
|
||||
sa_flags: SigActionFlags::empty(),
|
||||
};
|
||||
|
||||
sigaction(SIGTERM, Some(&sig_action), None).unwrap();
|
||||
@@ -63,7 +63,7 @@ fn capability_mode() {
|
||||
|
||||
#[cfg(target_os = "redox")]
|
||||
fn fork() -> isize {
|
||||
unsafe { syscall::Error::mux(syscall::clone(0)) as isize }
|
||||
unsafe { syscall::Error::mux(syscall::clone(syscall::CloneFlags::empty())) as isize }
|
||||
}
|
||||
|
||||
#[cfg(target_os = "redox")]
|
||||
|
||||
+26
-33
@@ -7,7 +7,7 @@ use syscall::data::{Map, Stat, TimeSpec};
|
||||
use syscall::error::{Error, Result, EBADF, EINVAL, EISDIR, ENOMEM, EPERM};
|
||||
use syscall::flag::{
|
||||
F_GETFL, F_SETFL, MODE_PERM, O_ACCMODE, O_APPEND, O_RDONLY, O_RDWR, O_WRONLY, PROT_READ,
|
||||
PROT_WRITE, SEEK_CUR, SEEK_END, SEEK_SET,
|
||||
PROT_WRITE, SEEK_CUR, SEEK_END, SEEK_SET, MapFlags,
|
||||
};
|
||||
|
||||
use disk::Disk;
|
||||
@@ -19,7 +19,7 @@ pub trait Resource<D: Disk> {
|
||||
fn set_path(&mut self, path: &str);
|
||||
fn read(&mut self, buf: &mut [u8], fs: &mut FileSystem<D>) -> Result<usize>;
|
||||
fn write(&mut self, buf: &[u8], fs: &mut FileSystem<D>) -> Result<usize>;
|
||||
fn seek(&mut self, offset: usize, whence: usize, fs: &mut FileSystem<D>) -> Result<usize>;
|
||||
fn seek(&mut self, offset: isize, whence: usize, fs: &mut FileSystem<D>) -> Result<isize>;
|
||||
fn fmap(&mut self, map: &Map, fs: &mut FileSystem<D>) -> Result<usize>;
|
||||
fn funmap(&mut self, address: usize, fs: &mut FileSystem<D>) -> Result<usize>;
|
||||
fn fchmod(&mut self, mode: u16, fs: &mut FileSystem<D>) -> Result<usize>;
|
||||
@@ -36,7 +36,7 @@ pub struct DirResource {
|
||||
path: String,
|
||||
block: u64,
|
||||
data: Option<Vec<u8>>,
|
||||
seek: usize,
|
||||
seek: isize,
|
||||
uid: u32,
|
||||
}
|
||||
|
||||
@@ -73,9 +73,10 @@ impl<D: Disk> Resource<D> for DirResource {
|
||||
|
||||
fn read(&mut self, buf: &mut [u8], _fs: &mut FileSystem<D>) -> Result<usize> {
|
||||
let data = self.data.as_ref().ok_or(Error::new(EISDIR))?;
|
||||
let size = data.len() as isize;
|
||||
let mut i = 0;
|
||||
while i < buf.len() && self.seek < data.len() {
|
||||
buf[i] = data[self.seek];
|
||||
while i < buf.len() && self.seek < size {
|
||||
buf[i] = data[self.seek as usize];
|
||||
i += 1;
|
||||
self.seek += 1;
|
||||
}
|
||||
@@ -86,21 +87,15 @@ impl<D: Disk> Resource<D> for DirResource {
|
||||
Err(Error::new(EBADF))
|
||||
}
|
||||
|
||||
fn seek(&mut self, offset: usize, whence: usize, _fs: &mut FileSystem<D>) -> Result<usize> {
|
||||
fn seek(&mut self, offset: isize, whence: usize, _fs: &mut FileSystem<D>) -> Result<isize> {
|
||||
let data = self.data.as_ref().ok_or(Error::new(EBADF))?;
|
||||
let size = data.len() as isize;
|
||||
self.seek = match whence {
|
||||
SEEK_SET => max(0, min(data.len() as isize, offset as isize)) as usize,
|
||||
SEEK_CUR => max(
|
||||
0,
|
||||
min(data.len() as isize, self.seek as isize + offset as isize),
|
||||
) as usize,
|
||||
SEEK_END => max(
|
||||
0,
|
||||
min(data.len() as isize, data.len() as isize + offset as isize),
|
||||
) as usize,
|
||||
SEEK_SET => max(0, min(size, offset)),
|
||||
SEEK_CUR => max(0, min(size, self.seek + offset)),
|
||||
SEEK_END => max(0, min(size, size + offset)),
|
||||
_ => return Err(Error::new(EINVAL)),
|
||||
};
|
||||
|
||||
Ok(self.seek)
|
||||
}
|
||||
|
||||
@@ -200,7 +195,7 @@ impl<D: Disk> Resource<D> for DirResource {
|
||||
pub struct Fmap {
|
||||
block: u64,
|
||||
offset: usize,
|
||||
flags: usize,
|
||||
flags: MapFlags,
|
||||
data: &'static mut [u8],
|
||||
}
|
||||
|
||||
@@ -272,7 +267,7 @@ pub struct FileResource {
|
||||
path: String,
|
||||
block: u64,
|
||||
flags: usize,
|
||||
seek: u64,
|
||||
seek: isize,
|
||||
uid: u32,
|
||||
fmaps: BTreeMap<usize, Fmap>,
|
||||
}
|
||||
@@ -312,8 +307,8 @@ impl<D: Disk> Resource<D> for FileResource {
|
||||
|
||||
fn read(&mut self, buf: &mut [u8], fs: &mut FileSystem<D>) -> Result<usize> {
|
||||
if self.flags & O_ACCMODE == O_RDWR || self.flags & O_ACCMODE == O_RDONLY {
|
||||
let count = fs.read_node(self.block, self.seek, buf)?;
|
||||
self.seek += count as u64;
|
||||
let count = fs.read_node(self.block, self.seek as u64, buf)?;
|
||||
self.seek += count as isize;
|
||||
Ok(count)
|
||||
} else {
|
||||
Err(Error::new(EBADF))
|
||||
@@ -323,42 +318,40 @@ impl<D: Disk> Resource<D> for FileResource {
|
||||
fn write(&mut self, buf: &[u8], fs: &mut FileSystem<D>) -> Result<usize> {
|
||||
if self.flags & O_ACCMODE == O_RDWR || self.flags & O_ACCMODE == O_WRONLY {
|
||||
if self.flags & O_APPEND == O_APPEND {
|
||||
self.seek = fs.node_len(self.block)?;
|
||||
self.seek = fs.node_len(self.block)? as isize;
|
||||
}
|
||||
let mtime = SystemTime::now().duration_since(UNIX_EPOCH).unwrap();
|
||||
let count = fs.write_node(
|
||||
self.block,
|
||||
self.seek,
|
||||
self.seek as u64,
|
||||
buf,
|
||||
mtime.as_secs(),
|
||||
mtime.subsec_nanos(),
|
||||
)?;
|
||||
self.seek += count as u64;
|
||||
self.seek += count as isize;
|
||||
Ok(count)
|
||||
} else {
|
||||
Err(Error::new(EBADF))
|
||||
}
|
||||
}
|
||||
|
||||
fn seek(&mut self, offset: usize, whence: usize, fs: &mut FileSystem<D>) -> Result<usize> {
|
||||
let size = fs.node_len(self.block)?;
|
||||
|
||||
fn seek(&mut self, offset: isize, whence: usize, fs: &mut FileSystem<D>) -> Result<isize> {
|
||||
let size = fs.node_len(self.block)? as isize;
|
||||
self.seek = match whence {
|
||||
SEEK_SET => max(0, offset as i64) as u64,
|
||||
SEEK_CUR => max(0, self.seek as i64 + offset as i64) as u64,
|
||||
SEEK_END => max(0, size as i64 + offset as i64) as u64,
|
||||
SEEK_SET => max(0, offset),
|
||||
SEEK_CUR => max(0, self.seek + offset),
|
||||
SEEK_END => max(0, size + offset),
|
||||
_ => return Err(Error::new(EINVAL)),
|
||||
};
|
||||
|
||||
Ok(self.seek as usize)
|
||||
Ok(self.seek)
|
||||
}
|
||||
|
||||
fn fmap(&mut self, map: &Map, fs: &mut FileSystem<D>) -> Result<usize> {
|
||||
let accmode = self.flags & O_ACCMODE;
|
||||
if map.flags & PROT_READ > 0 && !(accmode == O_RDWR || accmode == O_RDONLY) {
|
||||
if map.flags.contains(PROT_READ) && !(accmode == O_RDWR || accmode == O_RDONLY) {
|
||||
return Err(Error::new(EBADF));
|
||||
}
|
||||
if map.flags & PROT_WRITE > 0 && !(accmode == O_RDWR || accmode == O_WRONLY) {
|
||||
if map.flags.contains(PROT_WRITE) && !(accmode == O_RDWR || accmode == O_WRONLY) {
|
||||
return Err(Error::new(EBADF));
|
||||
}
|
||||
//TODO: PROT_EXEC?
|
||||
|
||||
@@ -6,12 +6,12 @@ use std::time::{SystemTime, UNIX_EPOCH};
|
||||
|
||||
use syscall::data::{Map, Stat, StatVfs, TimeSpec};
|
||||
use syscall::error::{
|
||||
Error, Result, EACCES, EBADF, EEXIST, EINVAL, EISDIR, ELOOP, ENOENT, ENOTDIR, ENOTEMPTY, EPERM,
|
||||
EXDEV,
|
||||
Error, Result, EACCES, EBADF, EEXIST, EINVAL, EISDIR, ELOOP, ENOENT, ENOTDIR, ENOTEMPTY,
|
||||
ENOSYS, EPERM, EXDEV,
|
||||
};
|
||||
use syscall::flag::{
|
||||
MODE_PERM, O_ACCMODE, O_CREAT, O_DIRECTORY, O_EXCL, O_NOFOLLOW, O_RDONLY, O_RDWR, O_STAT,
|
||||
O_SYMLINK, O_TRUNC, O_WRONLY,
|
||||
O_SYMLINK, O_TRUNC, O_WRONLY, EventFlags,
|
||||
};
|
||||
use syscall::scheme::Scheme;
|
||||
|
||||
@@ -491,7 +491,7 @@ impl<D: Disk> Scheme for FileScheme<D> {
|
||||
}
|
||||
}
|
||||
|
||||
fn seek(&self, id: usize, pos: usize, whence: usize) -> Result<usize> {
|
||||
fn seek(&self, id: usize, pos: isize, whence: usize) -> Result<isize> {
|
||||
// println!("Seek {}, {} {}", id, pos, whence);
|
||||
let mut files = self.files.borrow_mut();
|
||||
if let Some(file) = files.get_mut(&id) {
|
||||
@@ -528,7 +528,7 @@ impl<D: Disk> Scheme for FileScheme<D> {
|
||||
}
|
||||
}
|
||||
|
||||
fn fevent(&self, id: usize, flags: usize) -> Result<usize> {
|
||||
fn fevent(&self, id: usize, _flags: EventFlags) -> Result<EventFlags> {
|
||||
let files = self.files.borrow_mut();
|
||||
if let Some(file) = files.get(&id) {
|
||||
// EPERM is returned for files that are always readable or writable
|
||||
@@ -734,7 +734,7 @@ impl<D: Disk> Scheme for FileScheme<D> {
|
||||
}
|
||||
}
|
||||
|
||||
fn funmap(&self, address: usize) -> Result<usize> {
|
||||
fn funmap_old(&self, address: usize) -> Result<usize> {
|
||||
if let Some(id) = self.fmap.borrow_mut().remove(&address) {
|
||||
let mut files = self.files.borrow_mut();
|
||||
if let Some(file) = files.get_mut(&id) {
|
||||
@@ -747,6 +747,12 @@ impl<D: Disk> Scheme for FileScheme<D> {
|
||||
}
|
||||
}
|
||||
|
||||
//TODO: implement
|
||||
fn funmap(&self, address: usize, length: usize) -> Result<usize> {
|
||||
println!("redoxfs: funmap 0x{:X}, {}", address, length);
|
||||
Err(Error::new(ENOSYS))
|
||||
}
|
||||
|
||||
fn close(&self, id: usize) -> Result<usize> {
|
||||
// println!("Close {}", id);
|
||||
let mut files = self.files.borrow_mut();
|
||||
|
||||
Reference in New Issue
Block a user