From dcaf5c76be265bbfa5013cf131f14fa79680a634 Mon Sep 17 00:00:00 2001
From: Jeremy Soller <jackpot51@gmail.com>
Date: Fri, 18 Nov 2016 08:42:48 -0700
Subject: [PATCH] Add statvfs

---
 scheme/scheme.rs | 21 ++++++++++++++++++++-
 1 file changed, 20 insertions(+), 1 deletion(-)

diff --git a/scheme/scheme.rs b/scheme/scheme.rs
index c6ff37b..3774a65 100644
--- a/scheme/scheme.rs
+++ b/scheme/scheme.rs
@@ -7,7 +7,7 @@ use std::collections::BTreeMap;
 use std::str;
 use std::sync::atomic::{AtomicUsize, Ordering};
 
-use syscall::data::Stat;
+use syscall::data::{Stat, StatVfs};
 use syscall::error::{Error, Result, EACCES, EEXIST, EISDIR, ENOTDIR, EPERM, ENOENT, EBADF};
 use syscall::flag::{O_CREAT, O_TRUNC, O_ACCMODE, O_RDONLY, O_WRONLY, O_RDWR, MODE_PERM};
 use syscall::scheme::Scheme;
@@ -403,6 +403,25 @@ impl Scheme for FileScheme {
         }
     }
 
+    fn fstatvfs(&self, id: usize, stat: &mut StatVfs) -> Result<usize> {
+        let files = self.files.lock();
+        if let Some(_file) = files.get(&id) {
+            let mut fs = self.fs.borrow_mut();
+
+            let free = fs.header.1.free;
+            let free_size = fs.node_len(free)?;
+
+            stat.f_bsize = 512;
+            stat.f_blocks = fs.header.1.size/(stat.f_bsize as u64);
+            stat.f_bfree = free_size/(stat.f_bsize as u64);
+            stat.f_bavail = stat.f_bfree;
+
+            Ok(0)
+        } else {
+            Err(Error::new(EBADF))
+        }
+    }
+
     fn fsync(&self, id: usize) -> Result<usize> {
         // println!("Fsync {}", id);
         let mut files = self.files.lock();
-- 
GitLab