Chromium Code Reviews| Index: src/nonsfi/linux/abi_conversion.h |
| diff --git a/src/nonsfi/linux/abi_conversion.h b/src/nonsfi/linux/abi_conversion.h |
| index 8afd4a13fd29435fe3fb6d3a716f395112338e41..527a2876dcc595d34b32dd0dc3e4b9ce1ab727cb 100644 |
| --- a/src/nonsfi/linux/abi_conversion.h |
| +++ b/src/nonsfi/linux/abi_conversion.h |
| @@ -7,11 +7,13 @@ |
| #ifndef NATIVE_CLIENT_SRC_NONSFI_LINUX_ABI_CONVERSION_H_ |
| #define NATIVE_CLIENT_SRC_NONSFI_LINUX_ABI_CONVERSION_H_ 1 |
| +#include <fcntl.h> |
| #include <stdint.h> |
| #include <string.h> |
| #include <sys/stat.h> |
| #include <sys/time.h> |
| #include <time.h> |
| +#include <stdio.h> |
|
Mark Seaborn
2014/11/27 16:12:16
Left over from debugging?
hidehiko
2014/11/28 16:58:15
Good catch. Removed.
|
| #include "native_client/src/nonsfi/linux/linux_syscall_defines.h" |
| #include "native_client/src/trusted/service_runtime/nacl_config.h" |
| @@ -70,6 +72,74 @@ struct linux_abi_stat64 { |
| # error Unsupported architecture |
| #endif |
| +/* We do not use O_RDONLY for abi conversion because it is 0. */ |
| +#define LINUX_O_WRONLY 01 |
|
Mark Seaborn
2014/11/27 16:12:17
Which of these flags are different from NaCl/newli
hidehiko
2014/11/28 16:58:15
O_SYNC and O_DIRECTORY.
O_SYNC is 010000 in NaCl
|
| +#define LINUX_O_RDWR 02 |
| +#define LINUX_O_CREAT 0100 |
| +#define LINUX_O_TRUNC 01000 |
| +#define LINUX_O_APPEND 02000 |
| +#define LINUX_O_EXCL 0200 |
| +#define LINUX_O_NONBLOCK 04000 |
| +#define LINUX_O_SYNC 04010000 |
| +#define LINUX_O_ASYNC 020000 |
| + |
| +#if defined(__i386__) |
| +# define LINUX_O_DIRECTORY 0200000 |
| +#elif defined(__arm__) |
| +# define LINUX_O_DIRECTORY 040000 |
| +#else |
| +# error Unsupported architecture |
| +#endif |
| + |
| +#define LINUX_O_CLOEXEC 02000000 |
| + |
| +#define NACL_KNOWN_O_FLAGS (O_ACCMODE | O_CREAT | O_TRUNC | O_APPEND |\ |
| + O_EXCL | O_NONBLOCK | O_SYNC | O_ASYNC |\ |
| + O_DIRECTORY | O_CLOEXEC) |
| + |
| +/* Converts open flags from NaCl's to Linux's ABI. */ |
| +static inline int nacl_oflags_to_linux_oflags(int nacl_oflags) { |
| + if (nacl_oflags & ~NACL_KNOWN_O_FLAGS) { |
| + /* Unknown bit is found. */ |
| + return -1; |
| + } |
| +#define NACL_TO_LINUX(name) ((nacl_oflags & name) ? LINUX_ ## name : 0) |
| + return (NACL_TO_LINUX(O_WRONLY) | |
| + NACL_TO_LINUX(O_RDWR) | |
| + NACL_TO_LINUX(O_CREAT) | |
| + NACL_TO_LINUX(O_TRUNC) | |
| + NACL_TO_LINUX(O_APPEND) | |
| + NACL_TO_LINUX(O_EXCL) | |
| + NACL_TO_LINUX(O_NONBLOCK) | |
| + NACL_TO_LINUX(O_SYNC) | |
| + NACL_TO_LINUX(O_ASYNC) | |
| + NACL_TO_LINUX(O_DIRECTORY) | |
| + NACL_TO_LINUX(O_CLOEXEC)); |
| +#undef NACL_TO_LINUX |
| +} |
| + |
| +/* Converts open flags from Linux's to NaCl's ABI. */ |
| +static inline int linux_oflags_to_nacl_oflags(int linux_oflags) { |
| + /* |
| + * Because O_SYNC has two 1-bits. So we cannot use the same validation |
| + * check. We ignore unknown flags in this case. |
| + */ |
| +#define LINUX_TO_NACL(name) \ |
| + (((linux_oflags & LINUX_ ## name) == LINUX_ ## name) ? name : 0) |
| + return (LINUX_TO_NACL(O_WRONLY) | |
| + LINUX_TO_NACL(O_RDWR) | |
| + LINUX_TO_NACL(O_CREAT) | |
| + LINUX_TO_NACL(O_TRUNC) | |
| + LINUX_TO_NACL(O_APPEND) | |
| + LINUX_TO_NACL(O_EXCL) | |
| + LINUX_TO_NACL(O_NONBLOCK) | |
| + LINUX_TO_NACL(O_SYNC) | |
| + LINUX_TO_NACL(O_ASYNC) | |
| + LINUX_TO_NACL(O_DIRECTORY) | |
| + LINUX_TO_NACL(O_CLOEXEC)); |
| +#undef LINUX_TO_NACL |
| +} |
| + |
| /* Converts the timespec struct from NaCl's to Linux's ABI. */ |
| static inline void nacl_timespec_to_linux_timespec( |
| const struct timespec *nacl_timespec, |