From 81b480369b905229c8dad41755c82aea0faca1e7 Mon Sep 17 00:00:00 2001 From: Markos Chandras Date: Wed, 10 Oct 2012 15:57:41 +0100 Subject: [PATCH] symlink: Use symlinkat if arch does not have the symlink syscall Signed-off-by: Markos Chandras Signed-off-by: Bernhard Reutner-Fischer --- include/unistd.h | 1 + libc/sysdeps/linux/common/stubs.c | 2 +- libc/sysdeps/linux/common/symlink.c | 16 ++++++++++++++-- libc/sysdeps/linux/common/symlinkat.c | 1 + 4 files changed, 17 insertions(+), 3 deletions(-) diff --git a/include/unistd.h b/include/unistd.h index 175a5826e..8f2a09a62 100644 --- a/include/unistd.h +++ b/include/unistd.h @@ -909,6 +909,7 @@ libc_hidden_proto(readlink) /* Like symlink but a relative path in TO is interpreted relative to TOFD. */ extern int symlinkat (const char *__from, int __tofd, const char *__to) __THROW __nonnull ((1, 3)) __wur; +libc_hidden_proto(symlinkat) /* Like readlink but a relative PATH is interpreted relative to FD. */ extern ssize_t readlinkat (int __fd, const char *__restrict __path, diff --git a/libc/sysdeps/linux/common/stubs.c b/libc/sysdeps/linux/common/stubs.c index 1fc23933c..1f985e05f 100644 --- a/libc/sysdeps/linux/common/stubs.c +++ b/libc/sysdeps/linux/common/stubs.c @@ -403,7 +403,7 @@ make_stub(swapoff) make_stub(swapon) #endif -#ifndef __NR_symlink +#if !defined __NR_symlink && !defined __NR_symlinkat make_stub(symlink) #endif diff --git a/libc/sysdeps/linux/common/symlink.c b/libc/sysdeps/linux/common/symlink.c index 15a576d70..eee6e8fa0 100644 --- a/libc/sysdeps/linux/common/symlink.c +++ b/libc/sysdeps/linux/common/symlink.c @@ -8,8 +8,20 @@ */ #include - -#if defined __NR_symlink && (defined __USE_BSD || defined __USE_UNIX98 || defined __USE_XOPEN2K) +#if defined __USE_BSD || defined __USE_UNIX98 || defined __USE_XOPEN2K # include + +# if defined __NR_symlinkat && !defined __NR_symlink +# include +int symlink(const char *oldpath, const char *newpath) +{ + return symlinkat(oldpath, AT_FDCWD, newpath); +} + +# elif defined(__NR_symlink) + _syscall2(int, symlink, const char *, oldpath, const char *, newpath) + +# endif + #endif diff --git a/libc/sysdeps/linux/common/symlinkat.c b/libc/sysdeps/linux/common/symlinkat.c index 6381b3319..91815810c 100644 --- a/libc/sysdeps/linux/common/symlinkat.c +++ b/libc/sysdeps/linux/common/symlinkat.c @@ -11,6 +11,7 @@ #ifdef __NR_symlinkat _syscall3(int, symlinkat, const char *, from, int, tofd, const char *, to) +libc_hidden_def(symlinkat) #else /* should add emulation with symlink() and /proc/self/fd/ ... */ #endif -- 2.11.0