Implement stat64() via NaCl RPC
[glibc/nacl-glibc.git] / sysdeps / nacl / open.c
blob6dd430531d6060257fcb9e2079d48618af8b2cf1
2 #include <errno.h>
3 #include <fcntl.h>
4 #include <stdarg.h>
5 #include <string.h>
6 #include <sysdep.h>
7 #include <unistd.h>
9 #include <nacl_rpc.h>
10 #include <nacl_syscalls.h>
13 static int nacl_open_rpc(const char *filename)
15 struct NaClImcMsgIoVec iov;
16 struct NaClImcMsgHdr msg;
17 int filename_len = strlen(filename);
18 char *msg_data = alloca(4 + filename_len);
19 memcpy(msg_data, "Open", 4);
20 memcpy(msg_data + 4, filename, filename_len);
21 iov.base = msg_data;
22 iov.length = 4 + filename_len;
23 msg.iov = &iov;
24 msg.iov_length = 1;
25 msg.descv = NULL;
26 msg.desc_length = 0;
27 if(imc_sendmsg(NACL_COMMS_FD, &msg, 0) < 0)
28 return -1;
30 char buf[4];
31 int fd;
32 iov.base = buf;
33 iov.length = sizeof(buf);
34 msg.descv = &fd;
35 msg.desc_length = 1;
36 int got = imc_recvmsg(NACL_COMMS_FD, &msg, 0);
37 if(got >= 0 && msg.desc_length == 1)
38 return fd;
39 else {
40 errno = ENOENT;
41 return -1;
45 int __open(const char *filename, int flags, ...)
47 int (*nacl_open)(char const *pathname, int flags, int mode) =
48 NACL_SYSCALL_ADDR(NACL_sys_open);
49 int mode = 0;
50 if(flags & O_CREAT) {
51 va_list arg;
52 va_start(arg, flags);
53 mode = va_arg(arg, int);
54 va_end(arg);
57 if(nacl_should_use_rpc())
58 return nacl_open_rpc(filename);
60 int result = nacl_open(filename, flags, mode);
61 if (result < 0) {
62 errno = -result;
63 return -1;
65 return result;
67 libc_hidden_def (__open)
68 weak_alias (__open, open)
69 strong_alias (__open, __libc_open)
70 strong_alias (__open, __open_nocancel)