diff --git a/platform/src/linux/mod.rs b/platform/src/linux/mod.rs index 24ec1e185d..e2a47dd776 100644 --- a/platform/src/linux/mod.rs +++ b/platform/src/linux/mod.rs @@ -122,6 +122,12 @@ pub fn getuid() -> uid_t { } } +pub fn link(path1: *const c_char, path2: *const c_char) -> c_int { + unsafe { + syscall!(LINK, path1, path2) as c_int + } +} + #[cfg(target_arch = "x86_64")] pub fn open(path: *const c_char, oflag: c_int, mode: mode_t) -> c_int { unsafe { diff --git a/platform/src/redox/mod.rs b/platform/src/redox/mod.rs index e02d3636d6..a202046227 100644 --- a/platform/src/redox/mod.rs +++ b/platform/src/redox/mod.rs @@ -92,6 +92,12 @@ pub fn getuid() -> uid_t { syscall::getuid()? as pid_t } +pub fn link(path1: const c_char, path2: const c_char) -> c_int { + let path1 = unsafe { c_str(path1) }; + let path2 = unsafe { c_str(path2) }; + syscall::link(path1, path2)? as c_int +} + pub fn open(path: *const c_char, oflag: c_int, mode: mode_t) -> c_int { let path = unsafe { c_str(path) }; syscall::open(path, (oflag as usize) | (mode as usize)).unwrap() as c_int diff --git a/src/unistd/src/lib.rs b/src/unistd/src/lib.rs index 9d61b384bd..b4ff1d9833 100644 --- a/src/unistd/src/lib.rs +++ b/src/unistd/src/lib.rs @@ -261,7 +261,7 @@ pub extern "C" fn lchown(path: *const c_char, owner: uid_t, group: gid_t) -> c_i #[no_mangle] pub extern "C" fn link(path1: *const c_char, path2: *const c_char) -> c_int { - unimplemented!(); + platform::link(path1, path2) } #[no_mangle] diff --git a/tests/.gitignore b/tests/.gitignore index b5ccff1d0f..759d9904ee 100644 --- a/tests/.gitignore +++ b/tests/.gitignore @@ -11,6 +11,8 @@ /ftruncate /ftruncate.out /getid +/link +/link.out /math /printf /write diff --git a/tests/Makefile b/tests/Makefile index f872b2b6f8..77f7345de4 100644 --- a/tests/Makefile +++ b/tests/Makefile @@ -9,6 +9,7 @@ BINS=\ fsync \ ftruncate \ getid \ + link \ math \ printf \ write diff --git a/tests/link.c b/tests/link.c new file mode 100644 index 0000000000..3e36df81fb --- /dev/null +++ b/tests/link.c @@ -0,0 +1,5 @@ +#include + +int main(int argc, char** argv) { + int status = link("link.c", "link.out"); +}