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