idfake: improve debug output with syscall return value
[rofl0r-debuglib.git] / process_maps.c
blob59be553632de2cea488a341dd4468fa6835a429a
1 #include "process_maps.h"
2 #undef _GNU_SOURCE
3 #define _GNU_SOURCE
4 #include <stdio.h>
5 #include <stdlib.h>
6 #include <string.h>
8 void process_maps_perms_str(unsigned char perms, char* outbuf5) {
9 unsigned i = 0;
10 if(perms & MDP_R)
11 outbuf5[i++] = 'r';
12 else
13 outbuf5[i++] = '-';
14 if(perms & MDP_W)
15 outbuf5[i++] = 'w';
16 else
17 outbuf5[i++] = '-';
18 if(perms & MDP_X)
19 outbuf5[i++] = 'x';
20 else
21 outbuf5[i++] = '-';
22 if(perms & MDP_P)
23 outbuf5[i++] = 'p';
24 else if(perms & MDP_S)
25 outbuf5[i++] = 's';
26 else
27 outbuf5[i++] = '-';
28 outbuf5[i] = 0;
31 size_t process_map_size(map_data* map) {
32 return (uintptr_t) map->address.end - (uintptr_t) map->address.start;
35 map_data* find_map_for_addr(sblist* maps, void* addr) {
36 map_data* map;
37 sblist_iter(maps, map) {
38 if((uintptr_t) addr >= (uintptr_t) map->address.start && (uintptr_t) addr <= (uintptr_t) map->address.end)
39 return map;
41 return NULL;
44 sblist* process_maps_get(pid_t pid) {
45 char fnbuf[64];
46 char linebuf[4096 + 1024];
47 sblist* result;
48 map_data current;
49 char *p, *p2;
51 snprintf(fnbuf, sizeof(fnbuf), "/proc/%d/maps", (int) pid);
52 FILE* f = fopen(fnbuf, "r");
53 if(!f) {
54 perror("fopen");
55 return NULL;
58 result = sblist_new(sizeof(map_data), 16);
59 while((p = fgets(linebuf, sizeof(linebuf), f))) {
60 memset(&current, 0, sizeof(map_data));
61 current.address.start = (void*) (intptr_t) strtol(p, &p2, 16);
62 p = ++p2;
63 current.address.end = (void*) (intptr_t) strtol(p, &p2, 16);
64 p = ++p2;
65 if(*(p++) == 'r') current.perms |= MDP_R;
66 if(*(p++) == 'w') current.perms |= MDP_W;
67 if(*(p++) == 'x') current.perms |= MDP_X;
68 if(*p == 'p') current.perms |= MDP_P;
69 if(*p == 's') current.perms |= MDP_S;
70 p++; p++;
71 current.offset = (uint64_t) strtoll(p, &p2, 16);
72 p = ++p2;
73 current.dev.major = strtol(p, &p2, 16);
74 p = ++p2;
75 current.dev.minor = strtol(p, &p2, 16);
76 p = ++p2;
77 current.inode = strtoll(p, &p2, 10);
78 p = ++p2;
79 while(*p == ' ') ++p;
80 if(*p != '\n') {
81 p2 = p;
82 while(*p2 != '\n') p2++;
83 *p2 = 0;
84 current.pathname = strdup(p);
86 sblist_add(result, &current);
88 fclose(f);
89 return result;
92 void process_maps_free(sblist* maps) {
93 map_data* map;
94 sblist_iter(maps, map) {
95 if(map->pathname) free(map->pathname);
97 sblist_free(maps);