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
);
23 iov
.length
= 4 + filename_len
;
28 if(imc_sendmsg(NACL_COMMS_FD
, &msg
, 0) < 0)
32 char recv_data
[4 + 4*no_fields
+ 10];
34 iov
.length
= sizeof(recv_data
);
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];
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
)
72 strong_alias (___xstat64
, __xstat64
)
73 hidden_def (__xstat64
)