#include <unistd.h> #include <fcntl.h> #include <stdarg.h> /* * Although these definitions are called *_PORTABLE * they are actually the ARM definitions */ /* Derived from development/ndk/platforms/android-3/arch-arm/include/asm/fcntl.h */ /* NB x86 does not have these and only uses the generic definitions */ #define O_DIRECTORY_PORTABLE 040000 #define O_NOFOLLOW_PORTABLE 0100000 #define O_DIRECT_PORTABLE 0200000 #define O_LARGEFILE_PORTABLE 0400000 /* Derived from development/ndk/platforms/android-3/include/asm-generic/fcntl.h */ #define O_ACCMODE_PORTABLE 00000003 #define O_RDONLY_PORTABLE 00000000 #define O_WRONLY_PORTABLE 00000001 #define O_RDWR_PORTABLE 00000002 #ifndef O_CREAT_PORTABLE #define O_CREAT_PORTABLE 00000100 #endif #ifndef O_EXCL_PORTABLE #define O_EXCL_PORTABLE 00000200 #endif #ifndef O_NOCTTY_PORTABLE #define O_NOCTTY_PORTABLE 00000400 #endif #ifndef O_TRUNC_PORTABLE #define O_TRUNC_PORTABLE 00001000 #endif #ifndef O_APPEND_PORTABLE #define O_APPEND_PORTABLE 00002000 #endif #ifndef O_NONBLOCK_PORTABLE #define O_NONBLOCK_PORTABLE 00004000 #endif #ifndef O_SYNC_PORTABLE #define O_SYNC_PORTABLE 00010000 #endif #ifndef FASYNC_PORTABLE #define FASYNC_PORTABLE 00020000 #endif #ifndef O_DIRECT_PORTABLE #define O_DIRECT_PORTABLE 00040000 #endif #ifndef O_LARGEFILE_PORTABLE #define O_LARGEFILE_PORTABLE 00100000 #endif #ifndef O_DIRECTORY_PORTABLE #define O_DIRECTORY_PORTABLE 00200000 #endif #ifndef O_NOFOLLOW_PORTABLE #define O_NOFOLLOW_PORTABLE 00400000 #endif #ifndef O_NOATIME_PORTABLE #define O_NOATIME_PORTABLE 01000000 #endif #ifndef O_NDELAY_PORTABLE #define O_NDELAY_PORTABLE O_NONBLOCK_PORTABLE #endif #if O_CREAT_PORTABLE==O_CREAT #error Bad build environment #endif static inline int mips_change_flags(int flags) { int mipsflags = flags & O_ACCMODE_PORTABLE; if (flags & O_CREAT_PORTABLE) mipsflags |= O_CREAT; if (flags & O_EXCL_PORTABLE) mipsflags |= O_EXCL; if (flags & O_NOCTTY_PORTABLE) mipsflags |= O_NOCTTY; if (flags & O_TRUNC_PORTABLE) mipsflags |= O_TRUNC; if (flags & O_APPEND_PORTABLE) mipsflags |= O_APPEND; if (flags & O_NONBLOCK_PORTABLE) mipsflags |= O_NONBLOCK; if (flags & O_SYNC_PORTABLE) mipsflags |= O_SYNC; if (flags & FASYNC_PORTABLE) mipsflags |= FASYNC; if (flags & O_DIRECT_PORTABLE) mipsflags |= O_DIRECT; if (flags & O_LARGEFILE_PORTABLE) mipsflags |= O_LARGEFILE; if (flags & O_DIRECTORY_PORTABLE) mipsflags |= O_DIRECTORY; if (flags & O_NOFOLLOW_PORTABLE) mipsflags |= O_NOFOLLOW; if (flags & O_NOATIME_PORTABLE) mipsflags |= O_NOATIME; if (flags & O_NDELAY_PORTABLE) mipsflags |= O_NDELAY; return mipsflags; } extern int __open(const char*, int, int); int open(const char *pathname, int flags, ...) { mode_t mode = 0; flags |= O_LARGEFILE; if (flags & O_CREAT) { va_list args; va_start(args, flags); mode = (mode_t) va_arg(args, int); va_end(args); } return __open(pathname, mips_change_flags(flags), mode); }