Added support for $pid_vmpeak, $pid_vmsize, $pid_vmlck, $pid_vmhwm, $pid_vmrss, ...
[monky] / src / proc.c
index 683bc23..dc59e4d 100644 (file)
@@ -598,3 +598,70 @@ void print_pid_fsgid(struct text_object *obj, char *p, int p_max_size) {
                free(buf);
        }
 }
+
+void internal_print_pid_vm(char* pid, char *p, int p_max_size, const char* entry, const char* errorstring) {
+       char *begin, *end, *buf = NULL;
+       int bytes_read;
+
+       asprintf(&buf, PROCDIR "/%s/status", pid);
+       strcpy(pid, buf);
+       free(buf);
+       buf = readfile(pid, &bytes_read, 1);
+       if(buf != NULL) {
+               begin = strstr(buf, entry);
+               if(begin != NULL) {
+                       begin += strlen(entry);
+                       while(*begin == '\t' || *begin == ' ') {
+                               begin++;
+                       }
+                       end = strchr(begin, '\n');
+                       if(end != NULL) {
+                               *(end) = 0;
+                       }
+                       snprintf(p, p_max_size, "%s", begin);
+               } else {
+                       NORM_ERR(errorstring, pid);
+               }
+               free(buf);
+       }
+}
+
+void print_pid_vmpeak(struct text_object *obj, char *p, int p_max_size) {
+       internal_print_pid_vm(obj->data.s, p, p_max_size, "VmPeak:\t", "Can't find the process peak virtual memory size in '%s'");
+}
+
+void print_pid_vmsize(struct text_object *obj, char *p, int p_max_size) {
+       internal_print_pid_vm(obj->data.s, p, p_max_size, "VmSize:\t", "Can't find the process virtual memory size in '%s'");
+}
+
+void print_pid_vmlck(struct text_object *obj, char *p, int p_max_size) {
+       internal_print_pid_vm(obj->data.s, p, p_max_size, "VmLck:\t", "Can't find the process locked memory size in '%s'");
+}
+
+void print_pid_vmhwm(struct text_object *obj, char *p, int p_max_size) {
+       internal_print_pid_vm(obj->data.s, p, p_max_size, "VmHWM:\t", "Can't find the process peak resident set size in '%s'");
+}
+
+void print_pid_vmrss(struct text_object *obj, char *p, int p_max_size) {
+       internal_print_pid_vm(obj->data.s, p, p_max_size, "VmHWM:\t", "Can't find the process resident set size in '%s'");
+}
+
+void print_pid_vmdata(struct text_object *obj, char *p, int p_max_size) {
+       internal_print_pid_vm(obj->data.s, p, p_max_size, "VmData:\t", "Can't find the process data segment size in '%s'");
+}
+
+void print_pid_vmstk(struct text_object *obj, char *p, int p_max_size) {
+       internal_print_pid_vm(obj->data.s, p, p_max_size, "VmData:\t", "Can't find the process stack segment size in '%s'");
+}
+
+void print_pid_vmexe(struct text_object *obj, char *p, int p_max_size) {
+       internal_print_pid_vm(obj->data.s, p, p_max_size, "VmData:\t", "Can't find the process text segment size in '%s'");
+}
+
+void print_pid_vmlib(struct text_object *obj, char *p, int p_max_size) {
+       internal_print_pid_vm(obj->data.s, p, p_max_size, "VmLib:\t", "Can't find the process shared library code size in '%s'");
+}
+
+void print_pid_vmpte(struct text_object *obj, char *p, int p_max_size) {
+       internal_print_pid_vm(obj->data.s, p, p_max_size, "VmPTE:\t", "Can't find the process page table entries size in '%s'");
+}