OLD | NEW |
| (Empty) |
1 /* Copyright (c) 2013 The Chromium Authors. All rights reserved. | |
2 * Use of this source code is governed by a BSD-style license that can be | |
3 * found in the LICENSE file. */ | |
4 | |
5 #ifndef _GNU_SOURCE | |
6 #define _GNU_SOURCE | |
7 #endif | |
8 #include <stdio.h> | |
9 #include <sys/types.h> | |
10 #include <unistd.h> | |
11 | |
12 #if defined(__native_client__) && defined(__GLIBC__) | |
13 | |
14 static ssize_t fdopen_read(void *cookie, char *buf, size_t size) { | |
15 return read((int) cookie, buf, size); | |
16 } | |
17 | |
18 static ssize_t fdopen_write(void *cookie, const char *buf, size_t size) { | |
19 return write((int) cookie, buf, size); | |
20 } | |
21 | |
22 static int fdopen_seek(void *cookie, off_t *offset, int whence) { | |
23 off_t ret = lseek((int) cookie, *offset, whence); | |
24 if (ret < 0) { | |
25 return -1; | |
26 } | |
27 *offset = ret; | |
28 return 0; | |
29 } | |
30 | |
31 static int fdopen_close(void *cookie) { | |
32 return close((int) cookie); | |
33 } | |
34 | |
35 static cookie_io_functions_t fdopen_functions = { | |
36 fdopen_read, | |
37 fdopen_write, | |
38 fdopen_seek, | |
39 fdopen_close, | |
40 }; | |
41 | |
42 /* | |
43 * TODO(bradnelson): Remove this glibc is fixed. | |
44 * See: https://code.google.com/p/nativeclient/issues/detail?id=3362 | |
45 * Workaround fdopen in glibc failing due to it vetting the provided file | |
46 * handles with fcntl which is not currently interceptable. | |
47 */ | |
48 FILE *fdopen(int fildes, const char *mode) { | |
49 return fopencookie((void *) fildes, mode, fdopen_functions); | |
50 } | |
51 | |
52 #endif /* defined(__native_client__) && defined(__GLIBC__) */ | |
OLD | NEW |