Advertisement
ruberval

arquivo

Apr 19th, 2013
65
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 3.77 KB | None | 0 0
  1. /*
  2.  * Copyright (C) 2008 The Android Open Source Project
  3.  * All rights reserved.
  4.  *
  5.  * Redistribution and use in source and binary forms, with or without
  6.  * modification, are permitted provided that the following conditions
  7.  * are met:
  8.  *  * Redistributions of source code must retain the above copyright
  9.  *    notice, this list of conditions and the following disclaimer.
  10.  *  * Redistributions in binary form must reproduce the above copyright
  11.  *    notice, this list of conditions and the following disclaimer in
  12.  *    the documentation and/or other materials provided with the
  13.  *    distribution.
  14.  *
  15.  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  16.  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  17.  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
  18.  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
  19.  * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
  20.  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
  21.  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
  22.  * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
  23.  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
  24.  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
  25.  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  26.  * SUCH DAMAGE.
  27.  */
  28. #ifndef _FCNTL_H
  29. #define _FCNTL_H
  30.  
  31. #include <sys/cdefs.h>
  32. #include <sys/types.h>
  33. #include <linux/fcntl.h>
  34. #include <unistd.h>  /* this is not required, but makes client code much happier */
  35.  
  36. __BEGIN_DECLS
  37.  
  38. #ifndef O_ASYNC
  39. #define O_ASYNC  FASYNC
  40. #endif
  41.  
  42. #ifndef O_CLOEXEC
  43. #define O_CLOEXEC  02000000
  44. #endif
  45.  
  46. extern int  open(const char*  path, int  mode, ...);
  47. extern int  openat(int fd, const char*  path, int  mode, ...);
  48. extern int  unlinkat(int dirfd, const char *pathname, int flags);
  49. extern int  fcntl(int   fd, int   command, ...);
  50. extern int  creat(const char*  path, mode_t  mode);
  51.  
  52. #if defined(__BIONIC_FORTIFY_INLINE)
  53.  
  54. extern void __creat_error()
  55.     __attribute__((__error__ ("called with O_CREAT, but missing mode")));
  56. extern void __too_many_args_error()
  57.     __attribute__((__error__ ("too many arguments")));
  58. extern int __open_real(const char *pathname, int flags, ...)
  59.     __asm__(__USER_LABEL_PREFIX__ "open");
  60. extern int __open_2(const char *, int);
  61.  
  62. __BIONIC_FORTIFY_INLINE
  63. int open(const char *pathname, int flags, ...) {
  64.     if (__builtin_constant_p(flags)) {
  65.         if ((flags & O_CREAT) && __builtin_va_arg_pack_len() == 0) {
  66.             __creat_error();  // compile time error
  67.         }
  68.     }
  69.  
  70.     if (__builtin_va_arg_pack_len() > 1) {
  71.         __too_many_args_error();  // compile time error
  72.     }
  73.  
  74.     if ((__builtin_va_arg_pack_len() == 0) && !__builtin_constant_p(flags)) {
  75.         return __open_2(pathname, flags);
  76.     }
  77.  
  78.     return __open_real(pathname, flags, __builtin_va_arg_pack());
  79. }
  80.  
  81. extern int __openat_2(int, const char *, int);
  82. extern int __openat_real(int dirfd, const char *pathname, int flags, ...)
  83.     __asm__(__USER_LABEL_PREFIX__ "openat");
  84.  
  85. __BIONIC_FORTIFY_INLINE
  86. int openat(int dirfd, const char *pathname, int flags, ...) {
  87.     if (__builtin_constant_p(flags)) {
  88.         if ((flags & O_CREAT) && __builtin_va_arg_pack_len() == 0) {
  89.             __creat_error();  // compile time error
  90.         }
  91.     }
  92.  
  93.     if (__builtin_va_arg_pack_len() > 1) {
  94.         __too_many_args_error();  // compile time error
  95.     }
  96.  
  97.     if ((__builtin_va_arg_pack_len() == 0) && !__builtin_constant_p(flags)) {
  98.         return __openat_2(dirfd, pathname, flags);
  99.     }
  100.  
  101.     return __openat_real(dirfd, pathname, flags, __builtin_va_arg_pack());
  102. }
  103.  
  104. #endif /* defined(__BIONIC_FORTIFY_INLINE) */
  105.  
  106. __END_DECLS
  107.  
  108. #endif /* _FCNTL_H */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement