Commit 823498d2 authored by Nils Goroll's avatar Nils Goroll

openat is varargish

parent a83c59af
......@@ -245,7 +245,7 @@ extern int utimel(const char *, const struct utimbuf *);
/* at funcs */
#if defined(__EXTENSIONS__) || !defined(__XOPEN_OR_POSIX) || \
defined(_ATFILE_SOURCE)
extern int openatl(int , const char *, int , mode_t);
extern int openatl(int , const char *, int, ...);
#ifdef HAVE_ATTROPEN
extern int attropenl(const char *, const char *, int , ...);
#endif
......@@ -321,7 +321,7 @@ extern int statl64(const char *, struct stat64 *);
/* 64 at funcs */
#if defined(__EXTENSIONS__) || !defined(__XOPEN_OR_POSIX) || \
defined(_ATFILE_SOURCE)
extern int openatl64(int , const char *, int , mode_t);
extern int openatl64(int , const char *, int, ...);
#ifdef HAVE_ATTROPEN
extern int attropenl64(const char *, const char *, int , ...);
#endif
......
......@@ -113,6 +113,12 @@
#include <sys/xattr.h>
#endif
static int _openatl(int, const char *, int, mode_t mode);
#if !defined(_LP64)
static int _openatl64(int, const char *, int, mode_t mode);
#endif
/*
* close an intermediate file descriptor, restoring errno if necessary
*/
......@@ -295,8 +301,8 @@ oatl_im(int filedes, const char *path, const char **remaining) {
#define Xfl(path, flags, err, r, funcn, ...) \
int __ifd; \
\
__ifd = openatl(AT_FDCWD, (path), \
O_RDONLY|O_NDELAY|O_LARGEFILE, (flags)); \
__ifd = six4(_openatl)(AT_FDCWD, (path), \
O_RDONLY|O_NDELAY|O_LARGEFILE|(flags), 0); \
\
if (__ifd == -1) \
return (err); \
......@@ -306,18 +312,41 @@ oatl_im(int filedes, const char *path, const char **remaining) {
close_ifd(__ifd)
/* OPEN */
int
openatl(int filedes, const char *path, int oflag, mode_t mode) {
static int
_openatl(int filedes, const char *path, int oflag, mode_t mode) {
Xatl(openat, filedes, path, oflag, mode);
}
#if !defined(_LP64)
int
openatl64(int filedes, const char *path, int oflag, mode_t mode) {
static int
_openatl64(int filedes, const char *path, int oflag, mode_t mode) {
Xatl(openat64, filedes, path, oflag, mode);
}
#endif
#define Openatl(bits) \
mode_t mode = 0; \
if (oflag & O_CREAT) { \
va_list arg; \
va_start(arg, oflag); \
mode = va_arg(arg, mode_t); \
va_end(arg); \
} \
\
return _openatl ## bits (filedes, path, oflag, mode)
int
openatl(int filedes, const char *path, int oflag, ...) {
Openatl(/*32*/);
}
#if !defined(_LP64)
int
openatl64(int filedes, const char *path, int oflag, ...) {
Openatl(64);
}
#endif
#define Openl(bits) \
mode_t mode = 0; \
if (oflag & O_CREAT) { \
......@@ -327,7 +356,7 @@ openatl64(int filedes, const char *path, int oflag, mode_t mode) {
va_end(arg); \
} \
\
return openatl ## bits (AT_FDCWD, path, oflag, mode)
return _openatl ## bits (AT_FDCWD, path, oflag, mode)
int
......@@ -345,12 +374,12 @@ openl64(const char *path, int oflag, ...) {
int
creatl(const char *path, mode_t mode) {
return openatl(AT_FDCWD, path, O_WRONLY|O_CREAT|O_TRUNC , mode);
return _openatl(AT_FDCWD, path, O_WRONLY|O_CREAT|O_TRUNC , mode);
}
#if !defined(_LP64)
int
creatl64(const char *path, mode_t mode) {
return openatl64(AT_FDCWD, path, O_WRONLY|O_CREAT|O_TRUNC , mode);
return _openatl64(AT_FDCWD, path, O_WRONLY|O_CREAT|O_TRUNC , mode);
}
#endif
......@@ -367,7 +396,7 @@ creatl64(const char *path, mode_t mode) {
return -1; \
\
va_start(ap, oflag); \
afd = openatl ## bits (fd, apath, oflag|O_XATTR, \
afd = _openatl ## bits (fd, apath, oflag|O_XATTR, \
va_arg(ap, mode_t)); \
va_end(ap); \
\
......@@ -1115,10 +1144,9 @@ utimel(const char *path, const struct utimbuf *times) {
/* OPENDIR */
DIR *
opendirl(const char *dirname) {
DIR *r;
int fd;
/* almost identical to Xfl, but we must not close the fd */
fd = openatl(AT_FDCWD, dirname, O_RDONLY|O_NDELAY|O_LARGEFILE, 0);
fd = _openatl(AT_FDCWD, dirname, O_RDONLY|O_NDELAY|O_LARGEFILE, 0);
if (fd == -1)
return NULL;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment