Implement stat64() via NaCl RPC
[glibc/nacl-glibc.git] / sysdeps / nacl / xstat64.c
bloba792d4f48865eee05b60271056c55c70041b70ca
2 #include <errno.h>
3 #include <stddef.h>
4 #include <string.h>
5 #include <sys/stat.h>
7 #include <nacl_rpc.h>
8 #include <nacl_syscalls.h>
11 int __have_no_stat64; /* Needed by fxstatat.c */
14 int ___xstat64 (int vers, const char *filename, struct stat64 *buf)
16 struct NaClImcMsgIoVec iov;
17 struct NaClImcMsgHdr msg;
18 int filename_len = strlen(filename);
19 char *msg_data = alloca(4 + filename_len);
20 memcpy(msg_data, "Stat", 4);
21 memcpy(msg_data + 4, filename, filename_len);
22 iov.base = msg_data;
23 iov.length = 4 + filename_len;
24 msg.iov = &iov;
25 msg.iov_length = 1;
26 msg.descv = NULL;
27 msg.desc_length = 0;
28 if(imc_sendmsg(NACL_COMMS_FD, &msg, 0) < 0)
29 return -1;
31 int no_fields = 16;
32 char recv_data[4 + 4*no_fields + 10];
33 iov.base = recv_data;
34 iov.length = sizeof(recv_data);
35 msg.descv = NULL;
36 msg.desc_length = 0;
37 int got = imc_recvmsg(NACL_COMMS_FD, &msg, 0);
38 if(got == 4 + 4*no_fields && memcmp(recv_data, "Rsta", 4) == 0) {
39 int *fields = (int *) (recv_data + 4);
40 buf->st_dev = fields[0];
41 buf->st_ino = fields[1];
42 buf->st_mode = fields[2];
43 buf->st_nlink = fields[3];
44 buf->st_uid = fields[4];
45 buf->st_gid = fields[5];
46 buf->st_rdev = fields[6];
47 buf->st_size = fields[7];
48 buf->st_blksize = fields[8];
49 buf->st_blocks = fields[9];
50 buf->st_atim.tv_sec = fields[10];
51 buf->st_atim.tv_nsec = fields[11];
52 buf->st_mtim.tv_sec = fields[12];
53 buf->st_mtim.tv_nsec = fields[13];
54 buf->st_ctim.tv_sec = fields[14];
55 buf->st_ctim.tv_nsec = fields[15];
56 return 0;
58 else {
59 errno = ENOENT;
60 return -1;
64 #include <shlib-compat.h>
66 #if SHLIB_COMPAT(libc, GLIBC_2_1, GLIBC_2_2)
67 versioned_symbol (libc, ___xstat64, __xstat64, GLIBC_2_2);
68 strong_alias (___xstat64, __old__xstat64)
69 compat_symbol (libc, __old__xstat64, __xstat64, GLIBC_2_1);
70 hidden_ver (___xstat64, __xstat64)
71 #else
72 strong_alias (___xstat64, __xstat64)
73 hidden_def (__xstat64)
74 #endif