mlock2.h (1065B)
1/* SPDX-License-Identifier: GPL-2.0 */ 2#include <syscall.h> 3#include <errno.h> 4#include <stdio.h> 5#include <stdlib.h> 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 15static 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} 24 25static 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 51next: 52 free(line); 53 line = NULL; 54 size = 0; 55 } 56 57 fclose(file); 58 file = NULL; 59 60out: 61 free(line); 62 return file; 63}