11dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/*
21dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project
31dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * All rights reserved.
41dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *
51dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Redistribution and use in source and binary forms, with or without
61dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * modification, are permitted provided that the following conditions
71dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * are met:
81dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *  * Redistributions of source code must retain the above copyright
91dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *    notice, this list of conditions and the following disclaimer.
101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *  * Redistributions in binary form must reproduce the above copyright
111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *    notice, this list of conditions and the following disclaimer in
121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *    the documentation and/or other materials provided with the
131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *    distribution.
141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *
151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * SUCH DAMAGE.
271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */
281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifndef _FCNTL_H
291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define _FCNTL_H
301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <sys/cdefs.h>
321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <sys/types.h>
331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <linux/fcntl.h>
341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <unistd.h>  /* this is not required, but makes client code much happier */
351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project__BEGIN_DECLS
371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifndef O_ASYNC
391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define O_ASYNC  FASYNC
401dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif
411dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
4200eea3f8a07190dc6d2c4d0e927fed3e47502424David 'Digit' Turner#ifndef O_CLOEXEC
4300eea3f8a07190dc6d2c4d0e927fed3e47502424David 'Digit' Turner#define O_CLOEXEC  02000000
4400eea3f8a07190dc6d2c4d0e927fed3e47502424David 'Digit' Turner#endif
4500eea3f8a07190dc6d2c4d0e927fed3e47502424David 'Digit' Turner
461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectextern int  open(const char*  path, int  mode, ...);
471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectextern int  openat(int fd, const char*  path, int  mode, ...);
481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectextern int  unlinkat(int dirfd, const char *pathname, int flags);
491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectextern int  fcntl(int   fd, int   command, ...);
501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectextern int  creat(const char*  path, mode_t  mode);
511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
528118f62a7d3f1af1edb47e0bc2a49af1d523ae0fNick Kralevich#if defined(__BIONIC_FORTIFY_INLINE)
538118f62a7d3f1af1edb47e0bc2a49af1d523ae0fNick Kralevich
54a3e230d1fa9a5ed773a029e2acc6eb4f3e849ea3Nick Kralevichextern void __creat_error()
55a3e230d1fa9a5ed773a029e2acc6eb4f3e849ea3Nick Kralevich    __attribute__((__error__ ("called with O_CREAT, but missing mode")));
56a3e230d1fa9a5ed773a029e2acc6eb4f3e849ea3Nick Kralevichextern void __too_many_args_error()
57a3e230d1fa9a5ed773a029e2acc6eb4f3e849ea3Nick Kralevich    __attribute__((__error__ ("too many arguments")));
588118f62a7d3f1af1edb47e0bc2a49af1d523ae0fNick Kralevichextern int __open_real(const char *pathname, int flags, ...)
598118f62a7d3f1af1edb47e0bc2a49af1d523ae0fNick Kralevich    __asm__(__USER_LABEL_PREFIX__ "open");
608118f62a7d3f1af1edb47e0bc2a49af1d523ae0fNick Kralevichextern int __open_2(const char *, int);
618118f62a7d3f1af1edb47e0bc2a49af1d523ae0fNick Kralevich
628118f62a7d3f1af1edb47e0bc2a49af1d523ae0fNick Kralevich__BIONIC_FORTIFY_INLINE
638118f62a7d3f1af1edb47e0bc2a49af1d523ae0fNick Kralevichint open(const char *pathname, int flags, ...) {
648118f62a7d3f1af1edb47e0bc2a49af1d523ae0fNick Kralevich    if (__builtin_constant_p(flags)) {
658118f62a7d3f1af1edb47e0bc2a49af1d523ae0fNick Kralevich        if ((flags & O_CREAT) && __builtin_va_arg_pack_len() == 0) {
66a3e230d1fa9a5ed773a029e2acc6eb4f3e849ea3Nick Kralevich            __creat_error();  // compile time error
678118f62a7d3f1af1edb47e0bc2a49af1d523ae0fNick Kralevich        }
688118f62a7d3f1af1edb47e0bc2a49af1d523ae0fNick Kralevich    }
698118f62a7d3f1af1edb47e0bc2a49af1d523ae0fNick Kralevich
708118f62a7d3f1af1edb47e0bc2a49af1d523ae0fNick Kralevich    if (__builtin_va_arg_pack_len() > 1) {
71a3e230d1fa9a5ed773a029e2acc6eb4f3e849ea3Nick Kralevich        __too_many_args_error();  // compile time error
728118f62a7d3f1af1edb47e0bc2a49af1d523ae0fNick Kralevich    }
738118f62a7d3f1af1edb47e0bc2a49af1d523ae0fNick Kralevich
74a3e230d1fa9a5ed773a029e2acc6eb4f3e849ea3Nick Kralevich    if ((__builtin_va_arg_pack_len() == 0) && !__builtin_constant_p(flags)) {
758118f62a7d3f1af1edb47e0bc2a49af1d523ae0fNick Kralevich        return __open_2(pathname, flags);
768118f62a7d3f1af1edb47e0bc2a49af1d523ae0fNick Kralevich    }
778118f62a7d3f1af1edb47e0bc2a49af1d523ae0fNick Kralevich
788118f62a7d3f1af1edb47e0bc2a49af1d523ae0fNick Kralevich    return __open_real(pathname, flags, __builtin_va_arg_pack());
798118f62a7d3f1af1edb47e0bc2a49af1d523ae0fNick Kralevich}
808118f62a7d3f1af1edb47e0bc2a49af1d523ae0fNick Kralevich
81a3e230d1fa9a5ed773a029e2acc6eb4f3e849ea3Nick Kralevichextern int __openat_2(int, const char *, int);
82a3e230d1fa9a5ed773a029e2acc6eb4f3e849ea3Nick Kralevichextern int __openat_real(int dirfd, const char *pathname, int flags, ...)
83a3e230d1fa9a5ed773a029e2acc6eb4f3e849ea3Nick Kralevich    __asm__(__USER_LABEL_PREFIX__ "openat");
84a3e230d1fa9a5ed773a029e2acc6eb4f3e849ea3Nick Kralevich
85a3e230d1fa9a5ed773a029e2acc6eb4f3e849ea3Nick Kralevich__BIONIC_FORTIFY_INLINE
86a3e230d1fa9a5ed773a029e2acc6eb4f3e849ea3Nick Kralevichint openat(int dirfd, const char *pathname, int flags, ...) {
87a3e230d1fa9a5ed773a029e2acc6eb4f3e849ea3Nick Kralevich    if (__builtin_constant_p(flags)) {
88a3e230d1fa9a5ed773a029e2acc6eb4f3e849ea3Nick Kralevich        if ((flags & O_CREAT) && __builtin_va_arg_pack_len() == 0) {
89a3e230d1fa9a5ed773a029e2acc6eb4f3e849ea3Nick Kralevich            __creat_error();  // compile time error
90a3e230d1fa9a5ed773a029e2acc6eb4f3e849ea3Nick Kralevich        }
91a3e230d1fa9a5ed773a029e2acc6eb4f3e849ea3Nick Kralevich    }
92a3e230d1fa9a5ed773a029e2acc6eb4f3e849ea3Nick Kralevich
93a3e230d1fa9a5ed773a029e2acc6eb4f3e849ea3Nick Kralevich    if (__builtin_va_arg_pack_len() > 1) {
94a3e230d1fa9a5ed773a029e2acc6eb4f3e849ea3Nick Kralevich        __too_many_args_error();  // compile time error
95a3e230d1fa9a5ed773a029e2acc6eb4f3e849ea3Nick Kralevich    }
96a3e230d1fa9a5ed773a029e2acc6eb4f3e849ea3Nick Kralevich
97a3e230d1fa9a5ed773a029e2acc6eb4f3e849ea3Nick Kralevich    if ((__builtin_va_arg_pack_len() == 0) && !__builtin_constant_p(flags)) {
98a3e230d1fa9a5ed773a029e2acc6eb4f3e849ea3Nick Kralevich        return __openat_2(dirfd, pathname, flags);
99a3e230d1fa9a5ed773a029e2acc6eb4f3e849ea3Nick Kralevich    }
100a3e230d1fa9a5ed773a029e2acc6eb4f3e849ea3Nick Kralevich
101a3e230d1fa9a5ed773a029e2acc6eb4f3e849ea3Nick Kralevich    return __openat_real(dirfd, pathname, flags, __builtin_va_arg_pack());
102a3e230d1fa9a5ed773a029e2acc6eb4f3e849ea3Nick Kralevich}
103a3e230d1fa9a5ed773a029e2acc6eb4f3e849ea3Nick Kralevich
1048118f62a7d3f1af1edb47e0bc2a49af1d523ae0fNick Kralevich#endif /* defined(__BIONIC_FORTIFY_INLINE) */
1058118f62a7d3f1af1edb47e0bc2a49af1d523ae0fNick Kralevich
1061dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project__END_DECLS
1071dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
1081dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif /* _FCNTL_H */
109