OLD | NEW |
1 #include <string.h> | 1 #include <string.h> |
2 #include <sys/stat.h> | 2 #include <sys/stat.h> |
| 3 #include <time.h> |
3 #include <nacl_stat.h> | 4 #include <nacl_stat.h> |
4 #include <nacl_syscalls.h> | 5 #include <nacl_syscalls.h> |
5 #define stat nacl_abi_stat | 6 #define stat nacl_abi_stat |
6 #include <irt.h> | 7 #include <irt.h> |
7 #undef stat | 8 #undef stat |
8 #include <irt_syscalls.h> | 9 #include <irt_syscalls.h> |
9 #ifdef IS_IN_rtld | 10 #ifdef IS_IN_rtld |
10 #include <ldsodefs.h> | 11 #include <ldsodefs.h> |
11 #endif | 12 #endif |
12 #include "trusted-dirs.h" | 13 #include "trusted-dirs.h" |
(...skipping 238 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
251 Note: nacl_mount may change this logic if needed. */ | 252 Note: nacl_mount may change this logic if needed. */ |
252 static int (*___nacl_irt_open_resource) (const char* file, int *fd); | 253 static int (*___nacl_irt_open_resource) (const char* file, int *fd); |
253 static int nacl_irt_open_resource (const char *pathname, int *newfd) { | 254 static int nacl_irt_open_resource (const char *pathname, int *newfd) { |
254 if (memcmp (DL_DST_LIB "/", pathname, sizeof (DL_DST_LIB))) | 255 if (memcmp (DL_DST_LIB "/", pathname, sizeof (DL_DST_LIB))) |
255 return __nacl_irt_open (pathname, O_RDONLY, 0, newfd); | 256 return __nacl_irt_open (pathname, O_RDONLY, 0, newfd); |
256 else | 257 else |
257 return ___nacl_irt_open_resource (pathname + sizeof (DL_DST_LIB) - 1, | 258 return ___nacl_irt_open_resource (pathname + sizeof (DL_DST_LIB) - 1, |
258 newfd); | 259 newfd); |
259 } | 260 } |
260 | 261 |
| 262 static int nacl_irt_clock_getres(clockid_t clk_id, |
| 263 struct timespec *res) { |
| 264 return -NACL_SYSCALL (clock_getres) (clk_id, res); |
| 265 } |
| 266 |
| 267 static int nacl_irt_clock_gettime(clockid_t clk_id, |
| 268 struct timespec *tp) { |
| 269 return -NACL_SYSCALL (clock_gettime) (clk_id, tp); |
| 270 } |
| 271 |
261 static size_t no_interface (const char *interface_ident, | 272 static size_t no_interface (const char *interface_ident, |
262 void *table, size_t tablesize) { | 273 void *table, size_t tablesize) { |
263 return 0; | 274 return 0; |
264 } | 275 } |
265 | 276 |
266 size_t (*__nacl_irt_query) (const char *interface_ident, | 277 size_t (*__nacl_irt_query) (const char *interface_ident, |
267 void *table, size_t tablesize); | 278 void *table, size_t tablesize); |
268 | 279 |
269 void (*__nacl_irt_exit) (int status); | 280 void (*__nacl_irt_exit) (int status); |
270 int (*__nacl_irt_gettod) (struct timeval *tv); | 281 int (*__nacl_irt_gettod) (struct timeval *tv); |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
312 int (*__nacl_irt_cond_broadcast) (int cond_handle); | 323 int (*__nacl_irt_cond_broadcast) (int cond_handle); |
313 int (*__nacl_irt_cond_wait) (int cond_handle, int mutex_handle); | 324 int (*__nacl_irt_cond_wait) (int cond_handle, int mutex_handle); |
314 int (*__nacl_irt_cond_timed_wait_abs) (int cond_handle, int mutex_handle, | 325 int (*__nacl_irt_cond_timed_wait_abs) (int cond_handle, int mutex_handle, |
315 const struct timespec *abstime); | 326 const struct timespec *abstime); |
316 | 327 |
317 int (*__nacl_irt_tls_init) (void *tdb); | 328 int (*__nacl_irt_tls_init) (void *tdb); |
318 void *(*__nacl_irt_tls_get) (void); | 329 void *(*__nacl_irt_tls_get) (void); |
319 | 330 |
320 int (*__nacl_irt_open_resource) (const char* file, int *fd); | 331 int (*__nacl_irt_open_resource) (const char* file, int *fd); |
321 | 332 |
| 333 int (*__nacl_irt_clock_getres) (clockid_t clk_id, struct timespec *res); |
| 334 int (*__nacl_irt_clock_gettime) (clockid_t clk_id, struct timespec *tp); |
| 335 |
322 void | 336 void |
323 init_irt_table (void) | 337 init_irt_table (void) |
324 { | 338 { |
325 union { | 339 union { |
326 struct nacl_irt_basic nacl_irt_basic; | 340 struct nacl_irt_basic nacl_irt_basic; |
327 struct nacl_irt_fdio nacl_irt_fdio; | 341 struct nacl_irt_fdio nacl_irt_fdio; |
328 struct nacl_irt_filename nacl_irt_filename; | 342 struct nacl_irt_filename nacl_irt_filename; |
329 struct nacl_irt_memory nacl_irt_memory; | 343 struct nacl_irt_memory nacl_irt_memory; |
330 struct nacl_irt_dyncode nacl_irt_dyncode; | 344 struct nacl_irt_dyncode nacl_irt_dyncode; |
331 struct nacl_irt_thread nacl_irt_thread; | 345 struct nacl_irt_thread nacl_irt_thread; |
332 struct nacl_irt_mutex nacl_irt_mutex; | 346 struct nacl_irt_mutex nacl_irt_mutex; |
333 struct nacl_irt_cond nacl_irt_cond; | 347 struct nacl_irt_cond nacl_irt_cond; |
334 struct nacl_irt_tls nacl_irt_tls; | 348 struct nacl_irt_tls nacl_irt_tls; |
335 struct nacl_irt_resource_open nacl_irt_resource_open; | 349 struct nacl_irt_resource_open nacl_irt_resource_open; |
| 350 struct nacl_irt_clock nacl_irt_clock; |
336 } u; | 351 } u; |
337 | 352 |
338 if (__nacl_irt_query && | 353 if (__nacl_irt_query && |
339 __nacl_irt_query (NACL_IRT_BASIC_v0_1, &u.nacl_irt_basic, | 354 __nacl_irt_query (NACL_IRT_BASIC_v0_1, &u.nacl_irt_basic, |
340 sizeof(u.nacl_irt_basic)) == sizeof(u.nacl_irt_basic)) | 355 sizeof(u.nacl_irt_basic)) == sizeof(u.nacl_irt_basic)) |
341 { | 356 { |
342 __nacl_irt_exit = u.nacl_irt_basic.exit; | 357 __nacl_irt_exit = u.nacl_irt_basic.exit; |
343 __nacl_irt_gettod = u.nacl_irt_basic.gettod; | 358 __nacl_irt_gettod = u.nacl_irt_basic.gettod; |
344 __nacl_irt_clock = u.nacl_irt_basic.clock; | 359 __nacl_irt_clock = u.nacl_irt_basic.clock; |
345 __nacl_irt_nanosleep = u.nacl_irt_basic.nanosleep; | 360 __nacl_irt_nanosleep = u.nacl_irt_basic.nanosleep; |
(...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
508 0 | 523 0 |
509 }; | 524 }; |
510 _dl_argc = 2; | 525 _dl_argc = 2; |
511 _dl_argv = (char **)argv; | 526 _dl_argv = (char **)argv; |
512 } | 527 } |
513 #endif | 528 #endif |
514 } | 529 } |
515 else | 530 else |
516 __nacl_irt_open_resource = nacl_irt_open_as_resource; | 531 __nacl_irt_open_resource = nacl_irt_open_as_resource; |
517 | 532 |
| 533 if (__nacl_irt_query && |
| 534 __nacl_irt_query (NACL_IRT_CLOCK_v0_1, &u.nacl_irt_clock, |
| 535 sizeof(u.nacl_irt_clock)) == sizeof(u.nacl_irt_clock)) |
| 536 { |
| 537 __nacl_irt_clock_getres = u.nacl_irt_clock.getres; |
| 538 __nacl_irt_clock_gettime = u.nacl_irt_clock.gettime; |
| 539 } |
| 540 else |
| 541 { |
| 542 __nacl_irt_clock_getres = nacl_irt_clock_getres; |
| 543 __nacl_irt_clock_gettime = nacl_irt_clock_gettime; |
| 544 } |
| 545 |
518 if (!__nacl_irt_query) | 546 if (!__nacl_irt_query) |
519 __nacl_irt_query = no_interface; | 547 __nacl_irt_query = no_interface; |
520 } | 548 } |
521 | 549 |
522 size_t nacl_interface_query(const char *interface_ident, | 550 size_t nacl_interface_query(const char *interface_ident, |
523 void *table, size_t tablesize) { | 551 void *table, size_t tablesize) { |
524 return (*__nacl_irt_query)(interface_ident, table, tablesize); | 552 return (*__nacl_irt_query)(interface_ident, table, tablesize); |
525 } | 553 } |
OLD | NEW |