From 6283f7cc6f8da072fc4b24af6941e5e158e99275 Mon Sep 17 00:00:00 2001 From: Olivier 'reivilibre Date: Wed, 26 Jan 2022 19:20:23 +0000 Subject: [PATCH] Fix and simplify open() code --- olivefsd/src/server/connections.rs | 9 +++- olivefsd/src/server/file_access.rs | 75 ++++++++++++------------------ 2 files changed, 39 insertions(+), 45 deletions(-) diff --git a/olivefsd/src/server/connections.rs b/olivefsd/src/server/connections.rs index 5597224..b907cab 100644 --- a/olivefsd/src/server/connections.rs +++ b/olivefsd/src/server/connections.rs @@ -43,7 +43,14 @@ pub async fn handle_command_stream( send_bare_message(&mut tx, &file_access.lookup(dir_vnode, name).await?).await?; } DataCommand::OpenFile { vnode, mode } => { - send_bare_message(&mut tx, &file_access.open(vnode, mode).await?).await?; + send_bare_message( + &mut tx, + &file_access + .open(vnode, mode) + .await + .unwrap_or_else(error_to_response), + ) + .await?; } DataCommand::ReleaseFile { file_handle } => { send_bare_message(&mut tx, &file_access.release(file_handle).await?).await?; diff --git a/olivefsd/src/server/file_access.rs b/olivefsd/src/server/file_access.rs index de3057e..6e5e9ff 100644 --- a/olivefsd/src/server/file_access.rs +++ b/olivefsd/src/server/file_access.rs @@ -498,54 +498,41 @@ impl FileAccess { /// Symlink safety: /// Safe — uses O_NOFOLLOW after dereferencing safe symlinks. pub async fn open(&self, vnode: VnodeId, mode: OpenMode) -> anyhow::Result> { - match self + let path = self .resolve_vnode_including_follow_symlinks_safely_best_effort(vnode) - .await - { - Ok(path) => { - let mut open_options = OpenOptions::new(); + .await?; + let mut open_options = OpenOptions::new(); - // IMPORTANT — Don't follow symlinks - open_options.custom_flags(O_NOFOLLOW); + // IMPORTANT — Don't follow symlinks + open_options.custom_flags(O_NOFOLLOW); - if mode.read { - open_options.read(true); - } - if mode.write { - open_options.write(true); - warn!("DANGER: file opened with write mode"); - } - if mode.append { - open_options.append(true); - error!("UNSUPPORTED: file opened with append mode"); - todo!(); - } - // TODO truncate? - - match open_options.open(&path).await { - Ok(file) => { - // TODO offset & append files: how does that work? - let handle = Arc::new(RwLock::new(FileHandle { file, offset: 0 })); - - let file_handle: u32 = self - .client_state - .file_handles - .write() - .await - .insert(handle) - .try_into() - .unwrap(); - Ok(DataResponse::Success(file_handle)) - } - Err(error) => Ok(io_error_to_response( - error, - EFAULT, - &format!("open {:?}", path), - )), - } - } - Err(response) => Ok(response), + if mode.read { + open_options.read(true); } + if mode.write { + open_options.write(true); + warn!("DANGER: file opened with write mode"); + } + if mode.append { + open_options.append(true); + error!("UNSUPPORTED: file opened with append mode"); + todo!(); + } + // TODO truncate? + + let file = open_options.open(&path).await?; + // TODO offset & append files: how does that work? + let handle = Arc::new(RwLock::new(FileHandle { file, offset: 0 })); + + let file_handle: u32 = self + .client_state + .file_handles + .write() + .await + .insert(handle) + .try_into() + .unwrap(); + Ok(DataResponse::Success(file_handle)) } /// Symlink safety: