From 374213f155a0cf503db39beb07b246b60565a77e Mon Sep 17 00:00:00 2001 From: Ian Douglas Scott Date: Fri, 28 Jul 2017 15:06:50 -0700 Subject: [PATCH] F_GETFD and F_SETFD --- src/syscall/fs.rs | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/src/syscall/fs.rs b/src/syscall/fs.rs index 5c693bd..76fcfd6 100644 --- a/src/syscall/fs.rs +++ b/src/syscall/fs.rs @@ -8,7 +8,7 @@ use scheme::{self, FileHandle}; use syscall; use syscall::data::{Packet, Stat}; use syscall::error::*; -use syscall::flag::{F_GETFL, F_SETFL, O_ACCMODE, O_RDONLY, O_WRONLY, MODE_DIR, MODE_FILE, O_CLOEXEC}; +use syscall::flag::{F_GETFD, F_SETFD, F_GETFL, F_SETFL, O_ACCMODE, O_RDONLY, O_WRONLY, MODE_DIR, MODE_FILE, O_CLOEXEC}; use context::file::{FileDescriptor, FileDescription}; pub fn file_op(a: usize, fd: FileHandle, c: usize, d: usize) -> Result { @@ -356,13 +356,13 @@ pub fn fcntl(fd: FileHandle, cmd: usize, arg: usize) -> Result { let description = file.description.read(); // Communicate fcntl with scheme - let _res = { + if cmd != F_GETFD && cmd != F_SETFD { let scheme = { let schemes = scheme::schemes(); let scheme = schemes.get(description.scheme).ok_or(Error::new(EBADF))?; scheme.clone() }; - scheme.fcntl(description.number, cmd, arg)? + scheme.fcntl(description.number, cmd, arg)?; }; // Perform kernel operation if scheme agrees @@ -373,6 +373,17 @@ pub fn fcntl(fd: FileHandle, cmd: usize, arg: usize) -> Result { let mut files = context.files.lock(); match *files.get_mut(fd.into()).ok_or(Error::new(EBADF))? { Some(ref mut file) => match cmd { + F_GETFD => { + if file.cloexec { + Ok(O_CLOEXEC) + } else { + Ok(0) + } + }, + F_SETFD => { + file.cloexec = arg & O_CLOEXEC == O_CLOEXEC; + Ok(0) + }, F_GETFL => { Ok(description.flags) },