#define GETDENTS 80 /* to FS */
#define LLSEEK 81 /* to VFS */
#define FSTATFS 82 /* to VFS */
+#define STATVFS 83 /* to VFS */
+#define FSTATVFS 84 /* to VFS */
#define SELECT 85 /* to VFS */
#define FCHDIR 86 /* to VFS */
#define FSYNC 87 /* to VFS */
#define TAPE_STAT0 m2_l1
#define TAPE_STAT1 m2_l2
+/* Field names for the fstatvfs call */
+#define FSTATVFS_FD m1_i1
+#define FSTATVFS_BUF m1_p1
+
+/* Field names for the statvfs call */
+#define STATVFS_LEN m1_i1
+#define STATVFS_NAME m1_p1
+#define STATVFS_BUF m1_p2
/*===========================================================================*
* Messages for networking layer *
*===========================================================================*/
#define REQ_NEWNODE (VFS_BASE + 29)
#define REQ_RDLINK (VFS_BASE + 30)
#define REQ_GETDENTS (VFS_BASE + 31)
+#define REQ_STATVFS (VFS_BASE + 32)
-#define NREQS 32
+#define NREQS 33
#endif
uid_t uid, gid_t gid, char *path, node_details_t *res) );
_PROTOTYPE( int req_flush, (endpoint_t fs_e, dev_t dev) );
_PROTOTYPE( int req_fstatfs, (int fs_e, int who_e, char *buf) );
+_PROTOTYPE( int req_statvfs, (int fs_e, int who_e, char *buf) );
_PROTOTYPE( int req_ftrunc, (endpoint_t fs_e, ino_t inode_nr,
off_t start, off_t end) );
_PROTOTYPE( int req_getdents, (endpoint_t fs_e, ino_t inode_nr, u64_t pos,
_PROTOTYPE( int do_fstat, (void) );
_PROTOTYPE( int do_stat, (void) );
_PROTOTYPE( int do_fstatfs, (void) );
+_PROTOTYPE( int do_statvfs, (void) );
+_PROTOTYPE( int do_fstatvfs, (void) );
_PROTOTYPE( int do_rdlink, (void) );
_PROTOTYPE( int do_lstat, (void) );
#include <string.h>
#include <sys/stat.h>
#include <sys/statfs.h>
+#include <sys/statvfs.h>
#include <minix/vfsif.h>
#include <minix/com.h>
#include <minix/const.h>
}
+/*===========================================================================*
+ * req_statvfs *
+ *===========================================================================*/
+PUBLIC int req_statvfs(int fs_e, int who_e, char *buf)
+{
+ int r;
+ cp_grant_id_t grant_id;
+ message m;
+
+ grant_id = cpf_grant_magic(fs_e, who_e, (vir_bytes) buf, sizeof(struct statvfs),
+ CPF_WRITE);
+ if(grant_id == -1)
+ panic("req_statvfs: cpf_grant_magic failed");
+
+ /* Fill in request message */
+ m.m_type = REQ_STATVFS;
+ m.REQ_GRANT = grant_id;
+
+ /* Send/rec request */
+ r = fs_sendrec(fs_e, &m);
+ cpf_revoke(grant_id);
+
+ return(r);
+}
+
+
/*===========================================================================*
* req_ftrunc *
*===========================================================================*/
* do_stat: perform the STAT system call
* do_fstat: perform the FSTAT system call
* do_fstatfs: perform the FSTATFS system call
+ * do_statvfs: perform the STATVFS system call
+ * do_fstatvfs: perform the FSTATVFS system call
*/
#include "fs.h"
return req_fstatfs(rfilp->filp_vno->v_fs_e, who_e, m_in.buffer);
}
+/*===========================================================================*
+ * do_statvfs *
+ *===========================================================================*/
+PUBLIC int do_statvfs()
+{
+/* Perform the stat(name, buf) system call. */
+ int r;
+ struct vnode *vp;
+
+ if (fetch_name(m_in.STATVFS_NAME, m_in.STATVFS_LEN, M1) != OK) return(err_code);
+ if ((vp = eat_path(PATH_NOFLAGS)) == NULL) return(err_code);
+ r = req_statvfs(vp->v_fs_e, who_e, m_in.STATVFS_BUF);
+
+ put_vnode(vp);
+ return r;
+}
+
+
+/*===========================================================================*
+ * do_fstatvfs *
+ *===========================================================================*/
+PUBLIC int do_fstatvfs()
+{
+/* Perform the fstat(fd, buf) system call. */
+ register struct filp *rfilp;
+
+ /* Is the file descriptor valid? */
+ if ((rfilp = get_filp(m_in.FSTATVFS_FD)) == NULL) return(err_code);
+
+ return req_statvfs(rfilp->filp_vno->v_fs_e, who_e, m_in.FSTATVFS_BUF);
+}
+
/*===========================================================================*
* do_lstat *
do_getdents, /* 80 = getdents */
do_llseek, /* 81 = llseek */
do_fstatfs, /* 82 = fstatfs */
- no_sys, /* 83 = unused */
- no_sys, /* 84 = unused */
+ do_statvfs, /* 83 = fstatvfs */
+ do_fstatvfs, /* 84 = statvfs */
do_select, /* 85 = select */
do_fchdir, /* 86 = fchdir */
do_fsync, /* 87 = fsync */