mkdir and rmdir

This commit is contained in:
Jeremy Soller 2016-09-28 11:26:49 -06:00
parent a68d5a5237
commit 14d3798a48
2 changed files with 46 additions and 0 deletions

View file

@ -62,6 +62,50 @@ pub fn open(path: &[u8], flags: usize) -> Result<usize> {
}).ok_or(Error::new(EMFILE)) }).ok_or(Error::new(EMFILE))
} }
/// mkdir syscall
pub fn mkdir(path: &[u8], mode: usize) -> Result<usize> {
let path_canon = {
let contexts = context::contexts();
let context_lock = contexts.current().ok_or(Error::new(ESRCH))?;
let context = context_lock.read();
context.canonicalize(path)
};
let mut parts = path_canon.splitn(2, |&b| b == b':');
let namespace_opt = parts.next();
let reference_opt = parts.next();
let namespace = namespace_opt.ok_or(Error::new(ENOENT))?;
let scheme = {
let schemes = scheme::schemes();
let (_scheme_id, scheme) = schemes.get_name(namespace).ok_or(Error::new(ENOENT))?;
scheme.clone()
};
scheme.mkdir(reference_opt.unwrap_or(b""), mode)
}
/// rmdir syscall
pub fn rmdir(path: &[u8]) -> Result<usize> {
let path_canon = {
let contexts = context::contexts();
let context_lock = contexts.current().ok_or(Error::new(ESRCH))?;
let context = context_lock.read();
context.canonicalize(path)
};
let mut parts = path_canon.splitn(2, |&b| b == b':');
let namespace_opt = parts.next();
let reference_opt = parts.next();
let namespace = namespace_opt.ok_or(Error::new(ENOENT))?;
let scheme = {
let schemes = scheme::schemes();
let (_scheme_id, scheme) = schemes.get_name(namespace).ok_or(Error::new(ENOENT))?;
scheme.clone()
};
scheme.rmdir(reference_opt.unwrap_or(b""))
}
/// Unlink syscall /// Unlink syscall
pub fn unlink(path: &[u8]) -> Result<usize> { pub fn unlink(path: &[u8]) -> Result<usize> {
let path_canon = { let path_canon = {

View file

@ -38,6 +38,8 @@ pub extern fn syscall(a: usize, b: usize, c: usize, d: usize, e: usize, f: usize
SYS_LSEEK => lseek(b, c, d), SYS_LSEEK => lseek(b, c, d),
SYS_GETPID => getpid(), SYS_GETPID => getpid(),
SYS_FSTAT => fstat(b, &mut validate_slice_mut(c as *mut Stat, 1)?[0]), SYS_FSTAT => fstat(b, &mut validate_slice_mut(c as *mut Stat, 1)?[0]),
SYS_MKDIR => mkdir(validate_slice(b as *const u8, c)?, d),
SYS_RMDIR => rmdir(validate_slice(b as *const u8, c)?),
SYS_DUP => dup(b), SYS_DUP => dup(b),
SYS_BRK => brk(b), SYS_BRK => brk(b),
SYS_FTRUNCATE => ftruncate(b, c), SYS_FTRUNCATE => ftruncate(b, c),