//! 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(path: P, name: N) -> io::Result>> where P: AsRef, N: AsRef, { util::extract_noattr(sys::get_path(path.as_ref(), name.as_ref())) } /// Set an extended attribute on the specified file. pub fn set(path: P, name: N, value: &[u8]) -> io::Result<()> where P: AsRef, N: AsRef, { sys::set_path(path.as_ref(), name.as_ref(), value) } /// Remove an extended attribute from the specified file. pub fn remove(path: P, name: N) -> io::Result<()> where P: AsRef, N: AsRef, { 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

(path: P) -> io::Result where P: AsRef, { 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(&self, name: N) -> io::Result>> where N: AsRef, { util::extract_noattr(sys::get_fd(self.as_raw_fd(), name.as_ref())) } /// Set an extended attribute on the specified file. fn set_xattr(&self, name: N, value: &[u8]) -> io::Result<()> where N: AsRef, { sys::set_fd(self.as_raw_fd(), name.as_ref(), value) } /// Remove an extended attribute from the specified file. fn remove_xattr(&self, name: N) -> io::Result<()> where N: AsRef, { 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 { sys::list_fd(self.as_raw_fd()) } } impl FileExt for File {}