[[PATCH v2] 4/4] support kernels without __ARCH_WANT_SYSCALL_NO_AT

Mark Salter msalter at redhat.com
Fri May 4 12:52:20 UTC 2012


Signed-off-by: Mark Salter <msalter at redhat.com>
---
 ldso/include/dl-syscall.h                          |   16 +++++++++++++
 libc/sysdeps/linux/common/access.c                 |    8 ++++++
 libc/sysdeps/linux/common/chmod.c                  |    8 ++++++
 libc/sysdeps/linux/common/chown.c                  |   12 +++++-----
 libc/sysdeps/linux/common/fstatat.c                |    2 +-
 libc/sysdeps/linux/common/fstatat64.c              |    2 +-
 libc/sysdeps/linux/common/lchown.c                 |   11 +++++----
 libc/sysdeps/linux/common/link.c                   |    8 ++++++
 libc/sysdeps/linux/common/lstat.c                  |    9 +++++-
 libc/sysdeps/linux/common/lstat64.c                |   13 +++++-----
 libc/sysdeps/linux/common/mkdir.c                  |   11 +++++----
 libc/sysdeps/linux/common/mknod.c                  |    5 ++++
 libc/sysdeps/linux/common/not-cancel.h             |    8 ++++++
 libc/sysdeps/linux/common/open.c                   |    8 ++++++
 libc/sysdeps/linux/common/readlink.c               |    8 ++++++
 libc/sysdeps/linux/common/rename.c                 |   11 +++++----
 libc/sysdeps/linux/common/rmdir.c                  |   10 +++++++-
 libc/sysdeps/linux/common/stubs.c                  |    4 +-
 libc/sysdeps/linux/common/symlink.c                |    8 ++++++
 libc/sysdeps/linux/common/unlink.c                 |    8 ++++++
 libc/sysdeps/linux/common/utimes.c                 |   24 +++++++++++++++++++-
 .../linuxthreads.old/sysdeps/pthread/not-cancel.h  |    8 ++++++
 22 files changed, 167 insertions(+), 35 deletions(-)

diff --git a/ldso/include/dl-syscall.h b/ldso/include/dl-syscall.h
index 4c8aeaf..55ed290 100644
--- a/ldso/include/dl-syscall.h
+++ b/ldso/include/dl-syscall.h
@@ -49,9 +49,17 @@ static __always_inline _syscall1(void, _dl_exit, int, status)
 #define __NR__dl_close __NR_close
 static __always_inline _syscall1(int, _dl_close, int, fd)
 
+#if defined(__NR_open)
 #define __NR__dl_open __NR_open
 static __always_inline _syscall3(int, _dl_open, const char *, fn, int, flags,
                         __kernel_mode_t, mode)
