Implement SMB AFP_AfpInfo read/write via xattr (Phase 2.8 complete)
Some checks failed
Test / test (push) Has been cancelled
Test / build (push) Has been cancelled

This commit is contained in:
Warren
2026-06-22 15:16:59 +08:00
parent 25991c71b2
commit 1c8c47d5fa
6 changed files with 251 additions and 4 deletions

View File

@@ -428,6 +428,71 @@ impl ShareBackend for LocalFsBackend {
case_sensitive: cfg!(any(target_os = "linux", target_os = "freebsd")),
}
}
async fn get_xattr(&self, path: &SmbPath, name: &str) -> SmbResult<Vec<u8>> {
let rel = to_rel_path(path);
let root = Arc::clone(&self.root);
let xattr_name = name.to_string();
spawn_blocking(move || {
let full_path = root.join(&rel);
xattr::get(full_path.as_std_path(), &xattr_name)
.map_err(|e| SmbError::Io(e.into()))
})
.await
.map_err(join_to_io)?
}
async fn set_xattr(&self, path: &SmbPath, name: &str, value: &[u8]) -> SmbResult<()> {
if self.read_only {
return Err(SmbError::AccessDenied);
}
let rel = to_rel_path(path);
let root = Arc::clone(&self.root);
let xattr_name = name.to_string();
let value = value.to_vec();
spawn_blocking(move || {
let full_path = root.join(&rel);
xattr::set(full_path.as_std_path(), &xattr_name, &value)
.map_err(|e| SmbError::Io(e.into()))
})
.await
.map_err(join_to_io)?
}
async fn remove_xattr(&self, path: &SmbPath, name: &str) -> SmbResult<()> {
if self.read_only {
return Err(SmbError::AccessDenied);
}
let rel = to_rel_path(path);
let root = Arc::clone(&self.root);
let xattr_name = name.to_string();
spawn_blocking(move || {
let full_path = root.join(&rel);
xattr::remove(full_path.as_std_path(), &xattr_name)
.map_err(|e| SmbError::Io(e.into()))
})
.await
.map_err(join_to_io)?
}
async fn list_xattrs(&self, path: &SmbPath) -> SmbResult<Vec<String>> {
let rel = to_rel_path(path);
let root = Arc::clone(&self.root);
spawn_blocking(move || {
let full_path = root.join(&rel);
xattr::list(full_path.as_std_path())
.map(|attrs| attrs.into_iter().map(|s| s.to_string()).collect())
.map_err(|e| SmbError::Io(e.into()))
})
.await
.map_err(join_to_io)?
}
}
// ---------------------------------------------------------------------------