123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263 |
- /* SPDX-License-Identifier: GPL-2.0 */
- #include <syscall.h>
- #include <errno.h>
- #include <stdio.h>
- #include <stdlib.h>
- #ifndef MLOCK_ONFAULT
- #define MLOCK_ONFAULT 1
- #endif
- #ifndef MCL_ONFAULT
- #define MCL_ONFAULT (MCL_FUTURE << 1)
- #endif
- static int mlock2_(void *start, size_t len, int flags)
- {
- #ifdef __NR_mlock2
- return syscall(__NR_mlock2, start, len, flags);
- #else
- errno = ENOSYS;
- return -1;
- #endif
- }
- static FILE *seek_to_smaps_entry(unsigned long addr)
- {
- FILE *file;
- char *line = NULL;
- size_t size = 0;
- unsigned long start, end;
- char perms[5];
- unsigned long offset;
- char dev[32];
- unsigned long inode;
- char path[BUFSIZ];
- file = fopen("/proc/self/smaps", "r");
- if (!file) {
- perror("fopen smaps");
- _exit(1);
- }
- while (getline(&line, &size, file) > 0) {
- if (sscanf(line, "%lx-%lx %s %lx %s %lu %s\n",
- &start, &end, perms, &offset, dev, &inode, path) < 6)
- goto next;
- if (start <= addr && addr < end)
- goto out;
- next:
- free(line);
- line = NULL;
- size = 0;
- }
- fclose(file);
- file = NULL;
- out:
- free(line);
- return file;
- }
|