open.c revision 77401247ea8c15ae4ac022936731b83b2def1e9e
1#include <unistd.h>
2#include <fcntl.h>
3#include <stdarg.h>
4
5/*
6 * Although these definitions are called  *_PORTABLE
7 * they are actually the ARM definitions
8 */
9
10/* Derived from development/ndk/platforms/android-3/arch-arm/include/asm/fcntl.h */
11/* NB x86 does not have these and only uses the generic definitions */
12#define O_DIRECTORY_PORTABLE	040000
13#define O_NOFOLLOW_PORTABLE	0100000
14#define O_DIRECT_PORTABLE	0200000
15#define O_LARGEFILE_PORTABLE	0400000
16
17/* Derived from development/ndk/platforms/android-3/include/asm-generic/fcntl.h */
18#define O_ACCMODE_PORTABLE	00000003
19#define O_RDONLY_PORTABLE	00000000
20#define O_WRONLY_PORTABLE	00000001
21#define O_RDWR_PORTABLE		00000002
22#ifndef O_CREAT_PORTABLE
23#define O_CREAT_PORTABLE	00000100
24#endif
25#ifndef O_EXCL_PORTABLE
26#define O_EXCL_PORTABLE		00000200
27#endif
28#ifndef O_NOCTTY_PORTABLE
29#define O_NOCTTY_PORTABLE	00000400
30#endif
31#ifndef O_TRUNC_PORTABLE
32#define O_TRUNC_PORTABLE	00001000
33#endif
34#ifndef O_APPEND_PORTABLE
35#define O_APPEND_PORTABLE	00002000
36#endif
37#ifndef O_NONBLOCK_PORTABLE
38#define O_NONBLOCK_PORTABLE	00004000
39#endif
40#ifndef O_SYNC_PORTABLE
41#define O_SYNC_PORTABLE		00010000
42#endif
43#ifndef FASYNC_PORTABLE
44#define FASYNC_PORTABLE		00020000
45#endif
46#ifndef O_DIRECT_PORTABLE
47#define O_DIRECT_PORTABLE	00040000
48#endif
49#ifndef O_LARGEFILE_PORTABLE
50#define O_LARGEFILE_PORTABLE	00100000
51#endif
52#ifndef O_DIRECTORY_PORTABLE
53#define O_DIRECTORY_PORTABLE	00200000
54#endif
55#ifndef O_NOFOLLOW_PORTABLE
56#define O_NOFOLLOW_PORTABLE	00400000
57#endif
58#ifndef O_NOATIME_PORTABLE
59#define O_NOATIME_PORTABLE	01000000
60#endif
61#ifndef O_NDELAY_PORTABLE
62#define O_NDELAY_PORTABLE	O_NONBLOCK_PORTABLE
63#endif
64
65#if O_CREAT_PORTABLE==O_CREAT
66#error Bad build environment
67#endif
68
69static inline int mips_change_flags(int flags)
70{
71    int mipsflags = flags & O_ACCMODE_PORTABLE;
72    if (flags & O_CREAT_PORTABLE)
73	mipsflags |= O_CREAT;
74    if (flags & O_EXCL_PORTABLE)
75	mipsflags |= O_EXCL;
76    if (flags & O_NOCTTY_PORTABLE)
77	mipsflags |= O_NOCTTY;
78    if (flags & O_TRUNC_PORTABLE)
79	mipsflags |= O_TRUNC;
80    if (flags & O_APPEND_PORTABLE)
81	mipsflags |= O_APPEND;
82    if (flags & O_NONBLOCK_PORTABLE)
83	mipsflags |= O_NONBLOCK;
84    if (flags & O_SYNC_PORTABLE)
85	mipsflags |= O_SYNC;
86    if (flags & FASYNC_PORTABLE)
87	mipsflags |= FASYNC;
88    if (flags & O_DIRECT_PORTABLE)
89	mipsflags |= O_DIRECT;
90    if (flags & O_LARGEFILE_PORTABLE)
91	mipsflags |= O_LARGEFILE;
92    if (flags & O_DIRECTORY_PORTABLE)
93	mipsflags |= O_DIRECTORY;
94    if (flags & O_NOFOLLOW_PORTABLE)
95	mipsflags |= O_NOFOLLOW;
96    if (flags & O_NOATIME_PORTABLE)
97	mipsflags |= O_NOATIME;
98    if (flags & O_NDELAY_PORTABLE)
99	mipsflags |= O_NDELAY;
100
101    return mipsflags;
102}
103
104extern int  __open(const char*, int, int);
105int open_portable(const char *pathname, int flags, ...)
106{
107    mode_t  mode = 0;
108    flags |= O_LARGEFILE;
109
110    if (flags & O_CREAT)
111    {
112        va_list  args;
113
114        va_start(args, flags);
115        mode = (mode_t) va_arg(args, int);
116        va_end(args);
117    }
118
119    return __open(pathname, mips_change_flags(flags), mode);
120}
121