This commit is contained in:
Jeremy Soller 2016-09-23 11:01:53 -06:00
parent 5b3aeb4a9f
commit 94ef9dd14a
7 changed files with 151 additions and 39 deletions

View file

@ -152,6 +152,24 @@ pub fn fsync(fd: usize) -> Result<usize> {
scheme.fsync(file.number)
}
/// Truncate the file descriptor
pub fn ftruncate(fd: usize, len: usize) -> Result<usize> {
let file = {
let contexts = context::contexts();
let context_lock = contexts.current().ok_or(Error::new(ESRCH))?;
let context = context_lock.read();
let file = context.get_file(fd).ok_or(Error::new(EBADF))?;
file
};
let scheme = {
let schemes = scheme::schemes();
let scheme = schemes.get(file.scheme).ok_or(Error::new(EBADF))?;
scheme.clone()
};
scheme.ftruncate(file.number, len)
}
/// Seek to an offset
pub fn lseek(fd: usize, pos: usize, whence: usize) -> Result<usize> {
let file = {

View file

@ -39,6 +39,7 @@ pub extern fn syscall(a: usize, b: usize, c: usize, d: usize, e: usize, f: usize
SYS_FSTAT => fstat(b, &mut validate_slice_mut(c as *mut Stat, 1)?[0]),
SYS_DUP => dup(b),
SYS_BRK => brk(b),
SYS_FTRUNCATE => ftruncate(b, c),
SYS_IOPL => iopl(b),
SYS_FSYNC => fsync(b),
SYS_CLONE => clone(b, stack),

View file

@ -66,6 +66,7 @@ pub fn clone(flags: usize, stack_base: usize) -> Result<usize> {
let mut stack_option = None;
let grants;
let cwd;
let env;
let files;
// Copy from old process
@ -181,6 +182,12 @@ pub fn clone(flags: usize, stack_base: usize) -> Result<usize> {
cwd = Arc::new(Mutex::new(context.cwd.lock().clone()));
}
if flags & CLONE_VM == CLONE_VM {
env = context.env.clone();
} else {
env = Arc::new(Mutex::new(context.env.lock().clone()));
}
if flags & CLONE_FILES == CLONE_FILES {
files = context.files.clone();
} else {
@ -339,6 +346,8 @@ pub fn clone(flags: usize, stack_base: usize) -> Result<usize> {
context.cwd = cwd;
context.env = env;
context.files = files;
context.arch.set_page_table(unsafe { new_table.address() });