Fix and simplify open() code
This commit is contained in:
parent
e594fad962
commit
6283f7cc6f
@ -43,7 +43,14 @@ pub async fn handle_command_stream(
|
|||||||
send_bare_message(&mut tx, &file_access.lookup(dir_vnode, name).await?).await?;
|
send_bare_message(&mut tx, &file_access.lookup(dir_vnode, name).await?).await?;
|
||||||
}
|
}
|
||||||
DataCommand::OpenFile { vnode, mode } => {
|
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 } => {
|
DataCommand::ReleaseFile { file_handle } => {
|
||||||
send_bare_message(&mut tx, &file_access.release(file_handle).await?).await?;
|
send_bare_message(&mut tx, &file_access.release(file_handle).await?).await?;
|
||||||
|
@ -498,54 +498,41 @@ impl FileAccess {
|
|||||||
/// Symlink safety:
|
/// Symlink safety:
|
||||||
/// Safe — uses O_NOFOLLOW after dereferencing safe symlinks.
|
/// Safe — uses O_NOFOLLOW after dereferencing safe symlinks.
|
||||||
pub async fn open(&self, vnode: VnodeId, mode: OpenMode) -> anyhow::Result<DataResponse<u32>> {
|
pub async fn open(&self, vnode: VnodeId, mode: OpenMode) -> anyhow::Result<DataResponse<u32>> {
|
||||||
match self
|
let path = self
|
||||||
.resolve_vnode_including_follow_symlinks_safely_best_effort(vnode)
|
.resolve_vnode_including_follow_symlinks_safely_best_effort(vnode)
|
||||||
.await
|
.await?;
|
||||||
{
|
let mut open_options = OpenOptions::new();
|
||||||
Ok(path) => {
|
|
||||||
let mut open_options = OpenOptions::new();
|
|
||||||
|
|
||||||
// IMPORTANT — Don't follow symlinks
|
// IMPORTANT — Don't follow symlinks
|
||||||
open_options.custom_flags(O_NOFOLLOW);
|
open_options.custom_flags(O_NOFOLLOW);
|
||||||
|
|
||||||
if mode.read {
|
if mode.read {
|
||||||
open_options.read(true);
|
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.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:
|
/// Symlink safety:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user