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