Merge branch 'fixes' into 'master'
Fix non-append writes and cancellation. See merge request redox-os/ramfs!6
This commit is contained in:
Generated
+18
-34
@@ -4,40 +4,23 @@ version = 3
|
||||
|
||||
[[package]]
|
||||
name = "bitflags"
|
||||
version = "1.3.2"
|
||||
version = "2.5.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
|
||||
|
||||
[[package]]
|
||||
name = "bitflags"
|
||||
version = "2.4.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07"
|
||||
checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1"
|
||||
|
||||
[[package]]
|
||||
name = "libc"
|
||||
version = "0.2.150"
|
||||
version = "0.2.153"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "89d92a4743f9a61002fae18374ed11e7973f530cb3a3255fb354818118b2203c"
|
||||
checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd"
|
||||
|
||||
[[package]]
|
||||
name = "libredox"
|
||||
version = "0.0.1"
|
||||
version = "0.1.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "85c833ca1e66078851dba29046874e38f08b2c883700aa29a03ddd3b23814ee8"
|
||||
checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d"
|
||||
dependencies = [
|
||||
"bitflags 2.4.1",
|
||||
"libc",
|
||||
"redox_syscall",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "libredox"
|
||||
version = "0.0.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "962b650e6b934f95cec493e1464e0f5cba98dd9ba9ef2b1c42cdfdb7864cab5a"
|
||||
dependencies = [
|
||||
"bitflags 2.4.1",
|
||||
"bitflags",
|
||||
"libc",
|
||||
"redox_syscall",
|
||||
]
|
||||
@@ -46,7 +29,7 @@ dependencies = [
|
||||
name = "ramfs"
|
||||
version = "0.1.0"
|
||||
dependencies = [
|
||||
"libredox 0.0.3",
|
||||
"libredox",
|
||||
"redox-daemon",
|
||||
"redox-scheme",
|
||||
"redox_syscall",
|
||||
@@ -54,28 +37,29 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "redox-daemon"
|
||||
version = "0.1.2"
|
||||
version = "0.1.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "353178b5771a301b9d2b318914ab5dfeb21dd6e65930faedde19248cfceca5a7"
|
||||
checksum = "7fbdeffdb03cf2961b211a2023e683d71f2c225ea93404da5dc34b0dc94f0341"
|
||||
dependencies = [
|
||||
"libc",
|
||||
"libredox 0.0.1",
|
||||
"libredox",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "redox-scheme"
|
||||
version = "0.1.0"
|
||||
source = "git+https://gitlab.redox-os.org/redox-os/redox-scheme.git#afd3fa573f0a7c03b762ac23daaf06966afecc75"
|
||||
version = "0.2.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "4a4d4161697395d7cc9b182a14a753b2ba0243dcf622e278e644c6e7f74904c1"
|
||||
dependencies = [
|
||||
"libredox 0.0.3",
|
||||
"libredox",
|
||||
"redox_syscall",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "redox_syscall"
|
||||
version = "0.4.1"
|
||||
version = "0.5.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa"
|
||||
checksum = "469052894dcb553421e483e4209ee581a45100d31b4018de03e5a7ad86374a7e"
|
||||
dependencies = [
|
||||
"bitflags 1.3.2",
|
||||
"bitflags",
|
||||
]
|
||||
|
||||
+4
-4
@@ -9,7 +9,7 @@ description = "In-memory filesystem for Redox, which is useful for early logging
|
||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
|
||||
[dependencies]
|
||||
redox-daemon = "0.1.1"
|
||||
redox_syscall = "0.4.1"
|
||||
redox-scheme = { git = "https://gitlab.redox-os.org/redox-os/redox-scheme.git" }
|
||||
libredox = "0.0.3"
|
||||
redox-daemon = "0.1.2"
|
||||
redox_syscall = "0.5.1"
|
||||
redox-scheme = "0.2"
|
||||
libredox = "0.1.3"
|
||||
|
||||
+8
-3
@@ -3,7 +3,7 @@ use std::{env, process};
|
||||
mod filesystem;
|
||||
mod scheme;
|
||||
|
||||
use redox_scheme::SignalBehavior;
|
||||
use redox_scheme::{RequestKind, SignalBehavior};
|
||||
|
||||
use self::scheme::Scheme;
|
||||
|
||||
@@ -23,10 +23,15 @@ fn main() {
|
||||
let Some(request) = socket.next_request(SignalBehavior::Restart).expect("ramfs: failed to get next scheme request") else {
|
||||
break;
|
||||
};
|
||||
match request.kind() {
|
||||
RequestKind::Call(call) => {
|
||||
let response = call.handle_scheme_mut(&mut scheme);
|
||||
|
||||
let response = request.handle_scheme_mut(&mut scheme);
|
||||
socket.write_responses(&[response], SignalBehavior::Restart).expect("ramfs: failed to write next scheme response");
|
||||
}
|
||||
_ => (),
|
||||
}
|
||||
|
||||
socket.write_responses(&[response], SignalBehavior::Restart).expect("ramfs: failed to write next scheme response");
|
||||
}
|
||||
|
||||
process::exit(0);
|
||||
|
||||
+9
-24
@@ -279,25 +279,6 @@ impl SchemeMut for Scheme {
|
||||
|
||||
Ok(fd)
|
||||
}
|
||||
fn chmod(&mut self, path: &str, mode: u16, uid: u32, gid: u32) -> Result<usize> {
|
||||
let inode_num = self.filesystem.resolve(path.as_bytes(), uid, gid)?;
|
||||
let inode = self
|
||||
.filesystem
|
||||
.files
|
||||
.get_mut(&inode_num)
|
||||
.ok_or(Error::new(EIO))?;
|
||||
|
||||
let cur_mode = inode.mode & MODE_TYPE;
|
||||
|
||||
if inode.uid != uid && uid != 0 {
|
||||
return Err(Error::new(EACCES));
|
||||
}
|
||||
if mode & MODE_TYPE != 0 {
|
||||
return Err(Error::new(EINVAL));
|
||||
}
|
||||
inode.mode = mode | cur_mode;
|
||||
Ok(0)
|
||||
}
|
||||
fn rmdir(&mut self, path: &str, uid: u32, gid: u32) -> Result<usize> {
|
||||
self.remove_dentry(path.as_bytes(), uid, gid, true)
|
||||
}
|
||||
@@ -400,12 +381,15 @@ impl SchemeMut for Scheme {
|
||||
}
|
||||
|
||||
// if there's a seek hole, fill it with 0 and continue writing.
|
||||
if handle.offset > bytes.len() {
|
||||
let additional = handle.offset - bytes.len();
|
||||
let end_off = handle.offset.checked_add(buf.len()).ok_or(Error::new(EOVERFLOW))?;
|
||||
if end_off > bytes.len() {
|
||||
let additional = end_off - bytes.len();
|
||||
bytes.try_reserve(additional).or(Err(Error::new(ENOMEM)))?;
|
||||
bytes.resize(handle.offset, 0u8);
|
||||
bytes.resize(end_off, 0u8);
|
||||
}
|
||||
bytes.extend(buf);
|
||||
bytes[handle.offset..][..buf.len()].copy_from_slice(buf);
|
||||
handle.offset = end_off;
|
||||
|
||||
Ok(buf.len())
|
||||
} else {
|
||||
Err(Error::new(EISDIR))
|
||||
@@ -419,7 +403,6 @@ impl SchemeMut for Scheme {
|
||||
.get_mut(&handle.inode)
|
||||
.ok_or(Error::new(EBADFD))?;
|
||||
|
||||
let old = handle.offset;
|
||||
handle.offset = match whence {
|
||||
SEEK_SET => cmp::max(0, pos),
|
||||
SEEK_CUR => cmp::max(
|
||||
@@ -444,9 +427,11 @@ impl SchemeMut for Scheme {
|
||||
|
||||
let cur_type = file.mode & MODE_TYPE;
|
||||
|
||||
/*
|
||||
if mode & MODE_TYPE != 0 {
|
||||
return Err(Error::new(EINVAL));
|
||||
}
|
||||
*/
|
||||
|
||||
file.mode = mode | cur_type;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user