63 строки
1.0 KiB
C
63 строки
1.0 KiB
C
#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;
|
|
}
|