+#elif defined(__NR_openat)
+static __always_inline ssize_t
+_dl_open(const char *fn, int flags, __kernel_mode_t mode)
+{
+	return INLINE_SYSCALL(openat, 4, AT_FDCWD, fn, flags, mode);
+}
+#endif
 
 #define __NR__dl_write __NR_write
 static __always_inline _syscall3(unsigned long, _dl_write, int, fd,
@@ -117,9 +125,17 @@ static __always_inline _syscall0(gid_t, _dl_getegid)
 #define __NR__dl_getpid __NR_getpid
 static __always_inline _syscall0(gid_t, _dl_getpid)
 
+#if defined(__NR_readlink)
 #define __NR__dl_readlink __NR_readlink
 static __always_inline _syscall3(int, _dl_readlink, const char *, path, char *, buf,
                         size_t, bufsiz)
+#elif defined(__NR_readlinkat)
+static __always_inline int
+_dl_readlink(const char *fn, char *buf, size_t size)
+{
+	return INLINE_SYSCALL(readlinkat, 4, AT_FDCWD, fn, buf, size);
+}
+#endif
 
 #ifdef __NR_pread64
 #define __NR___syscall_pread __NR_pread64
diff --git a/libc/sysdeps/linux/common/access.c b/libc/sysdeps/linux/common/access.c
index a075d42..a98bbc4 100644
--- a/libc/sysdeps/linux/common/access.c
+++ b/libc/sysdeps/linux/common/access.c
@@ -9,4 +9,12 @@
 
 #include <sys/syscall.h>
 #include <unistd.h>
+#include <fcntl.h>
+#ifdef __NR_access
 _syscall2(int, access, const char *, pathname, int, mode)
+#elif defined __NR_faccessat
+int access(const char *pathname, int mode)
+{
+	return INLINE_SYSCALL(faccessat, 4, AT_FDCWD, pathname, mode, 0);
+}
+#endif
diff --git a/libc/sysdeps/linux/common/chmod.c b/libc/sysdeps/linux/common/chmod.c
index 871e023..e86835a 100644
--- a/libc/sysdeps/linux/common/chmod.c
+++ b/libc/sysdeps/linux/common/chmod.c
@@ -9,8 +9,10 @@
 
 #include <sys/syscall.h>
 #include <sys/stat.h>
+#include <fcntl.h>
 
 
+#ifdef __NR_chmod
 #define __NR___syscall_chmod __NR_chmod
 static __inline__ _syscall2(int, __syscall_chmod, const char *, path, __kernel_mode_t, mode)
 
@@ -18,4 +20,10 @@ int chmod(const char *path, mode_t mode)
 {
 	return __syscall_chmod(path, mode);
 }
+#elif defined __NR_fchmodat
+int chmod(const char *path, mode_t mode)
+{
+	return INLINE_SYSCALL(fchmodat, 4, AT_FDCWD, path, mode, 0);
+}
+#endif
 libc_hidden_def(chmod)
diff --git a/libc/sysdeps/linux/common/chown.c b/libc/sysdeps/linux/common/chown.c
index f2c60e0..8e08edf 100644
--- a/libc/sysdeps/linux/common/chown.c
+++ b/libc/sysdeps/linux/common/chown.c
@@ -10,6 +10,7 @@
 #include <sys/syscall.h>
 #include <unistd.h>
 #include <bits/wordsize.h>
+#include <fcntl.h>
 
 
 #if (__WORDSIZE == 32 && defined(__NR_chown32)) || __WORDSIZE == 64
@@ -21,11 +22,6 @@
 _syscall3(int, chown, const char *, path, uid_t, owner, gid_t, group)
 
 #else
-
-# define __NR___syscall_chown __NR_chown
-static __inline__ _syscall3(int, __syscall_chown, const char *, path,
-		__kernel_uid_t, owner, __kernel_gid_t, group)
-
 int chown(const char *path, uid_t owner, gid_t group)
 {
 	if (((owner + 1) > (uid_t) ((__kernel_uid_t) - 1U))
@@ -33,7 +29,11 @@ int chown(const char *path, uid_t owner, gid_t group)
 		__set_errno(EINVAL);
 		return -1;
 	}
-	return (__syscall_chown(path, owner, group));
+# ifdef __NR_chown
+	return INLINE_SYSCALL(chown, 3, path, owner, group);
+# elif defined __NR_fchownat
+	return INLINE_SYSCALL(fchownat, 5, AT_FDCWD, path, owner, group, 0);
+# endif
 }
 #endif
 
diff --git a/libc/sysdeps/linux/common/fstatat.c b/libc/sysdeps/linux/common/fstatat.c
index 33daa7c..21f1383 100644
--- a/libc/sysdeps/linux/common/fstatat.c
+++ b/libc/sysdeps/linux/common/fstatat.c
@@ -11,7 +11,7 @@
 #include "xstatconv.h"
 
 /* 64bit ports tend to favor newfstatat() */
-#ifdef __NR_newfstatat
+#if defined(__NR_newfstatat) && !defined(__NR_fstatat64)
 # define __NR_fstatat64 __NR_newfstatat
 #endif
 
diff --git a/libc/sysdeps/linux/common/fstatat64.c b/libc/sysdeps/linux/common/fstatat64.c
index 95627af..78a27b9 100644
--- a/libc/sysdeps/linux/common/fstatat64.c
+++ b/libc/sysdeps/linux/common/fstatat64.c
@@ -13,7 +13,7 @@
 #ifdef __UCLIBC_HAS_LFS__
 
 /* 64bit ports tend to favor newfstatat() */
-#ifdef __NR_newfstatat
+#if defined(__NR_newfstatat) && !defined(__NR_fstatat64)
 # define __NR_fstatat64 __NR_newfstatat
 #endif
 
diff --git a/libc/sysdeps/linux/common/lchown.c b/libc/sysdeps/linux/common/lchown.c
index c0f8ce7..83dabb9 100644
--- a/libc/sysdeps/linux/common/lchown.c
+++ b/libc/sysdeps/linux/common/lchown.c
@@ -10,6 +10,7 @@
 #include <sys/syscall.h>
 #include <unistd.h>
 #include <bits/wordsize.h>
+#include <fcntl.h>
 
 #if (__WORDSIZE == 32 && defined(__NR_lchown32)) || __WORDSIZE == 64
 # ifdef __NR_lchown32
@@ -21,10 +22,6 @@ _syscall3(int, lchown, const char *, path, uid_t, owner, gid_t, group)
 
 #else
 
-# define __NR___syscall_lchown __NR_lchown
-static __inline__ _syscall3(int, __syscall_lchown, const char *, path,
-		__kernel_uid_t, owner, __kernel_gid_t, group)
-
 int lchown(const char *path, uid_t owner, gid_t group)
 {
 	if (((owner + 1) > (uid_t) ((__kernel_uid_t) - 1U))
@@ -32,7 +29,11 @@ int lchown(const char *path, uid_t owner, gid_t group)
 		__set_errno(EINVAL);
 		return -1;
 	}
-	return __syscall_lchown(path, owner, group);
+# if defined(__NR_lchown)
+	return INLINE_SYSCALL(lchown, 3, path, owner, group);
+# elif defined(__NR_fchownat)
+	return INLINE_SYSCALL(fchownat, 5, AT_FDCWD, path, owner, group, AT_SYMLINK_NOFOLLOW);
+# endif
 }
 
 #endif
diff --git a/libc/sysdeps/linux/common/link.c b/libc/sysdeps/linux/common/link.c
index b5e5536..23e985d 100644
--- a/libc/sysdeps/linux/common/link.c
+++ b/libc/sysdeps/linux/common/link.c
@@ -9,4 +9,12 @@
 
 #include <sys/syscall.h>
 #include <unistd.h>
+#include <fcntl.h>
+#if defined(__NR_link)
 _syscall2(int, link, const char *, oldpath, const char *, newpath)
+#elif defined(__NR_linkat)
+int link(const char * oldpath, const char * newpath)
+{
+	return INLINE_SYSCALL(linkat, 5, AT_FDCWD, oldpath, AT_FDCWD, newpath, 0);
+}
+#endif
diff --git a/libc/sysdeps/linux/common/lstat.c b/libc/sysdeps/linux/common/lstat.c
index db72d1f..7178834 100644
--- a/libc/sysdeps/linux/common/lstat.c
+++ b/libc/sysdeps/linux/common/lstat.c
@@ -9,20 +9,25 @@
 
 #include <sys/syscall.h>
 #include <unistd.h>
+#include <fcntl.h>
 #include <sys/stat.h>
 #include "xstatconv.h"
 
 int lstat(const char *file_name, struct stat *buf)
 {
 	int result;
-#ifdef __NR_lstat64
+#if defined __NR_lstat64 || defined __NR_fstatat64
 	/* normal stat call has limited values for various stat elements
 	 * e.g. uid device major/minor etc.
 	 * so we use 64 variant if available
 	 * in order to get newer versions of stat elements
 	 */
 	struct kernel_stat64 kbuf;
+# ifdef __NR_lstat64
 	result = INLINE_SYSCALL(lstat64, 2, file_name, &kbuf);
+# else
+	result = INLINE_SYSCALL(fstatat64, 4, AT_FDCWD, file_name, &kbuf, AT_SYMLINK_NOFOLLOW);
+# endif
 	if (result == 0) {
 		__xstat32_conv(&kbuf, buf);
 	}
@@ -38,7 +43,7 @@ int lstat(const char *file_name, struct stat *buf)
 }
 libc_hidden_def(lstat)
 
-#if ! defined __NR_lstat64 && defined __UCLIBC_HAS_LFS__
+#if ! defined __NR_lstat64 && ! defined __NR_fstatat64 && defined __UCLIBC_HAS_LFS__
 strong_alias_untyped(lstat,lstat64)
 libc_hidden_def(lstat64)
 #endif
diff --git a/libc/sysdeps/linux/common/lstat64.c b/libc/sysdeps/linux/common/lstat64.c
index 235b76d..3abec67 100644
--- a/libc/sysdeps/linux/common/lstat64.c
+++ b/libc/sysdeps/linux/common/lstat64.c
@@ -9,22 +9,23 @@
 
 #include <sys/syscall.h>
 
-#if defined __UCLIBC_HAS_LFS__ && defined __NR_lstat64
+#if defined __UCLIBC_HAS_LFS__ && (defined __NR_lstat64 || defined __NR_fstatat64)
 # include <unistd.h>
 # include <sys/stat.h>
+# include <fcntl.h>
 # include "xstatconv.h"
 
 
-# define __NR___syscall_lstat64 __NR_lstat64
-static __inline__ _syscall2(int, __syscall_lstat64, const char *, file_name,
-		  struct kernel_stat64 *, buf)
-
 int lstat64(const char *file_name, struct stat64 *buf)
 {
 	int result;
 	struct kernel_stat64 kbuf;
 
-	result = __syscall_lstat64(file_name, &kbuf);
+# if defined __NR_lstat64
+	result = INLINE_SYSCALL(lstat64, 2, file_name, &kbuf);
+# elif defined __NR_fstatat64
+	result = INLINE_SYSCALL(fstatat64, 4, AT_FDCWD, file_name, &kbuf, AT_SYMLINK_NOFOLLOW);
+# endif
 	if (result == 0) {
 		__xstat64_conv(&kbuf, buf);
 	}
diff --git a/libc/sysdeps/linux/common/mkdir.c b/libc/sysdeps/linux/common/mkdir.c
index fbc587d..c0199d8 100644
--- a/libc/sysdeps/linux/common/mkdir.c
+++ b/libc/sysdeps/linux/common/mkdir.c
@@ -9,14 +9,15 @@
 
 #include <sys/syscall.h>
 #include <sys/stat.h>
+#include <fcntl.h>
 
 
-#define __NR___syscall_mkdir __NR_mkdir
-static __inline__ _syscall2(int, __syscall_mkdir, const char *, pathname,
-		__kernel_mode_t, mode)
-
 int mkdir(const char *pathname, mode_t mode)
 {
-	return (__syscall_mkdir(pathname, mode));
+#ifdef __NR_mkdir
+	return INLINE_SYSCALL(mkdir, 2, pathname, (__kernel_mode_t)mode);
+#else
+	return INLINE_SYSCALL(mkdirat, 3, AT_FDCWD, pathname, (__kernel_mode_t)mode);
+#endif
 }
 libc_hidden_def(mkdir)
diff --git a/libc/sysdeps/linux/common/mknod.c b/libc/sysdeps/linux/common/mknod.c
index b52c8c5..9954626 100644
--- a/libc/sysdeps/linux/common/mknod.c
+++ b/libc/sysdeps/linux/common/mknod.c
@@ -9,6 +9,7 @@
 
 #include <sys/syscall.h>
 #include <sys/stat.h>
+#include <fcntl.h>
 
 int mknod(const char *path, mode_t mode, dev_t dev)
 {
@@ -17,6 +18,10 @@ int mknod(const char *path, mode_t mode, dev_t dev)
 	/* We must convert the value to dev_t type used by the kernel.  */
 	k_dev = (dev) & ((1ULL << 32) - 1);
 
+#ifdef __NR_mknod
 	return INLINE_SYSCALL(mknod, 3, path, mode, (unsigned int)k_dev);
+#elif defined __NR_mknodat
+	return INLINE_SYSCALL(mknodat, 4, AT_FDCWD, path, mode, (unsigned int)k_dev);
+#endif
 }
 libc_hidden_def(mknod)
diff --git a/libc/sysdeps/linux/common/not-cancel.h b/libc/sysdeps/linux/common/not-cancel.h
index 9418417..d70fac4 100644
--- a/libc/sysdeps/linux/common/not-cancel.h
+++ b/libc/sysdeps/linux/common/not-cancel.h
@@ -19,12 +19,20 @@
    02111-1307 USA.  */
 
 #include <sysdep.h>
+#include <fcntl.h>
 
 /* Uncancelable open.  */
+#ifdef __NR_open
 #define open_not_cancel(name, flags, mode) \
    INLINE_SYSCALL (open, 3, (const char *) (name), (flags), (mode))
 #define open_not_cancel_2(name, flags) \
    INLINE_SYSCALL (open, 2, (const char *) (name), (flags))
+#elif defined (__NR_openat)
+#define open_not_cancel(name, flags, mode) \
+   INLINE_SYSCALL (openat, 4, AT_FDCWD, (const char *) (name), (flags), (mode))
+#define open_not_cancel_2(name, flags) \
+   INLINE_SYSCALL (openat, 3, AT_FDCWD, (const char *) (name), (flags))
+#endif
 
 /* Uncancelable close.  */
 #define close_not_cancel(fd) \
diff --git a/libc/sysdeps/linux/common/open.c b/libc/sysdeps/linux/common/open.c
index 9fb694d..e49a000 100644
--- a/libc/sysdeps/linux/common/open.c
+++ b/libc/sysdeps/linux/common/open.c
@@ -14,9 +14,17 @@
 #include <string.h>
 #include <sys/param.h>
 
+#ifdef __NR_open
 #define __NR___syscall_open __NR_open
 static __inline__ _syscall3(int, __syscall_open, const char *, file,
 		int, flags, __kernel_mode_t, mode)
+#endif
+#ifdef __NR_openat
+#define __NR___syscall_openat __NR_openat
+static __inline__ _syscall4(int, __syscall_openat, int, fd, const char *, file,
+		int, flags, __kernel_mode_t, mode)
+#define __syscall_open(a,b,c) __syscall_openat(AT_FDCWD, (a), (b), (c))
+#endif
 
 int open(const char *file, int oflag, ...)
 {
diff --git a/libc/sysdeps/linux/common/readlink.c b/libc/sysdeps/linux/common/readlink.c
index ef9e835..52d49ec 100644
--- a/libc/sysdeps/linux/common/readlink.c
+++ b/libc/sysdeps/linux/common/readlink.c
@@ -9,6 +9,14 @@
 
 #include <sys/syscall.h>
 #include <unistd.h>
+#include <fcntl.h>
 
+#ifdef __NR_readlink
 _syscall3(ssize_t, readlink, const char *, path, char *, buf, size_t, bufsiz)
+#elif defined(__NR_readlinkat)
+ssize_t readlink(const char *path, char *buf, size_t bufsiz)
+{
+	return INLINE_SYSCALL(readlinkat, 4, AT_FDCWD, path, buf, bufsiz);
+}
+#endif
 libc_hidden_def(readlink)
diff --git a/libc/sysdeps/linux/common/rename.c b/libc/sysdeps/linux/common/rename.c
index 9d8397a..3a1e721 100644
--- a/libc/sysdeps/linux/common/rename.c
+++ b/libc/sysdeps/linux/common/rename.c
@@ -12,13 +12,14 @@
 #include <string.h>
 #include <sys/param.h>
 #include <stdio.h>
-
-#define __NR___syscall_rename __NR_rename
-static __inline__ _syscall2(int, __syscall_rename, const char *, oldpath,
-		const char *, newpath)
+#include <fcntl.h>
 
 int rename(const char * oldpath, const char * newpath)
 {
-	return __syscall_rename(oldpath, newpath);
+# ifdef __NR_rename
+	return INLINE_SYSCALL(rename, 2, oldpath, newpath);
+# else
+	return INLINE_SYSCALL(renameat, 4, AT_FDCWD, oldpath, AT_FDCWD, newpath);
+# endif
 }
 
diff --git a/libc/sysdeps/linux/common/rmdir.c b/libc/sysdeps/linux/common/rmdir.c
index bad6654..ffe34a5 100644
--- a/libc/sysdeps/linux/common/rmdir.c
+++ b/libc/sysdeps/linux/common/rmdir.c
@@ -9,7 +9,15 @@
 
 #include <sys/syscall.h>
 #include <unistd.h>
+#include <fcntl.h>
 
-
+#if defined(__NR_rmdir)
 _syscall1(int, rmdir, const char *, pathname)
+#elif defined(__NR_unlinkat)
+
+int rmdir(const char * pathname)
+{
+	return INLINE_SYSCALL(unlinkat, 3, AT_FDCWD, pathname, AT_REMOVEDIR);
+}
+#endif
 libc_hidden_def(rmdir)
diff --git a/libc/sysdeps/linux/common/stubs.c b/libc/sysdeps/linux/common/stubs.c
index 3567b07..30dc6e7 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
 
@@ -443,7 +443,7 @@ make_stub(lutimes)
 # endif
 #endif
 
-#if !defined __NR_utime && !defined __NR_utimes
+#if !defined __NR_utime && !defined __NR_utimes && !defined __NR_utimensat
 /*make_stub(utime) obsoleted */
 make_stub(utimes)
 #endif
diff --git a/libc/sysdeps/linux/common/symlink.c b/libc/sysdeps/linux/common/symlink.c
index e53e8d4..bde0d5e 100644
--- a/libc/sysdeps/linux/common/symlink.c
+++ b/libc/sysdeps/linux/common/symlink.c
@@ -10,5 +10,13 @@
 #include <sys/syscall.h>
 #if defined __USE_BSD || defined __USE_UNIX98 || defined __USE_XOPEN2K
 #include <unistd.h>
+#include <fcntl.h>
+# ifdef __NR_symlink
 _syscall2(int, symlink, const char *, oldpath, const char *, newpath)
+# elif defined __NR_symlinkat
+int symlink(const char *oldpath, const char *newpath)
+{
+	return INLINE_SYSCALL(symlinkat, 3, oldpath, AT_FDCWD, newpath);
+}
+# endif
 #endif
diff --git a/libc/sysdeps/linux/common/unlink.c b/libc/sysdeps/linux/common/unlink.c
index 513cdd5..b55b898 100644
--- a/libc/sysdeps/linux/common/unlink.c
+++ b/libc/sysdeps/linux/common/unlink.c
@@ -11,5 +11,13 @@
 #include <unistd.h>
 
 
+#if defined __NR_unlink
 _syscall1(int, unlink, const char *, pathname)
+#elif defined __NR_unlinkat
+#include <fcntl.h>
+int unlink(const char *pathname)
+{
+	return INLINE_SYSCALL(unlinkat, 3, AT_FDCWD, pathname, 0);
+}
+#endif
 libc_hidden_def(unlink)
diff --git a/libc/sysdeps/linux/common/utimes.c b/libc/sysdeps/linux/common/utimes.c
index 99d9202..d9d63cc 100644
--- a/libc/sysdeps/linux/common/utimes.c
+++ b/libc/sysdeps/linux/common/utimes.c
@@ -10,10 +10,32 @@
 #include <sys/syscall.h>
 #include <utime.h>
 #include <sys/time.h>
-
+#include <stdlib.h>
+#include <fcntl.h>
 
 #ifdef __NR_utimes
 _syscall2(int, utimes, const char *, file, const struct timeval *, tvp)
+#elif defined __NR_utimensat
+
+int utimes(const char *file, const struct timeval tvp[2])
+{
+	struct timespec ts[2];
+
+	if (tvp) {
+		if (tvp[0].tv_usec >= 1000000 || tvp[0].tv_usec < 0 ||
+		    tvp[1].tv_usec >= 1000000 || tvp[1].tv_usec < 0)
+			return -EINVAL;
+
+		ts[0].tv_sec = tvp[0].tv_sec;
+		ts[0].tv_nsec = 1000 * tvp[0].tv_usec;
+		ts[1].tv_sec = tvp[1].tv_sec;
+		ts[1].tv_nsec = 1000 * tvp[1].tv_usec;
+
+		return INLINE_SYSCALL(utimensat, 4, AT_FDCWD, file, ts, 0);
+	} else {
+		return INLINE_SYSCALL(utimensat, 4, AT_FDCWD, file, NULL, 0);
+	}
+}
 #else
 #include <stdlib.h>
 
diff --git a/libpthread/linuxthreads.old/sysdeps/pthread/not-cancel.h b/libpthread/linuxthreads.old/sysdeps/pthread/not-cancel.h
index 80d33be..820dd01 100644
--- a/libpthread/linuxthreads.old/sysdeps/pthread/not-cancel.h
+++ b/libpthread/linuxthreads.old/sysdeps/pthread/not-cancel.h
@@ -20,12 +20,20 @@
 
 #include <sys/types.h>
 #include <sysdep.h>
+#include <fcntl.h>
 
 /* Uncancelable open.  */
+#ifdef __NR_open
 #define open_not_cancel(name, flags, mode) \
    INLINE_SYSCALL (open, 3, (const char *) (name), (flags), (mode))
 #define open_not_cancel_2(name, flags) \
    INLINE_SYSCALL (open, 2, (const char *) (name), (flags))
+#elif defined __NR_openat
+#define open_not_cancel(name, flags, mode) \
+   INLINE_SYSCALL (openat, 4, AT_FDCWD, (const char *) (name), (flags), (mode))
+#define open_not_cancel_2(name, flags) \
+   INLINE_SYSCALL (openat, 3, AT_FDCWD, (const char *) (name), (flags))
+#endif
 
 /* Uncancelable openat.  */
 #if !defined NOT_IN_libc || defined IS_IN_libpthread || defined IS_IN_librt
-- 
1.7.9.1



More information about the uClibc mailing list