From f418d30dc9c08b9c45b51f335263fd057ca17f33 Mon Sep 17 00:00:00 2001 From: Jeremy Soller <jackpot51@gmail.com> Date: Sun, 9 Apr 2017 22:09:29 -0600 Subject: [PATCH] Add O_APPEND functionality --- mount/redox/resource.rs | 4 ++-- mount/redox/scheme.rs | 18 +++++++++++++++--- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/mount/redox/resource.rs b/mount/redox/resource.rs index d0f1162..586621b 100644 --- a/mount/redox/resource.rs +++ b/mount/redox/resource.rs @@ -117,12 +117,12 @@ pub struct FileResource { } impl FileResource { - pub fn new(path: String, block: u64, flags: usize) -> FileResource { + pub fn new(path: String, block: u64, flags: usize, seek: u64) -> FileResource { FileResource { path: path, block: block, flags: flags, - seek: 0, + seek: seek, } } } diff --git a/mount/redox/scheme.rs b/mount/redox/scheme.rs index d5aa3f0..503adb0 100644 --- a/mount/redox/scheme.rs +++ b/mount/redox/scheme.rs @@ -9,7 +9,7 @@ use std::sync::atomic::{AtomicUsize, Ordering}; use syscall::data::{Stat, StatVfs}; use syscall::error::{Error, Result, EACCES, EEXIST, EISDIR, ENOTDIR, EPERM, ENOENT, EBADF}; -use syscall::flag::{O_CREAT, O_DIRECTORY, O_STAT, O_EXCL, O_TRUNC, O_ACCMODE, O_RDONLY, O_WRONLY, O_RDWR, MODE_PERM}; +use syscall::flag::{O_APPEND, O_CREAT, O_DIRECTORY, O_STAT, O_EXCL, O_TRUNC, O_ACCMODE, O_RDONLY, O_WRONLY, O_RDWR, MODE_PERM}; use syscall::scheme::Scheme; pub struct FileScheme { @@ -133,7 +133,13 @@ impl Scheme for FileScheme { try!(fs.node_set_len(node.0, 0)); } - Box::new(FileResource::new(path.to_string(), node.0, flags)) + let seek = if flags & O_APPEND == O_APPEND { + try!(fs.node_len(node.0)) + } else { + 0 + }; + + Box::new(FileResource::new(path.to_string(), node.0, flags, seek)) }, None => if flags & O_CREAT == O_CREAT { let mut last_part = String::new(); @@ -169,7 +175,13 @@ impl Scheme for FileScheme { if dir { Box::new(DirResource::new(path.to_string(), node.0, Vec::new())) } else { - Box::new(FileResource::new(path.to_string(), node.0, flags)) + let seek = if flags & O_APPEND == O_APPEND { + try!(fs.node_len(node.0)) + } else { + 0 + }; + + Box::new(FileResource::new(path.to_string(), node.0, flags, seek)) } } else { return Err(Error::new(EPERM)); -- GitLab