1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
//! File trait & inode(dir, file, pipe, stdin, stdout)
mod inode;
mod stdio;
use crate::mm::UserBuffer;
/// trait File for all file types
pub trait File: Send + Sync {
/// the file readable?
fn readable(&self) -> bool;
/// the file writable?
fn writable(&self) -> bool;
/// read from the file to buf, return the number of bytes read
fn read(&self, buf: UserBuffer) -> usize;
/// write to the file from buf, return the number of bytes written
fn write(&self, buf: UserBuffer) -> usize;
}
/// The stat of a inode
#[repr(C)]
#[derive(Debug)]
pub struct Stat {
/// ID of device containing file
pub dev: u64,
/// inode number
pub ino: u64,
/// file type and mode
pub mode: StatMode,
/// number of hard links
pub nlink: u32,
/// unused pad
pad: [u64; 7],
}
bitflags! {
/// The mode of a inode
/// whether a directory or a file
pub struct StatMode: u32 {
/// null
const NULL = 0;
/// directory
const DIR = 0o040000;
/// ordinary regular file
const FILE = 0o100000;
}
}
pub use inode::{list_apps, open_file, OSInode, OpenFlags};
pub use stdio::{Stdin, Stdout};