1 use crate::{backend, io, path};
2 use backend::c;
3 use backend::fd::AsFd;
4 use bitflags::bitflags;
5
6 bitflags! {
7 /// `XATTR_*` constants for use with [`setxattr`], and other `*setxattr`
8 /// functions.
9 #[repr(transparent)]
10 #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)]
11 pub struct XattrFlags: c::c_uint {
12 /// `XATTR_CREATE`
13 const CREATE = c::XATTR_CREATE as c::c_uint;
14
15 /// `XATTR_REPLACE`
16 const REPLACE = c::XATTR_REPLACE as c::c_uint;
17
18 /// <https://docs.rs/bitflags/*/bitflags/#externally-defined-flags>
19 const _ = !0;
20 }
21 }
22
23 /// `getxattr(path, name, value.as_ptr(), value.len())`—Get extended
24 /// filesystem attributes.
25 ///
26 /// # References
27 /// - [Linux]
28 ///
29 /// [Linux]: https://man7.org/linux/man-pages/man2/getxattr.2.html
30 #[inline]
getxattr<P: path::Arg, Name: path::Arg>( path: P, name: Name, value: &mut [u8], ) -> io::Result<usize>31 pub fn getxattr<P: path::Arg, Name: path::Arg>(
32 path: P,
33 name: Name,
34 value: &mut [u8],
35 ) -> io::Result<usize> {
36 path.into_with_c_str(|path| {
37 name.into_with_c_str(|name| backend::fs::syscalls::getxattr(path, name, value))
38 })
39 }
40
41 /// `lgetxattr(path, name, value.as_ptr(), value.len())`—Get extended
42 /// filesystem attributes, without following symlinks in the last path
43 /// component.
44 ///
45 /// # References
46 /// - [Linux]
47 ///
48 /// [Linux]: https://man7.org/linux/man-pages/man2/lgetxattr.2.html
49 #[inline]
lgetxattr<P: path::Arg, Name: path::Arg>( path: P, name: Name, value: &mut [u8], ) -> io::Result<usize>50 pub fn lgetxattr<P: path::Arg, Name: path::Arg>(
51 path: P,
52 name: Name,
53 value: &mut [u8],
54 ) -> io::Result<usize> {
55 path.into_with_c_str(|path| {
56 name.into_with_c_str(|name| backend::fs::syscalls::lgetxattr(path, name, value))
57 })
58 }
59
60 /// `fgetxattr(fd, name, value.as_ptr(), value.len())`—Get extended
61 /// filesystem attributes on an open file descriptor.
62 ///
63 /// # References
64 /// - [Linux]
65 ///
66 /// [Linux]: https://man7.org/linux/man-pages/man2/fgetxattr.2.html
67 #[inline]
fgetxattr<Fd: AsFd, Name: path::Arg>( fd: Fd, name: Name, value: &mut [u8], ) -> io::Result<usize>68 pub fn fgetxattr<Fd: AsFd, Name: path::Arg>(
69 fd: Fd,
70 name: Name,
71 value: &mut [u8],
72 ) -> io::Result<usize> {
73 name.into_with_c_str(|name| backend::fs::syscalls::fgetxattr(fd.as_fd(), name, value))
74 }
75
76 /// `setxattr(path, name, value.as_ptr(), value.len(), flags)`—Set extended
77 /// filesystem attributes.
78 ///
79 /// # References
80 /// - [Linux]
81 ///
82 /// [Linux]: https://man7.org/linux/man-pages/man2/setxattr.2.html
83 #[inline]
setxattr<P: path::Arg, Name: path::Arg>( path: P, name: Name, value: &[u8], flags: XattrFlags, ) -> io::Result<()>84 pub fn setxattr<P: path::Arg, Name: path::Arg>(
85 path: P,
86 name: Name,
87 value: &[u8],
88 flags: XattrFlags,
89 ) -> io::Result<()> {
90 path.into_with_c_str(|path| {
91 name.into_with_c_str(|name| backend::fs::syscalls::setxattr(path, name, value, flags))
92 })
93 }
94
95 /// `setxattr(path, name, value.as_ptr(), value.len(), flags)`—Set extended
96 /// filesystem attributes, without following symlinks in the last path
97 /// component.
98 ///
99 /// # References
100 /// - [Linux]
101 ///
102 /// [Linux]: https://man7.org/linux/man-pages/man2/lsetxattr.2.html
103 #[inline]
lsetxattr<P: path::Arg, Name: path::Arg>( path: P, name: Name, value: &[u8], flags: XattrFlags, ) -> io::Result<()>104 pub fn lsetxattr<P: path::Arg, Name: path::Arg>(
105 path: P,
106 name: Name,
107 value: &[u8],
108 flags: XattrFlags,
109 ) -> io::Result<()> {
110 path.into_with_c_str(|path| {
111 name.into_with_c_str(|name| backend::fs::syscalls::lsetxattr(path, name, value, flags))
112 })
113 }
114
115 /// `fsetxattr(fd, name, value.as_ptr(), value.len(), flags)`—Set extended
116 /// filesystem attributes on an open file descriptor.
117 ///
118 /// # References
119 /// - [Linux]
120 ///
121 /// [Linux]: https://man7.org/linux/man-pages/man2/fsetxattr.2.html
122 #[inline]
fsetxattr<Fd: AsFd, Name: path::Arg>( fd: Fd, name: Name, value: &[u8], flags: XattrFlags, ) -> io::Result<()>123 pub fn fsetxattr<Fd: AsFd, Name: path::Arg>(
124 fd: Fd,
125 name: Name,
126 value: &[u8],
127 flags: XattrFlags,
128 ) -> io::Result<()> {
129 name.into_with_c_str(|name| backend::fs::syscalls::fsetxattr(fd.as_fd(), name, value, flags))
130 }
131
132 /// `listxattr(path, list.as_ptr(), list.len())`—List extended filesystem
133 /// attributes.
134 ///
135 /// # References
136 /// - [Linux]
137 ///
138 /// [Linux]: https://man7.org/linux/man-pages/man2/listxattr.2.html
139 #[inline]
listxattr<P: path::Arg>(path: P, list: &mut [c::c_char]) -> io::Result<usize>140 pub fn listxattr<P: path::Arg>(path: P, list: &mut [c::c_char]) -> io::Result<usize> {
141 path.into_with_c_str(|path| backend::fs::syscalls::listxattr(path, list))
142 }
143
144 /// `llistxattr(path, list.as_ptr(), list.len())`—List extended filesystem
145 /// attributes, without following symlinks in the last path component.
146 ///
147 /// # References
148 /// - [Linux]
149 ///
150 /// [Linux]: https://man7.org/linux/man-pages/man2/llistxattr.2.html
151 #[inline]
llistxattr<P: path::Arg>(path: P, list: &mut [c::c_char]) -> io::Result<usize>152 pub fn llistxattr<P: path::Arg>(path: P, list: &mut [c::c_char]) -> io::Result<usize> {
153 path.into_with_c_str(|path| backend::fs::syscalls::llistxattr(path, list))
154 }
155
156 /// `flistxattr(fd, list.as_ptr(), list.len())`—List extended filesystem
157 /// attributes on an open file descriptor.
158 ///
159 /// # References
160 /// - [Linux]
161 ///
162 /// [Linux]: https://man7.org/linux/man-pages/man2/flistxattr.2.html
163 #[inline]
flistxattr<Fd: AsFd>(fd: Fd, list: &mut [c::c_char]) -> io::Result<usize>164 pub fn flistxattr<Fd: AsFd>(fd: Fd, list: &mut [c::c_char]) -> io::Result<usize> {
165 backend::fs::syscalls::flistxattr(fd.as_fd(), list)
166 }
167
168 /// `removexattr(path, name)`—Remove an extended filesystem attribute.
169 ///
170 /// # References
171 /// - [Linux]
172 ///
173 /// [Linux]: https://man7.org/linux/man-pages/man2/removexattr.2.html
removexattr<P: path::Arg, Name: path::Arg>(path: P, name: Name) -> io::Result<()>174 pub fn removexattr<P: path::Arg, Name: path::Arg>(path: P, name: Name) -> io::Result<()> {
175 path.into_with_c_str(|path| {
176 name.into_with_c_str(|name| backend::fs::syscalls::removexattr(path, name))
177 })
178 }
179
180 /// `lremovexattr(path, name)`—Remove an extended filesystem attribute,
181 /// without following symlinks in the last path component.
182 ///
183 /// # References
184 /// - [Linux]
185 ///
186 /// [Linux]: https://man7.org/linux/man-pages/man2/lremovexattr.2.html
lremovexattr<P: path::Arg, Name: path::Arg>(path: P, name: Name) -> io::Result<()>187 pub fn lremovexattr<P: path::Arg, Name: path::Arg>(path: P, name: Name) -> io::Result<()> {
188 path.into_with_c_str(|path| {
189 name.into_with_c_str(|name| backend::fs::syscalls::lremovexattr(path, name))
190 })
191 }
192
193 /// `fremovexattr(fd, name)`—Remove an extended filesystem attribute on an
194 /// open file descriptor.
195 ///
196 /// # References
197 /// - [Linux]
198 ///
199 /// [Linux]: https://man7.org/linux/man-pages/man2/fremovexattr.2.html
fremovexattr<Fd: AsFd, Name: path::Arg>(fd: Fd, name: Name) -> io::Result<()>200 pub fn fremovexattr<Fd: AsFd, Name: path::Arg>(fd: Fd, name: Name) -> io::Result<()> {
201 name.into_with_c_str(|name| backend::fs::syscalls::fremovexattr(fd.as_fd(), name))
202 }
203