summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authoroblique <psyberbits@gmail.com>2018-12-11 23:32:09 +0200
committeroblique <psyberbits@gmail.com>2018-12-12 00:49:15 +0200
commit98ac44103601cdf0578f868e12f3090051dabe5f (patch)
tree575126a951c965eb43e78256dedfb4357938cec3 /src
parentf1b12d6b1b8bf6d8ad41e7b2967b95c6f876745c (diff)
downloadnix-98ac44103601cdf0578f868e12f3090051dabe5f.zip
Implement symlinkat
Diffstat (limited to 'src')
-rw-r--r--src/unistd.rs28
1 files changed, 28 insertions, 0 deletions
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<P: ?Sized + NixPath>(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<P1: ?Sized + NixPath, P2: ?Sized + NixPath>(
+ path1: &P1,
+ dirfd: Option<RawFd>,
+ 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