diff --git a/syscall/fs.rs b/syscall/fs.rs index 20e6c92de9d487ba9f2e9d4d9f7866a569ca8813..e79e4c0c91d7b5b2026ac922ebb9bb170210558f 100644 --- a/syscall/fs.rs +++ b/syscall/fs.rs @@ -114,12 +114,22 @@ pub fn dup(fd: usize) -> Result<usize> { file }; - let scheme = { - let schemes = scheme::schemes(); - let scheme = schemes.get(file.scheme).ok_or(Error::new(EBADF))?; - scheme.clone() + let new_id = { + let scheme = { + let schemes = scheme::schemes(); + let scheme = schemes.get(file.scheme).ok_or(Error::new(EBADF))?; + scheme.clone() + }; + scheme.dup(file.number)? }; - scheme.dup(file.number) + + let contexts = context::contexts(); + let context_lock = contexts.current().ok_or(Error::new(ESRCH))?; + let context = context_lock.read(); + context.add_file(::context::file::File { + scheme: file.scheme, + number: new_id + }).ok_or(Error::new(EMFILE)) } /// Register events for file