1 //! Redox-specific extensions to primitives in the `std::fs` module.
3 #![stable(feature = "rust1", since = "1.0.0")]
5 use crate::fs::{self, Permissions, OpenOptions};
9 use crate::sys_common::{FromInner, AsInner, AsInnerMut};
11 /// Redox-specific extensions to [`fs::Permissions`].
13 /// [`fs::Permissions`]: ../../../../std/fs/struct.Permissions.html
14 #[stable(feature = "fs_ext", since = "1.1.0")]
15 pub trait PermissionsExt {
16 /// Returns the underlying raw `mode_t` bits that are the standard Redox
17 /// permissions for this file.
22 /// use std::fs::File;
23 /// use std::os::redox::fs::PermissionsExt;
25 /// fn main() -> std::io::Result<()> {
26 /// let f = File::create("foo.txt")?;
27 /// let metadata = f.metadata()?;
28 /// let permissions = metadata.permissions();
30 /// println!("permissions: {}", permissions.mode());
34 #[stable(feature = "fs_ext", since = "1.1.0")]
35 fn mode(&self) -> u32;
37 /// Sets the underlying raw bits for this set of permissions.
42 /// use std::fs::File;
43 /// use std::os::redox::fs::PermissionsExt;
45 /// fn main() -> std::io::Result<()> {
46 /// let f = File::create("foo.txt")?;
47 /// let metadata = f.metadata()?;
48 /// let mut permissions = metadata.permissions();
50 /// permissions.set_mode(0o644); // Read/write for owner and read for others.
51 /// assert_eq!(permissions.mode(), 0o644);
55 #[stable(feature = "fs_ext", since = "1.1.0")]
56 fn set_mode(&mut self, mode: u32);
58 /// Creates a new instance of `Permissions` from the given set of Redox
64 /// use std::fs::Permissions;
65 /// use std::os::redox::fs::PermissionsExt;
67 /// // Read/write for owner and read for others.
68 /// let permissions = Permissions::from_mode(0o644);
69 /// assert_eq!(permissions.mode(), 0o644);
71 #[stable(feature = "fs_ext", since = "1.1.0")]
72 fn from_mode(mode: u32) -> Self;
75 #[stable(feature = "fs_ext", since = "1.1.0")]
76 impl PermissionsExt for Permissions {
77 fn mode(&self) -> u32 {
78 self.as_inner().mode()
81 fn set_mode(&mut self, mode: u32) {
82 *self = Permissions::from_inner(FromInner::from_inner(mode));
85 fn from_mode(mode: u32) -> Permissions {
86 Permissions::from_inner(FromInner::from_inner(mode))
90 /// Redox-specific extensions to [`fs::OpenOptions`].
92 /// [`fs::OpenOptions`]: ../../../../std/fs/struct.OpenOptions.html
93 #[stable(feature = "fs_ext", since = "1.1.0")]
94 pub trait OpenOptionsExt {
95 /// Sets the mode bits that a new file will be created with.
97 /// If a new file is created as part of a `File::open_opts` call then this
98 /// specified `mode` will be used as the permission bits for the new file.
99 /// If no `mode` is set, the default of `0o666` will be used.
100 /// The operating system masks out bits with the systems `umask`, to produce
101 /// the final permissions.
106 /// # #![feature(libc)]
107 /// extern crate libc;
108 /// use std::fs::OpenOptions;
109 /// use std::os::redox::fs::OpenOptionsExt;
112 /// let mut options = OpenOptions::new();
113 /// options.mode(0o644); // Give read/write for owner and read for others.
114 /// let file = options.open("foo.txt");
117 #[stable(feature = "fs_ext", since = "1.1.0")]
118 fn mode(&mut self, mode: u32) -> &mut Self;
120 /// Passes custom flags to the `flags` argument of `open`.
122 /// The bits that define the access mode are masked out with `O_ACCMODE`, to
123 /// ensure they do not interfere with the access mode set by Rusts options.
125 /// Custom flags can only set flags, not remove flags set by Rusts options.
126 /// This options overwrites any previously set custom flags.
131 /// # #![feature(libc)]
132 /// extern crate libc;
133 /// use std::fs::OpenOptions;
134 /// use std::os::redox::fs::OpenOptionsExt;
137 /// let mut options = OpenOptions::new();
138 /// options.write(true);
139 /// if cfg!(target_os = "redox") {
140 /// options.custom_flags(libc::O_NOFOLLOW);
142 /// let file = options.open("foo.txt");
145 #[stable(feature = "open_options_ext", since = "1.10.0")]
146 fn custom_flags(&mut self, flags: i32) -> &mut Self;
149 #[stable(feature = "fs_ext", since = "1.1.0")]
150 impl OpenOptionsExt for OpenOptions {
151 fn mode(&mut self, mode: u32) -> &mut OpenOptions {
152 self.as_inner_mut().mode(mode); self
155 fn custom_flags(&mut self, flags: i32) -> &mut OpenOptions {
156 self.as_inner_mut().custom_flags(flags); self
160 /// Redox-specific extensions to [`fs::Metadata`].
162 /// [`fs::Metadata`]: ../../../../std/fs/struct.Metadata.html
163 #[stable(feature = "metadata_ext", since = "1.1.0")]
164 pub trait MetadataExt {
165 #[stable(feature = "metadata_ext", since = "1.1.0")]
166 fn dev(&self) -> u64;
167 #[stable(feature = "metadata_ext", since = "1.1.0")]
168 fn ino(&self) -> u64;
169 #[stable(feature = "metadata_ext", since = "1.1.0")]
170 fn mode(&self) -> u32;
171 #[stable(feature = "metadata_ext", since = "1.1.0")]
172 fn nlink(&self) -> u64;
173 #[stable(feature = "metadata_ext", since = "1.1.0")]
174 fn uid(&self) -> u32;
175 #[stable(feature = "metadata_ext", since = "1.1.0")]
176 fn gid(&self) -> u32;
177 #[stable(feature = "metadata_ext", since = "1.1.0")]
178 fn size(&self) -> u64;
179 #[stable(feature = "metadata_ext", since = "1.1.0")]
180 fn atime(&self) -> i64;
181 #[stable(feature = "metadata_ext", since = "1.1.0")]
182 fn atime_nsec(&self) -> i64;
183 #[stable(feature = "metadata_ext", since = "1.1.0")]
184 fn mtime(&self) -> i64;
185 #[stable(feature = "metadata_ext", since = "1.1.0")]
186 fn mtime_nsec(&self) -> i64;
187 #[stable(feature = "metadata_ext", since = "1.1.0")]
188 fn ctime(&self) -> i64;
189 #[stable(feature = "metadata_ext", since = "1.1.0")]
190 fn ctime_nsec(&self) -> i64;
191 #[stable(feature = "metadata_ext", since = "1.1.0")]
192 fn blksize(&self) -> u64;
193 #[stable(feature = "metadata_ext", since = "1.1.0")]
194 fn blocks(&self) -> u64;
197 // Hm, why are there casts here to the returned type, shouldn't the types always
198 // be the same? Right you are! Turns out, however, on android at least the types
199 // in the raw `stat` structure are not the same as the types being returned. Who
202 // As a result to make sure this compiles for all platforms we do the manual
203 // casts and rely on manual lowering to `stat` if the raw type is desired.
204 #[stable(feature = "metadata_ext", since = "1.1.0")]
205 impl MetadataExt for fs::Metadata {
206 fn dev(&self) -> u64 {
207 self.as_inner().as_inner().st_dev as u64
209 fn ino(&self) -> u64 {
210 self.as_inner().as_inner().st_ino as u64
212 fn mode(&self) -> u32 {
213 self.as_inner().as_inner().st_mode as u32
215 fn nlink(&self) -> u64 {
216 self.as_inner().as_inner().st_nlink as u64
218 fn uid(&self) -> u32 {
219 self.as_inner().as_inner().st_uid as u32
221 fn gid(&self) -> u32 {
222 self.as_inner().as_inner().st_gid as u32
224 fn size(&self) -> u64 {
225 self.as_inner().as_inner().st_size as u64
227 fn atime(&self) -> i64 {
228 self.as_inner().as_inner().st_atime as i64
230 fn atime_nsec(&self) -> i64 {
231 self.as_inner().as_inner().st_atime_nsec as i64
233 fn mtime(&self) -> i64 {
234 self.as_inner().as_inner().st_mtime as i64
236 fn mtime_nsec(&self) -> i64 {
237 self.as_inner().as_inner().st_mtime_nsec as i64
239 fn ctime(&self) -> i64 {
240 self.as_inner().as_inner().st_ctime as i64
242 fn ctime_nsec(&self) -> i64 {
243 self.as_inner().as_inner().st_ctime_nsec as i64
245 fn blksize(&self) -> u64 {
246 self.as_inner().as_inner().st_blksize as u64
248 fn blocks(&self) -> u64 {
249 self.as_inner().as_inner().st_blocks as u64
253 /// Redox-specific extensions for [`FileType`].
255 /// Adds support for special Unix file types such as block/character devices,
256 /// pipes, and sockets.
258 /// [`FileType`]: ../../../../std/fs/struct.FileType.html
259 #[stable(feature = "file_type_ext", since = "1.5.0")]
260 pub trait FileTypeExt {
261 /// Returns whether this file type is a block device.
262 #[stable(feature = "file_type_ext", since = "1.5.0")]
263 fn is_block_device(&self) -> bool;
264 /// Returns whether this file type is a char device.
265 #[stable(feature = "file_type_ext", since = "1.5.0")]
266 fn is_char_device(&self) -> bool;
267 /// Returns whether this file type is a fifo.
268 #[stable(feature = "file_type_ext", since = "1.5.0")]
269 fn is_fifo(&self) -> bool;
270 /// Returns whether this file type is a socket.
271 #[stable(feature = "file_type_ext", since = "1.5.0")]
272 fn is_socket(&self) -> bool;
275 #[stable(feature = "file_type_ext", since = "1.5.0")]
276 impl FileTypeExt for fs::FileType {
277 fn is_block_device(&self) -> bool { false /*FIXME: Implement block device mode*/ }
278 fn is_char_device(&self) -> bool { false /*FIXME: Implement char device mode*/ }
279 fn is_fifo(&self) -> bool { false /*FIXME: Implement fifo mode*/ }
280 fn is_socket(&self) -> bool { false /*FIXME: Implement socket mode*/ }
283 /// Creates a new symbolic link on the filesystem.
285 /// The `dst` path will be a symbolic link pointing to the `src` path.
289 /// On Windows, you must specify whether a symbolic link points to a file
290 /// or directory. Use `os::windows::fs::symlink_file` to create a
291 /// symbolic link to a file, or `os::windows::fs::symlink_dir` to create a
292 /// symbolic link to a directory. Additionally, the process must have
293 /// `SeCreateSymbolicLinkPrivilege` in order to be able to create a
299 /// use std::os::redox::fs;
301 /// fn main() -> std::io::Result<()> {
302 /// fs::symlink("a.txt", "b.txt")?;
306 #[stable(feature = "symlink", since = "1.1.0")]
307 pub fn symlink<P: AsRef<Path>, Q: AsRef<Path>>(src: P, dst: Q) -> io::Result<()>
309 sys::fs::symlink(src.as_ref(), dst.as_ref())
312 /// Redox-specific extensions to [`fs::DirBuilder`].
314 /// [`fs::DirBuilder`]: ../../../../std/fs/struct.DirBuilder.html
315 #[stable(feature = "dir_builder", since = "1.6.0")]
316 pub trait DirBuilderExt {
317 /// Sets the mode to create new directories with. This option defaults to
323 /// use std::fs::DirBuilder;
324 /// use std::os::redox::fs::DirBuilderExt;
326 /// let mut builder = DirBuilder::new();
327 /// builder.mode(0o755);
329 #[stable(feature = "dir_builder", since = "1.6.0")]
330 fn mode(&mut self, mode: u32) -> &mut Self;
333 #[stable(feature = "dir_builder", since = "1.6.0")]
334 impl DirBuilderExt for fs::DirBuilder {
335 fn mode(&mut self, mode: u32) -> &mut fs::DirBuilder {
336 self.as_inner_mut().set_mode(mode);