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