__map_file.c 577 B

1234567891011121314151617181920
  1. #include <sys/mman.h>
  2. #include <fcntl.h>
  3. #include <sys/stat.h>
  4. #include "syscall.h"
  5. void *__mmap(void *, size_t, int, int, int, off_t);
  6. const char unsigned *__map_file(const char *pathname, size_t *size)
  7. {
  8. struct stat st;
  9. const unsigned char *map = MAP_FAILED;
  10. int flags = O_RDONLY|O_LARGEFILE|O_CLOEXEC|O_NONBLOCK;
  11. int fd = __syscall(SYS_open, pathname, flags);
  12. if (fd < 0) return 0;
  13. if (!__syscall(SYS_fstat, fd, &st))
  14. map = __mmap(0, st.st_size, PROT_READ, MAP_SHARED, fd, 0);
  15. __syscall(SYS_close, fd);
  16. *size = st.st_size;
  17. return map == MAP_FAILED ? 0 : map;
  18. }