From 98ac44103601cdf0578f868e12f3090051dabe5f Mon Sep 17 00:00:00 2001 From: oblique Date: Tue, 11 Dec 2018 23:32:09 +0200 Subject: Implement symlinkat --- src/unistd.rs | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) (limited to 'src') diff --git a/src/unistd.rs b/src/unistd.rs index f2ad55b2..2c00f7f0 100644 --- a/src/unistd.rs +++ b/src/unistd.rs @@ -506,6 +506,34 @@ pub fn mkfifo(path: &P, mode: Mode) -> Result<()> { Errno::result(res).map(drop) } +/// Creates a symbolic link at `path2` which points to `path1`. +/// +/// If `dirfd` has a value, then `path2` is relative to directory associated +/// with the file descriptor. +/// +/// If `dirfd` is `None`, then `path2` is relative to the current working +/// directory. This is identical to `libc::symlink(path1, path2)`. +/// +/// See also [symlinkat(2)](http://pubs.opengroup.org/onlinepubs/9699919799/functions/symlinkat.html). +pub fn symlinkat( + path1: &P1, + dirfd: Option, + path2: &P2) -> Result<()> { + let res = + path1.with_nix_path(|path1| { + path2.with_nix_path(|path2| { + unsafe { + libc::symlinkat( + path1.as_ptr(), + dirfd.unwrap_or(libc::AT_FDCWD), + path2.as_ptr() + ) + } + }) + })??; + Errno::result(res).map(drop) +} + /// Returns the current directory as a `PathBuf` /// /// Err is returned if the current user doesn't have the permission to read or search a component -- cgit v1.2.3