forked from Qortal/Brooklyn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
63 lines
1.0 KiB
63 lines
1.0 KiB
/* 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; |
|
}
|
|
|