[PATCH v2 42/46] not-cancel.h: Use openat if arch does not have the open syscall

Markos Chandras markos.chandras at gmail.com
Mon Nov 26 14:24:24 UTC 2012


From: Markos Chandras <markos.chandras at imgtec.com>

Signed-off-by: Markos Chandras <markos.chandras at imgtec.com>
---
 libc/sysdeps/linux/common/not-cancel.h                   | 7 +++++++
 libpthread/linuxthreads.old/sysdeps/pthread/not-cancel.h | 9 +++++++++
 libpthread/linuxthreads/sysdeps/pthread/not-cancel.h     | 9 +++++++++
 libpthread/nptl/sysdeps/unix/sysv/linux/not-cancel.h     | 9 +++++++++
 4 files changed, 34 insertions(+)

diff --git a/libc/sysdeps/linux/common/not-cancel.h b/libc/sysdeps/linux/common/not-cancel.h
index 9418417..f46571a 100644
--- a/libc/sysdeps/linux/common/not-cancel.h
+++ b/libc/sysdeps/linux/common/not-cancel.h
@@ -21,10 +21,17 @@
 #include <sysdep.h>
 
 /* Uncancelable open.  */
+#if defined(__NR_openat) && !defined(__NR_open)
+#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))
+#else
 #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))
+#endif
 
 /* Uncancelable close.  */
 #define close_not_cancel(fd) \
diff --git a/libpthread/linuxthreads.old/sysdeps/pthread/not-cancel.h b/libpthread/linuxthreads.old/sysdeps/pthread/not-cancel.h
index 80d33be..261c274 100644
--- a/libpthread/linuxthreads.old/sysdeps/pthread/not-cancel.h
+++ b/libpthread/linuxthreads.old/sysdeps/pthread/not-cancel.h
@@ -22,10 +22,19 @@
 #include <sysdep.h>
 
 /* Uncancelable open.  */
+#if defined(__NR_openat) && !defined(__NR_open)
+#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))
+#else
 #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))
+#endif
 
 /* Uncancelable openat.  */
 #if !defined NOT_IN_libc || defined IS_IN_libpthread || defined IS_IN_librt
diff --git a/libpthread/linuxthreads/sysdeps/pthread/not-cancel.h b/libpthread/linuxthreads/sysdeps/pthread/not-cancel.h
index 80d33be..f5eef39 100644
--- a/libpthread/linuxthreads/sysdeps/pthread/not-cancel.h
+++ b/libpthread/linuxthreads/sysdeps/pthread/not-cancel.h
@@ -22,10 +22,19 @@
 #include <sysdep.h>
 
 /* Uncancelable open.  */
+#if defined(__NR_openat) && !defined(__NR_open)
+#define open_not_cancel(name, flags, mode) \
+	INLINE_SYSCALL (openat, 4, (int) (AT_FDCWD), (const char *) (name), \
+		(flags), (mode))
+#define open_not_cancel_2(name, flags) \
+	INLINE_SYSCALL (openat, 3, (int) (AT_FDCWD), (const char *) (name), \
+		(flags))
+#else
 #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))
+#endif
 
 /* Uncancelable openat.  */
 #if !defined NOT_IN_libc || defined IS_IN_libpthread || defined IS_IN_librt
diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/not-cancel.h b/libpthread/nptl/sysdeps/unix/sysv/linux/not-cancel.h
index 80d33be..261c274 100644
--- a/libpthread/nptl/sysdeps/unix/sysv/linux/not-cancel.h
+++ b/libpthread/nptl/sysdeps/unix/sysv/linux/not-cancel.h
@@ -22,10 +22,19 @@
 #include <sysdep.h>
 
 /* Uncancelable open.  */
+#if defined(__NR_openat) && !defined(__NR_open)
+#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))
+#else
 #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))
+#endif
 
 /* Uncancelable openat.  */
 #if !defined NOT_IN_libc || defined IS_IN_libpthread || defined IS_IN_librt
-- 
1.8.0




More information about the uClibc mailing list