1 #include "process_maps.h"
8 void process_maps_perms_str(unsigned char perms
, char* outbuf5
) {
24 else if(perms
& MDP_S
)
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
) {
37 sblist_iter(maps
, map
) {
38 if((uintptr_t) addr
>= (uintptr_t) map
->address
.start
&& (uintptr_t) addr
<= (uintptr_t) map
->address
.end
)
44 sblist
* process_maps_get(pid_t pid
) {
46 char linebuf
[4096 + 1024];
51 snprintf(fnbuf
, sizeof(fnbuf
), "/proc/%d/maps", (int) pid
);
52 FILE* f
= fopen(fnbuf
, "r");
58 result
= sblist_new(sizeof(map_data
), 16);
59 while((p
= fgets(linebuf
, sizeof(linebuf
), f
))) {
60 memset(¤t
, 0, sizeof(map_data
));
61 current
.address
.start
= (void*) (intptr_t) strtol(p
, &p2
, 16);
63 current
.address
.end
= (void*) (intptr_t) strtol(p
, &p2
, 16);
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
;
71 current
.offset
= (uint64_t) strtoll(p
, &p2
, 16);
73 current
.dev
.major
= strtol(p
, &p2
, 16);
75 current
.dev
.minor
= strtol(p
, &p2
, 16);
77 current
.inode
= strtoll(p
, &p2
, 10);
82 while(*p2
!= '\n') p2
++;
84 current
.pathname
= strdup(p
);
86 sblist_add(result
, ¤t
);
92 void process_maps_free(sblist
* maps
) {
94 sblist_iter(maps
, map
) {
95 if(map
->pathname
) free(map
->pathname
);