summaryrefslogtreecommitdiff
path: root/sysdeps/unix/sysv/linux/openat.c
diff options
context:
space:
mode:
authorSamuel Thibault <samuel.thibault@ens-lyon.org>2016-08-20 19:50:45 +0200
committerSamuel Thibault <samuel.thibault@ens-lyon.org>2016-08-20 19:50:45 +0200
commit4dd9e35bfd35d3138bc44169baba098005bad51e (patch)
treea4939c43a9c3fe00eb27f023e14acc5e1fe8808c /sysdeps/unix/sysv/linux/openat.c
parentbd42a4599d1b6f77bcfe1e4f67b7cbd9e1cb2dfd (diff)
parentf76453c31593957fec1a99b986bfa5506618b79c (diff)
Merge commit 'refs/top-bases/t/bigmem' into t/bigmem
Diffstat (limited to 'sysdeps/unix/sysv/linux/openat.c')
-rw-r--r--sysdeps/unix/sysv/linux/openat.c122
1 files changed, 8 insertions, 114 deletions
diff --git a/sysdeps/unix/sysv/linux/openat.c b/sysdeps/unix/sysv/linux/openat.c
index 9bb8acec1f..677712330e 100644
--- a/sysdeps/unix/sysv/linux/openat.c
+++ b/sysdeps/unix/sysv/linux/openat.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 2005-2014 Free Software Foundation, Inc.
+/* Copyright (C) 2005-2015 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -22,46 +22,12 @@
#include <stdio.h>
#include <string.h>
#include <sys/stat.h>
-#include <kernel-features.h>
#include <sysdep-cancel.h>
#include <not-cancel.h>
#ifndef OPENAT
# define OPENAT openat
-
-# ifndef __ASSUME_ATFCTS
-/* Set errno after a failed call. If BUF is not null,
- it is a /proc/self/fd/ path name we just tried to use. */
-void
-attribute_hidden
-__atfct_seterrno (int errval, int fd, const char *buf)
-{
- if (buf != NULL)
- {
- struct stat64 st;
-
- if (errval == ENOTDIR || errval == ENOENT)
- {
- /* This can mean either the file descriptor is invalid or
- /proc is not mounted. */
- if (__fxstat64 (_STAT_VER, fd, &st) != 0)
- /* errno is already set correctly. */
- return;
-
- /* If /proc is not mounted there is nothing we can do. */
- if ((errval != ENOTDIR || S_ISDIR (st.st_mode))
- && (__xstat64 (_STAT_VER, "/proc/self/fd", &st) != 0
- || !S_ISDIR (st.st_mode)))
- errval = ENOSYS;
- }
- }
-
- __set_errno (errval);
-}
-
-int __have_atfcts;
-# endif
#endif
@@ -71,11 +37,7 @@ int __have_atfcts;
int
-OPENAT_NOT_CANCEL (fd, file, oflag, mode)
- int fd;
- const char *file;
- int oflag;
- mode_t mode;
+OPENAT_NOT_CANCEL (int fd, const char *file, int oflag, mode_t mode)
{
/* We have to add the O_LARGEFILE flag for openat64. */
@@ -83,63 +45,7 @@ OPENAT_NOT_CANCEL (fd, file, oflag, mode)
oflag |= MORE_OFLAGS;
#endif
- int res;
-
-#ifdef __NR_openat
-# ifndef __ASSUME_ATFCTS
- if (__have_atfcts >= 0)
-# endif
- {
- res = INLINE_SYSCALL (openat, 4, fd, file, oflag, mode);
-
-# ifndef __ASSUME_ATFCTS
- if (res == -1 && errno == ENOSYS)
- __have_atfcts = -1;
- else
-# endif
- return res;
- }
-#endif
-
-#ifndef __ASSUME_ATFCTS
- INTERNAL_SYSCALL_DECL (err);
- char *buf = NULL;
-
- if (fd != AT_FDCWD && file[0] != '/')
- {
- size_t filelen = strlen (file);
- if (__builtin_expect (filelen == 0, 0))
- {
- __set_errno (ENOENT);
- return -1;
- }
-
- static const char procfd[] = "/proc/self/fd/%d/%s";
- /* Buffer for the path name we are going to use. It consists of
- - the string /proc/self/fd/
- - the file descriptor number
- - the file name provided.
- The final NUL is included in the sizeof. A bit of overhead
- due to the format elements compensates for possible negative
- numbers. */
- size_t buflen = sizeof (procfd) + sizeof (int) * 3 + filelen;
- buf = alloca (buflen);
-
- /* Note: snprintf cannot be canceled. */
- __snprintf (buf, buflen, procfd, fd, file);
- file = buf;
- }
-
- res = INTERNAL_SYSCALL (open, err, 3, file, oflag, mode);
-
- if (__builtin_expect (INTERNAL_SYSCALL_ERROR_P (res, err), 0))
- {
- __atfct_seterrno (INTERNAL_SYSCALL_ERRNO (res, err), fd, buf);
- res = -1;
- }
-
- return res;
-#endif
+ return INLINE_SYSCALL (openat, 4, fd, file, oflag, mode);
}
#define UNDERIZE(name) UNDERIZE_1 (name)
@@ -148,16 +54,13 @@ OPENAT_NOT_CANCEL (fd, file, oflag, mode)
/* Open FILE with access OFLAG. Interpret relative paths relative to
- the directory associated with FD. If OFLAG includes O_CREAT, a
- third argument is the file protection. */
+ the directory associated with FD. If OFLAG includes O_CREAT or
+ O_TMPFILE, a fourth argument is the file protection. */
int
-__OPENAT (fd, file, oflag)
- int fd;
- const char *file;
- int oflag;
+__OPENAT (int fd, const char *file, int oflag, ...)
{
mode_t mode = 0;
- if (oflag & O_CREAT)
+ if (__OPEN_NEEDS_MODE (oflag))
{
va_list arg;
va_start (arg, oflag);
@@ -165,16 +68,7 @@ __OPENAT (fd, file, oflag)
va_end (arg);
}
- if (SINGLE_THREAD_P)
- return OPENAT_NOT_CANCEL (fd, file, oflag, mode);
-
- int oldtype = LIBC_CANCEL_ASYNC ();
-
- int res = OPENAT_NOT_CANCEL (fd, file, oflag, mode);
-
- LIBC_CANCEL_RESET (oldtype);
-
- return res;
+ return SYSCALL_CANCEL (openat, fd, file, oflag, mode);
}
libc_hidden_def (__OPENAT)
weak_alias (__OPENAT, OPENAT)