summaryrefslogtreecommitdiffstats
path: root/vendor/xattr/src/lib.rs
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/xattr/src/lib.rs')
-rw-r--r--vendor/xattr/src/lib.rs116
1 files changed, 116 insertions, 0 deletions
diff --git a/vendor/xattr/src/lib.rs b/vendor/xattr/src/lib.rs
new file mode 100644
index 000000000..bf00b37f3
--- /dev/null
+++ b/vendor/xattr/src/lib.rs
@@ -0,0 +1,116 @@
+//! A pure-Rust library to manage extended attributes.
+//!
+//! It provides support for manipulating extended attributes
+//! (`xattrs`) on modern Unix filesystems. See the `attr(5)`
+//! manpage for more details.
+//!
+//! An extension trait [`FileExt`](::FileExt) is provided to directly work with
+//! standard `File` objects and file descriptors.
+//!
+//! NOTE: In case of a symlink as path argument, all methods
+//! in this library work on the symlink itself **without**
+//! de-referencing it.
+//!
+//! ```rust
+//! let mut xattrs = xattr::list("/").unwrap().peekable();
+//!
+//! if xattrs.peek().is_none() {
+//! println!("no xattr set on root");
+//! return;
+//! }
+//!
+//! println!("Extended attributes:");
+//! for attr in xattrs {
+//! println!(" - {:?}", attr);
+//! }
+//! ```
+
+extern crate libc;
+
+mod error;
+mod sys;
+mod util;
+
+use std::ffi::OsStr;
+use std::fs::File;
+use std::io;
+use std::os::unix::io::AsRawFd;
+use std::path::Path;
+
+pub use error::UnsupportedPlatformError;
+pub use sys::{XAttrs, SUPPORTED_PLATFORM};
+
+/// Get an extended attribute for the specified file.
+pub fn get<N, P>(path: P, name: N) -> io::Result<Option<Vec<u8>>>
+where
+ P: AsRef<Path>,
+ N: AsRef<OsStr>,
+{
+ util::extract_noattr(sys::get_path(path.as_ref(), name.as_ref()))
+}
+
+/// Set an extended attribute on the specified file.
+pub fn set<N, P>(path: P, name: N, value: &[u8]) -> io::Result<()>
+where
+ P: AsRef<Path>,
+ N: AsRef<OsStr>,
+{
+ sys::set_path(path.as_ref(), name.as_ref(), value)
+}
+
+/// Remove an extended attribute from the specified file.
+pub fn remove<N, P>(path: P, name: N) -> io::Result<()>
+where
+ P: AsRef<Path>,
+ N: AsRef<OsStr>,
+{
+ sys::remove_path(path.as_ref(), name.as_ref())
+}
+
+/// List extended attributes attached to the specified file.
+///
+/// Note: this may not list *all* attributes. Speficially, it definitely won't list any trusted
+/// attributes unless you are root and it may not list system attributes.
+pub fn list<P>(path: P) -> io::Result<XAttrs>
+where
+ P: AsRef<Path>,
+{
+ sys::list_path(path.as_ref())
+}
+
+/// Extension trait to manipulate extended attributes on `File`-like objects.
+pub trait FileExt: AsRawFd {
+ /// Get an extended attribute for the specified file.
+ fn get_xattr<N>(&self, name: N) -> io::Result<Option<Vec<u8>>>
+ where
+ N: AsRef<OsStr>,
+ {
+ util::extract_noattr(sys::get_fd(self.as_raw_fd(), name.as_ref()))
+ }
+
+ /// Set an extended attribute on the specified file.
+ fn set_xattr<N>(&self, name: N, value: &[u8]) -> io::Result<()>
+ where
+ N: AsRef<OsStr>,
+ {
+ sys::set_fd(self.as_raw_fd(), name.as_ref(), value)
+ }
+
+ /// Remove an extended attribute from the specified file.
+ fn remove_xattr<N>(&self, name: N) -> io::Result<()>
+ where
+ N: AsRef<OsStr>,
+ {
+ sys::remove_fd(self.as_raw_fd(), name.as_ref())
+ }
+
+ /// List extended attributes attached to the specified file.
+ ///
+ /// Note: this may not list *all* attributes. Speficially, it definitely won't list any trusted
+ /// attributes unless you are root and it may not list system attributes.
+ fn list_xattr(&self) -> io::Result<XAttrs> {
+ sys::list_fd(self.as_raw_fd())
+ }
+}
+
+impl FileExt for File {}