mlock2.h 1.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. #include <syscall.h>
  2. #include <errno.h>
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #ifndef MLOCK_ONFAULT
  6. #define MLOCK_ONFAULT 1
  7. #endif
  8. #ifndef MCL_ONFAULT
  9. #define MCL_ONFAULT (MCL_FUTURE << 1)
  10. #endif
  11. static int mlock2_(void *start, size_t len, int flags)
  12. {
  13. #ifdef __NR_mlock2
  14. return syscall(__NR_mlock2, start, len, flags);
  15. #else
  16. errno = ENOSYS;
  17. return -1;
  18. #endif
  19. }
  20. static FILE *seek_to_smaps_entry(unsigned long addr)
  21. {
  22. FILE *file;
  23. char *line = NULL;
  24. size_t size = 0;
  25. unsigned long start, end;
  26. char perms[5];
  27. unsigned long offset;
  28. char dev[32];
  29. unsigned long inode;
  30. char path[BUFSIZ];
  31. file = fopen("/proc/self/smaps", "r");
  32. if (!file) {
  33. perror("fopen smaps");
  34. _exit(1);
  35. }
  36. while (getline(&line, &size, file) > 0) {
  37. if (sscanf(line, "%lx-%lx %s %lx %s %lu %s\n",
  38. &start, &end, perms, &offset, dev, &inode, path) < 6)
  39. goto next;
  40. if (start <= addr && addr < end)
  41. goto out;
  42. next:
  43. free(line);
  44. line = NULL;
  45. size = 0;
  46. }
  47. fclose(file);
  48. file = NULL;
  49. out:
  50. free(line);
  51. return file;
  52. }