1 | //! Unix-specific filesystem extensions. |
2 | |
3 | use crate::io; |
4 | use crate::path::Path; |
5 | use crate::task::spawn_blocking; |
6 | |
7 | /// Creates a new symbolic link on the filesystem. |
8 | /// |
9 | /// The `dst` path will be a symbolic link pointing to the `src` path. |
10 | /// |
11 | /// This function is an async version of [`std::os::unix::fs::symlink`]. |
12 | /// |
13 | /// [`std::os::unix::fs::symlink`]: https://doc.rust-lang.org/std/os/unix/fs/fn.symlink.html |
14 | /// |
15 | /// # Examples |
16 | /// |
17 | /// ```no_run |
18 | /// # fn main() -> std::io::Result<()> { async_std::task::block_on(async { |
19 | /// # |
20 | /// use async_std::os::unix::fs::symlink; |
21 | /// |
22 | /// symlink("a.txt" , "b.txt" ).await?; |
23 | /// # |
24 | /// # Ok(()) }) } |
25 | /// ``` |
26 | pub async fn symlink<P: AsRef<Path>, Q: AsRef<Path>>(src: P, dst: Q) -> io::Result<()> { |
27 | let src: PathBuf = src.as_ref().to_owned(); |
28 | let dst: PathBuf = dst.as_ref().to_owned(); |
29 | spawn_blocking(move || std::os::unix::fs::symlink(&src, &dst)).await |
30 | } |
31 | |
32 | cfg_not_docs! { |
33 | pub use std::os::unix::fs::{DirBuilderExt, DirEntryExt, OpenOptionsExt}; |
34 | } |
35 | |
36 | cfg_docs! { |
37 | /// Unix-specific extensions to `DirBuilder`. |
38 | pub trait DirBuilderExt { |
39 | /// Sets the mode to create new directories with. This option defaults to |
40 | /// `0o777`. |
41 | fn mode(&mut self, mode: u32) -> &mut Self; |
42 | } |
43 | |
44 | /// Unix-specific extension methods for `DirEntry`. |
45 | pub trait DirEntryExt { |
46 | /// Returns the underlying `d_ino` field in the contained `dirent` |
47 | /// structure. |
48 | fn ino(&self) -> u64; |
49 | } |
50 | |
51 | /// Unix-specific extensions to `OpenOptions`. |
52 | pub trait OpenOptionsExt { |
53 | /// Sets the mode bits that a new file will be created with. |
54 | /// |
55 | /// If a new file is created as part of a `File::open_opts` call then this |
56 | /// specified `mode` will be used as the permission bits for the new file. |
57 | /// If no `mode` is set, the default of `0o666` will be used. |
58 | /// The operating system masks out bits with the systems `umask`, to produce |
59 | /// the final permissions. |
60 | fn mode(&mut self, mode: u32) -> &mut Self; |
61 | |
62 | /// Pass custom flags to the `flags` argument of `open`. |
63 | /// |
64 | /// The bits that define the access mode are masked out with `O_ACCMODE`, to |
65 | /// ensure they do not interfere with the access mode set by Rusts options. |
66 | /// |
67 | /// Custom flags can only set flags, not remove flags set by Rusts options. |
68 | /// This options overwrites any previously set custom flags. |
69 | fn custom_flags(&mut self, flags: i32) -> &mut Self; |
70 | } |
71 | } |
72 | |