36dab5d5d8353afdb000906283e08ae78ce3d0b0
[glibc/nacl-glibc.git] / sysdeps / nacl / open.c
blob36dab5d5d8353afdb000906283e08ae78ce3d0b0
2 #include <errno.h>
3 #include <fcntl.h>
4 #include <stdarg.h>
5 #include <sysdep.h>
6 #include <unistd.h>
8 #include <nacl_syscalls.h>
11 #define COMMS_FD 3
13 static int is_initialised = 0;
14 static int use_rpc = 0;
16 static int should_use_rpc(void)
18 if(!is_initialised) {
19 use_rpc = getenv("NACL_FD") != NULL;
20 is_initialised = 1;
22 return use_rpc;
25 static int nacl_open_rpc(const char *filename)
27 int (*imc_sendmsg)(int fd, const struct NaClImcMsgHdr *msg, int flags) =
28 NACL_SYSCALL_ADDR(NACL_sys_imc_sendmsg);
29 int (*imc_recvmsg)(int fd, struct NaClImcMsgHdr *msg, int flags) =
30 NACL_SYSCALL_ADDR(NACL_sys_imc_recvmsg);
32 struct NaClImcMsgIoVec iov;
33 struct NaClImcMsgHdr msg;
34 int filename_len = strlen(filename);
35 char *msg_data = alloca(4 + filename_len);
36 memcpy(msg_data, "Open", 4);
37 memcpy(msg_data + 4, filename, filename_len);
38 iov.base = msg_data;
39 iov.length = 4 + filename_len;
40 msg.iov = &iov;
41 msg.iov_length = 1;
42 msg.descv = NULL;
43 msg.desc_length = 0;
44 if(imc_sendmsg(COMMS_FD, &msg, 0) < 0)
45 return -1;
47 char buf[4];
48 int fd;
49 iov.base = buf;
50 iov.length = sizeof(buf);
51 msg.descv = &fd;
52 msg.desc_length = 1;
53 int got = imc_recvmsg(COMMS_FD, &msg, 0);
54 if(got >= 0 && msg.desc_length == 1)
55 return fd;
56 else {
57 errno = ENOENT;
58 return -1;
62 int __open(const char *filename, int flags, ...)
64 int (*nacl_open)(char const *pathname, int flags, int mode) =
65 NACL_SYSCALL_ADDR(NACL_sys_open);
66 int mode = 0;
67 if(flags & O_CREAT) {
68 va_list arg;
69 va_start(arg, flags);
70 mode = va_arg(arg, int);
71 va_end(arg);
74 if(should_use_rpc())
75 return nacl_open_rpc(filename);
77 int result = nacl_open(filename, flags, mode);
78 if (result < 0) {
79 errno = -result;
80 return -1;
82 return result;
84 libc_hidden_def (__open)
85 weak_alias (__open, open)
86 strong_alias (__open, __libc_open)
87 strong_alias (__open, __open_nocancel)