From 5b686294f31af164ccb2eb42ebfc07bccb1aa366 Mon Sep 17 00:00:00 2001 From: Phil Sutter Date: Sun, 29 Nov 2009 16:27:12 +0100 Subject: [PATCH] pid objects: outsource sub object evaluation --- src/conky.c | 160 ------------------------------------------- src/core.c | 126 ++++++++++++---------------------- src/proc.c | 194 ++++++++++++++++++++++++++++++++++++++-------------- src/proc.h | 3 + 4 files changed, 188 insertions(+), 295 deletions(-) diff --git a/src/conky.c b/src/conky.c index 4bcbdb58..60ed2164 100644 --- a/src/conky.c +++ b/src/conky.c @@ -796,283 +796,123 @@ void generate_text_internal(char *p, int p_max_size, } #endif /* X11 */ OBJ(pid_chroot) { - char buf[max_user_text]; - - generate_text_internal(buf, max_user_text, *obj->sub, cur); - obj->data.s = buf; print_pid_chroot(obj, p, p_max_size); } OBJ(pid_cmdline) { - char buf[max_user_text]; - - generate_text_internal(buf, max_user_text, *obj->sub, cur); - obj->data.s = buf; print_pid_cmdline(obj, p, p_max_size); } OBJ(pid_cwd) { - char buf[max_user_text]; - - generate_text_internal(buf, max_user_text, *obj->sub, cur); - obj->data.s = buf; print_pid_cwd(obj, p, p_max_size); } OBJ(pid_environ) { - char buf[max_user_text]; - - generate_text_internal(buf, max_user_text, *obj->sub, cur); - obj->data.s = buf; print_pid_environ(obj, p, p_max_size); } OBJ(pid_environ_list) { - char buf[max_user_text]; - - generate_text_internal(buf, max_user_text, *obj->sub, cur); - obj->data.s = buf; print_pid_environ_list(obj, p, p_max_size); } OBJ(pid_exe) { - char buf[max_user_text]; - - generate_text_internal(buf, max_user_text, *obj->sub, cur); - obj->data.s = buf; print_pid_exe(obj, p, p_max_size); } OBJ(pid_nice) { - char buf[max_user_text]; - - generate_text_internal(buf, max_user_text, *obj->sub, cur); - obj->data.s = buf; print_pid_nice(obj, p, p_max_size); } OBJ(pid_openfiles) { - char buf[max_user_text]; - - generate_text_internal(buf, max_user_text, *obj->sub, cur); - obj->data.s = buf; print_pid_openfiles(obj, p, p_max_size); } OBJ(pid_parent) { - char buf[max_user_text]; - - generate_text_internal(buf, max_user_text, *obj->sub, cur); - obj->data.s = buf; print_pid_parent(obj, p, p_max_size); } OBJ(pid_priority) { - char buf[max_user_text]; - - generate_text_internal(buf, max_user_text, *obj->sub, cur); - obj->data.s = buf; print_pid_priority(obj, p, p_max_size); } OBJ(pid_state) { - char buf[max_user_text]; - - generate_text_internal(buf, max_user_text, *obj->sub, cur); - obj->data.s = buf; print_pid_state(obj, p, p_max_size); } OBJ(pid_state_short) { - char buf[max_user_text]; - - generate_text_internal(buf, max_user_text, *obj->sub, cur); - obj->data.s = buf; print_pid_state_short(obj, p, p_max_size); } OBJ(pid_stderr) { - char buf[max_user_text]; - - generate_text_internal(buf, max_user_text, *obj->sub, cur); - obj->data.s = buf; print_pid_stderr(obj, p, p_max_size); } OBJ(pid_stdin) { - char buf[max_user_text]; - - generate_text_internal(buf, max_user_text, *obj->sub, cur); - obj->data.s = buf; print_pid_stdin(obj, p, p_max_size); } OBJ(pid_stdout) { - char buf[max_user_text]; - - generate_text_internal(buf, max_user_text, *obj->sub, cur); - obj->data.s = buf; print_pid_stdout(obj, p, p_max_size); } OBJ(pid_threads) { - char buf[max_user_text]; - - generate_text_internal(buf, max_user_text, *obj->sub, cur); - obj->data.s = buf; print_pid_threads(obj, p, p_max_size); } OBJ(pid_thread_list) { - char buf[max_user_text]; - - generate_text_internal(buf, max_user_text, *obj->sub, cur); - obj->data.s = buf; print_pid_thread_list(obj, p, p_max_size); } OBJ(pid_time_kernelmode) { - char buf[max_user_text]; - - generate_text_internal(buf, max_user_text, *obj->sub, cur); - obj->data.s = buf; print_pid_time_kernelmode(obj, p, p_max_size); } OBJ(pid_time_usermode) { - char buf[max_user_text]; - - generate_text_internal(buf, max_user_text, *obj->sub, cur); - obj->data.s = buf; print_pid_time_usermode(obj, p, p_max_size); } OBJ(pid_time) { - char buf[max_user_text]; - - generate_text_internal(buf, max_user_text, *obj->sub, cur); - obj->data.s = buf; print_pid_time(obj, p, p_max_size); } OBJ(pid_uid) { - char buf[max_user_text]; - - generate_text_internal(buf, max_user_text, *obj->sub, cur); - obj->data.s = buf; print_pid_uid(obj, p, p_max_size); } OBJ(pid_euid) { - char buf[max_user_text]; - - generate_text_internal(buf, max_user_text, *obj->sub, cur); - obj->data.s = buf; print_pid_euid(obj, p, p_max_size); } OBJ(pid_suid) { - char buf[max_user_text]; - - generate_text_internal(buf, max_user_text, *obj->sub, cur); - obj->data.s = buf; print_pid_suid(obj, p, p_max_size); } OBJ(pid_fsuid) { - char buf[max_user_text]; - - generate_text_internal(buf, max_user_text, *obj->sub, cur); - obj->data.s = buf; print_pid_fsuid(obj, p, p_max_size); } OBJ(pid_gid) { - char buf[max_user_text]; - - generate_text_internal(buf, max_user_text, *obj->sub, cur); - obj->data.s = buf; print_pid_gid(obj, p, p_max_size); } OBJ(pid_egid) { - char buf[max_user_text]; - - generate_text_internal(buf, max_user_text, *obj->sub, cur); - obj->data.s = buf; print_pid_egid(obj, p, p_max_size); } OBJ(pid_sgid) { - char buf[max_user_text]; - - generate_text_internal(buf, max_user_text, *obj->sub, cur); - obj->data.s = buf; print_pid_sgid(obj, p, p_max_size); } OBJ(pid_fsgid) { - char buf[max_user_text]; - - generate_text_internal(buf, max_user_text, *obj->sub, cur); - obj->data.s = buf; print_pid_fsgid(obj, p, p_max_size); } OBJ(pid_read) { - char buf[max_user_text]; - - generate_text_internal(buf, max_user_text, *obj->sub, cur); - obj->data.s = buf; print_pid_read(obj, p, p_max_size); } OBJ(pid_vmpeak) { - char buf[max_user_text]; - - generate_text_internal(buf, max_user_text, *obj->sub, cur); - obj->data.s = buf; print_pid_vmpeak(obj, p, p_max_size); } OBJ(pid_vmsize) { - char buf[max_user_text]; - - generate_text_internal(buf, max_user_text, *obj->sub, cur); - obj->data.s = buf; print_pid_vmsize(obj, p, p_max_size); } OBJ(pid_vmlck) { - char buf[max_user_text]; - - generate_text_internal(buf, max_user_text, *obj->sub, cur); - obj->data.s = buf; print_pid_vmlck(obj, p, p_max_size); } OBJ(pid_vmhwm) { - char buf[max_user_text]; - - generate_text_internal(buf, max_user_text, *obj->sub, cur); - obj->data.s = buf; print_pid_vmhwm(obj, p, p_max_size); } OBJ(pid_vmrss) { - char buf[max_user_text]; - - generate_text_internal(buf, max_user_text, *obj->sub, cur); - obj->data.s = buf; print_pid_vmrss(obj, p, p_max_size); } OBJ(pid_vmdata) { - char buf[max_user_text]; - - generate_text_internal(buf, max_user_text, *obj->sub, cur); - obj->data.s = buf; print_pid_vmdata(obj, p, p_max_size); } OBJ(pid_vmstk) { - char buf[max_user_text]; - - generate_text_internal(buf, max_user_text, *obj->sub, cur); - obj->data.s = buf; print_pid_vmstk(obj, p, p_max_size); } OBJ(pid_vmexe) { - char buf[max_user_text]; - - generate_text_internal(buf, max_user_text, *obj->sub, cur); - obj->data.s = buf; print_pid_vmexe(obj, p, p_max_size); } OBJ(pid_vmlib) { - char buf[max_user_text]; - - generate_text_internal(buf, max_user_text, *obj->sub, cur); - obj->data.s = buf; print_pid_vmlib(obj, p, p_max_size); } OBJ(pid_vmpte) { - char buf[max_user_text]; - - generate_text_internal(buf, max_user_text, *obj->sub, cur); - obj->data.s = buf; print_pid_vmpte(obj, p, p_max_size); } OBJ(pid_write) { - char buf[max_user_text]; - - generate_text_internal(buf, max_user_text, *obj->sub, cur); - obj->data.s = buf; print_pid_write(obj, p, p_max_size); } OBJ(text) { diff --git a/src/core.c b/src/core.c index fa775fbb..bccf6361 100644 --- a/src/core.c +++ b/src/core.c @@ -859,131 +859,89 @@ struct text_object *construct_text_object(const char *s, const char *arg, long scan_cmdline_to_pid_arg(obj, arg, free_at_crash); obj->callbacks.print = &print_cmdline_to_pid; END OBJ_ARG(pid_chroot, 0, "pid_chroot needs a pid as argument") - obj->sub = malloc(sizeof(struct text_object)); - extract_variable_text_internal(obj->sub, arg); + extract_object_args_to_sub(obj, arg); END OBJ_ARG(pid_cmdline, 0, "pid_cmdline needs a pid as argument") - obj->sub = malloc(sizeof(struct text_object)); - extract_variable_text_internal(obj->sub, arg); + extract_object_args_to_sub(obj, arg); END OBJ_ARG(pid_cwd, 0, "pid_cwd needs a pid as argument") - obj->sub = malloc(sizeof(struct text_object)); - extract_variable_text_internal(obj->sub, arg); + extract_object_args_to_sub(obj, arg); END OBJ_ARG(pid_environ, 0, "pid_environ needs arguments") - obj->sub = malloc(sizeof(struct text_object)); - extract_variable_text_internal(obj->sub, arg); + extract_object_args_to_sub(obj, arg); END OBJ_ARG(pid_environ_list, 0, "pid_environ_list needs a pid as argument") - obj->sub = malloc(sizeof(struct text_object)); - extract_variable_text_internal(obj->sub, arg); + extract_object_args_to_sub(obj, arg); END OBJ_ARG(pid_exe, 0, "pid_exe needs a pid as argument") - obj->sub = malloc(sizeof(struct text_object)); - extract_variable_text_internal(obj->sub, arg); + extract_object_args_to_sub(obj, arg); END OBJ_ARG(pid_nice, 0, "pid_nice needs a pid as argument") - obj->sub = malloc(sizeof(struct text_object)); - extract_variable_text_internal(obj->sub, arg); + extract_object_args_to_sub(obj, arg); END OBJ_ARG(pid_openfiles, 0, "pid_openfiles needs a pid as argument") - obj->sub = malloc(sizeof(struct text_object)); - extract_variable_text_internal(obj->sub, arg); + extract_object_args_to_sub(obj, arg); END OBJ_ARG(pid_parent, 0, "pid_parent needs a pid as argument") - obj->sub = malloc(sizeof(struct text_object)); - extract_variable_text_internal(obj->sub, arg); + extract_object_args_to_sub(obj, arg); END OBJ_ARG(pid_priority, 0, "pid_priority needs a pid as argument") - obj->sub = malloc(sizeof(struct text_object)); - extract_variable_text_internal(obj->sub, arg); + extract_object_args_to_sub(obj, arg); END OBJ_ARG(pid_state, 0, "pid_state needs a pid as argument") - obj->sub = malloc(sizeof(struct text_object)); - extract_variable_text_internal(obj->sub, arg); + extract_object_args_to_sub(obj, arg); END OBJ_ARG(pid_state_short, 0, "pid_state_short needs a pid as argument") - obj->sub = malloc(sizeof(struct text_object)); - extract_variable_text_internal(obj->sub, arg); + extract_object_args_to_sub(obj, arg); END OBJ_ARG(pid_stderr, 0, "pid_stderr needs a pid as argument") - obj->sub = malloc(sizeof(struct text_object)); - extract_variable_text_internal(obj->sub, arg); + extract_object_args_to_sub(obj, arg); END OBJ_ARG(pid_stdin, 0, "pid_stdin needs a pid as argument") - obj->sub = malloc(sizeof(struct text_object)); - extract_variable_text_internal(obj->sub, arg); + extract_object_args_to_sub(obj, arg); END OBJ_ARG(pid_stdout, 0, "pid_stdout needs a pid as argument") - obj->sub = malloc(sizeof(struct text_object)); - extract_variable_text_internal(obj->sub, arg); + extract_object_args_to_sub(obj, arg); END OBJ_ARG(pid_threads, 0, "pid_threads needs a pid as argument") - obj->sub = malloc(sizeof(struct text_object)); - extract_variable_text_internal(obj->sub, arg); + extract_object_args_to_sub(obj, arg); END OBJ_ARG(pid_thread_list, 0, "pid_thread_list needs a pid as argument") - obj->sub = malloc(sizeof(struct text_object)); - extract_variable_text_internal(obj->sub, arg); + extract_object_args_to_sub(obj, arg); END OBJ_ARG(pid_time_kernelmode, 0, "pid_time_kernelmode needs a pid as argument") - obj->sub = malloc(sizeof(struct text_object)); - extract_variable_text_internal(obj->sub, arg); + extract_object_args_to_sub(obj, arg); END OBJ_ARG(pid_time_usermode, 0, "pid_time_usermode needs a pid as argument") - obj->sub = malloc(sizeof(struct text_object)); - extract_variable_text_internal(obj->sub, arg); + extract_object_args_to_sub(obj, arg); END OBJ_ARG(pid_time, 0, "pid_time needs a pid as argument") - obj->sub = malloc(sizeof(struct text_object)); - extract_variable_text_internal(obj->sub, arg); + extract_object_args_to_sub(obj, arg); END OBJ_ARG(pid_uid, 0, "pid_uid needs a pid as argument") - obj->sub = malloc(sizeof(struct text_object)); - extract_variable_text_internal(obj->sub, arg); + extract_object_args_to_sub(obj, arg); END OBJ_ARG(pid_euid, 0, "pid_euid needs a pid as argument") - obj->sub = malloc(sizeof(struct text_object)); - extract_variable_text_internal(obj->sub, arg); + extract_object_args_to_sub(obj, arg); END OBJ_ARG(pid_suid, 0, "pid_suid needs a pid as argument") - obj->sub = malloc(sizeof(struct text_object)); - extract_variable_text_internal(obj->sub, arg); + extract_object_args_to_sub(obj, arg); END OBJ_ARG(pid_fsuid, 0, "pid_fsuid needs a pid as argument") - obj->sub = malloc(sizeof(struct text_object)); - extract_variable_text_internal(obj->sub, arg); + extract_object_args_to_sub(obj, arg); END OBJ_ARG(pid_gid, 0, "pid_gid needs a pid as argument") - obj->sub = malloc(sizeof(struct text_object)); - extract_variable_text_internal(obj->sub, arg); + extract_object_args_to_sub(obj, arg); END OBJ_ARG(pid_egid, 0, "pid_egid needs a pid as argument") - obj->sub = malloc(sizeof(struct text_object)); - extract_variable_text_internal(obj->sub, arg); + extract_object_args_to_sub(obj, arg); END OBJ_ARG(pid_sgid, 0, "pid_sgid needs a pid as argument") - obj->sub = malloc(sizeof(struct text_object)); - extract_variable_text_internal(obj->sub, arg); + extract_object_args_to_sub(obj, arg); END OBJ_ARG(pid_fsgid, 0, "pid_fsgid needs a pid as argument") - obj->sub = malloc(sizeof(struct text_object)); - extract_variable_text_internal(obj->sub, arg); + extract_object_args_to_sub(obj, arg); END OBJ_ARG(gid_name, 0, "gid_name needs a gid as argument") - obj->sub = malloc(sizeof(struct text_object)); - extract_variable_text_internal(obj->sub, arg); + extract_object_args_to_sub(obj, arg); END OBJ_ARG(uid_name, 0, "uid_name needs a uid as argument") - obj->sub = malloc(sizeof(struct text_object)); - extract_variable_text_internal(obj->sub, arg); + extract_object_args_to_sub(obj, arg); END OBJ_ARG(pid_read, 0, "pid_read needs a pid as argument") - obj->sub = malloc(sizeof(struct text_object)); - extract_variable_text_internal(obj->sub, arg); + extract_object_args_to_sub(obj, arg); END OBJ_ARG(pid_vmpeak, 0, "pid_vmpeak needs a pid as argument") - obj->sub = malloc(sizeof(struct text_object)); - extract_variable_text_internal(obj->sub, arg); + extract_object_args_to_sub(obj, arg); END OBJ_ARG(pid_vmsize, 0, "pid_vmsize needs a pid as argument") - obj->sub = malloc(sizeof(struct text_object)); - extract_variable_text_internal(obj->sub, arg); + extract_object_args_to_sub(obj, arg); END OBJ_ARG(pid_vmlck, 0, "pid_vmlck needs a pid as argument") - obj->sub = malloc(sizeof(struct text_object)); - extract_variable_text_internal(obj->sub, arg); + extract_object_args_to_sub(obj, arg); END OBJ_ARG(pid_vmhwm, 0, "pid_vmhwm needs a pid as argument") - obj->sub = malloc(sizeof(struct text_object)); - extract_variable_text_internal(obj->sub, arg); + extract_object_args_to_sub(obj, arg); END OBJ_ARG(pid_vmrss, 0, "pid_vmrss needs a pid as argument") - obj->sub = malloc(sizeof(struct text_object)); - extract_variable_text_internal(obj->sub, arg); + extract_object_args_to_sub(obj, arg); END OBJ_ARG(pid_vmdata, 0, "pid_vmdata needs a pid as argument") - obj->sub = malloc(sizeof(struct text_object)); - extract_variable_text_internal(obj->sub, arg); + extract_object_args_to_sub(obj, arg); END OBJ_ARG(pid_vmstk, 0, "pid_vmstk needs a pid as argument") - obj->sub = malloc(sizeof(struct text_object)); - extract_variable_text_internal(obj->sub, arg); + extract_object_args_to_sub(obj, arg); END OBJ_ARG(pid_vmexe, 0, "pid_vmexe needs a pid as argument") - obj->sub = malloc(sizeof(struct text_object)); - extract_variable_text_internal(obj->sub, arg); + extract_object_args_to_sub(obj, arg); END OBJ_ARG(pid_vmlib, 0, "pid_vmlib needs a pid as argument") - obj->sub = malloc(sizeof(struct text_object)); - extract_variable_text_internal(obj->sub, arg); + extract_object_args_to_sub(obj, arg); END OBJ_ARG(pid_vmpte, 0, "pid_vmpte needs a pid as argument") - obj->sub = malloc(sizeof(struct text_object)); - extract_variable_text_internal(obj->sub, arg); + extract_object_args_to_sub(obj, arg); END OBJ_ARG(pid_write, 0, "pid_write needs a pid as argument") - obj->sub = malloc(sizeof(struct text_object)); - extract_variable_text_internal(obj->sub, arg); + extract_object_args_to_sub(obj, arg); END OBJ(processes, &update_total_processes) obj->callbacks.print = &print_processes; #ifdef __linux__ diff --git a/src/proc.c b/src/proc.c index f1f23096..5cb8bb06 100644 --- a/src/proc.c +++ b/src/proc.c @@ -28,8 +28,9 @@ * */ -#include #include "conky.h" +#include "core.h" +#include "logging.h" #include "proc.h" #include #include @@ -102,10 +103,19 @@ int inlist(struct ll_string* front, char* string) { return 0; } +void extract_object_args_to_sub(struct text_object *obj, const char *args) +{ + obj->sub = malloc(sizeof(struct text_object)); + memset(obj->sub, 0, sizeof(struct text_object)); + extract_variable_text_internal(obj->sub, args); +} + void print_pid_chroot(struct text_object *obj, char *p, int p_max_size) { char pathbuf[64]; + char buf[max_user_text]; - snprintf(pathbuf, 64, PROCDIR "/%s/root", obj->data.s); + generate_text_internal(buf, max_user_text, *obj->sub, &info); + snprintf(pathbuf, 64, PROCDIR "/%s/root", buf); pid_readlink(pathbuf, p, p_max_size); } @@ -114,9 +124,12 @@ void print_pid_cmdline(struct text_object *obj, char *p, int p_max_size) char* buf; int i, bytes_read; char pathbuf[64]; + char objbuf[max_user_text]; - if(*(obj->data.s) != 0) { - snprintf(pathbuf, 64, PROCDIR "/%s/cmdline", obj->data.s); + generate_text_internal(objbuf, max_user_text, *obj->sub, &info); + + if(*(objbuf) != 0) { + snprintf(pathbuf, 64, PROCDIR "/%s/cmdline", objbuf); buf = readfile(pathbuf, &bytes_read, 1); if(buf != NULL) { for(i = 0; i < bytes_read-1; i++) { @@ -137,9 +150,10 @@ void print_pid_cwd(struct text_object *obj, char *p, int p_max_size) char buf[p_max_size]; int bytes_read; char pathbuf[64]; + char objbuf[max_user_text]; - snprintf(pathbuf, 64, PROCDIR "/%s/cwd", obj->data.s); - + generate_text_internal(objbuf, max_user_text, *obj->sub, &info); + snprintf(pathbuf, 64, PROCDIR "/%s/cwd", objbuf); bytes_read = readlink(pathbuf, buf, p_max_size); if(bytes_read != -1) { buf[bytes_read] = 0; @@ -154,10 +168,11 @@ void print_pid_environ(struct text_object *obj, char *p, int p_max_size) int i, total_read; pid_t pid; char pathbuf[64]; + char objbuf[max_user_text]; char *buf, *var=strdup(obj->data.s);; - - if(sscanf(obj->data.s, "%d %s", &pid, var) == 2) { + generate_text_internal(objbuf, max_user_text, *obj->sub, &info); + if(sscanf(objbuf, "%d %s", &pid, var) == 2) { for(i = 0; var[i] != 0; i++) { var[i] = toupper(var[i]); } @@ -186,8 +201,10 @@ void print_pid_environ_list(struct text_object *obj, char *p, int p_max_size) int bytes_read, total_read; int i = 0; char pathbuf[64]; + char objbuf[max_user_text]; - snprintf(pathbuf, 64, PROCDIR "/%s/environ", obj->data.s); + generate_text_internal(objbuf, max_user_text, *obj->sub, &info); + snprintf(pathbuf, 64, PROCDIR "/%s/environ", objbuf); buf = readfile(pathbuf, &total_read, 1); if(buf != NULL) { @@ -206,8 +223,10 @@ void print_pid_environ_list(struct text_object *obj, char *p, int p_max_size) void print_pid_exe(struct text_object *obj, char *p, int p_max_size) { char pathbuf[64]; + char objbuf[max_user_text]; - snprintf(pathbuf, 64, PROCDIR "/%s/exe", obj->data.s); + generate_text_internal(objbuf, max_user_text, *obj->sub, &info); + snprintf(pathbuf, 64, PROCDIR "/%s/exe", objbuf); pid_readlink(pathbuf, p, p_max_size); } @@ -216,10 +235,12 @@ void print_pid_nice(struct text_object *obj, char *p, int p_max_size) { int bytes_read; long int nice_value; char pathbuf[64]; + char objbuf[max_user_text]; + generate_text_internal(objbuf, max_user_text, *obj->sub, &info); if(*(obj->data.s) != 0) { - snprintf(pathbuf, 64, PROCDIR "/%s/stat", obj->data.s); + snprintf(pathbuf, 64, PROCDIR "/%s/stat", objbuf); buf = readfile(pathbuf, &bytes_read, 1); if(buf != NULL) { sscanf(buf, "%*d %*s %*c %*d %*d %*d %*d %*d %*u %*u %*u %*u %*u %*u %*u %*d %*d %*d %ld", &nice_value); @@ -238,12 +259,15 @@ void print_pid_openfiles(struct text_object *obj, char *p, int p_max_size) { int length, totallength = 0; struct ll_string* files_front = NULL; struct ll_string* files_back = NULL; + char objbuf[max_user_text]; - dir = opendir(obj->data.s); + generate_text_internal(objbuf, max_user_text, *obj->sub, &info); + + dir = opendir(objbuf); if(dir != NULL) { while ((entry = readdir(dir))) { if(entry->d_name[0] != '.') { - snprintf(buf, p_max_size, "%s/%s", obj->data.s, entry->d_name); + snprintf(buf, p_max_size, "%s/%s", objbuf, entry->d_name); length = readlink(buf, buf, p_max_size); buf[length] = 0; if(inlist(files_front, buf) == 0) { @@ -270,8 +294,10 @@ void print_pid_parent(struct text_object *obj, char *p, int p_max_size) { char *begin, *end, *buf = NULL; int bytes_read; char pathbuf[64]; + char objbuf[max_user_text]; - snprintf(pathbuf, 64, PROCDIR "/%s/status", obj->data.s); + generate_text_internal(objbuf, max_user_text, *obj->sub, &info); + snprintf(pathbuf, 64, PROCDIR "/%s/status", objbuf); buf = readfile(pathbuf, &bytes_read, 1); if(buf != NULL) { @@ -295,10 +321,12 @@ void print_pid_priority(struct text_object *obj, char *p, int p_max_size) { int bytes_read; long int priority; char pathbuf[64]; + char objbuf[max_user_text]; + generate_text_internal(objbuf, max_user_text, *obj->sub, &info); - if(*(obj->data.s) != 0) { - snprintf(pathbuf, 64, PROCDIR "/%s/stat", obj->data.s); + if(*(objbuf) != 0) { + snprintf(pathbuf, 64, PROCDIR "/%s/stat", objbuf); buf = readfile(pathbuf, &bytes_read, 1); if(buf != NULL) { sscanf(buf, "%*d %*s %*c %*d %*d %*d %*d %*d %*u %*u %*u %*u %*u %*u %*u %*d %*d %ld", &priority); @@ -316,8 +344,10 @@ void print_pid_state(struct text_object *obj, char *p, int p_max_size) { char *begin, *end, *buf = NULL; int bytes_read; char pathbuf[64]; + char objbuf[max_user_text]; - snprintf(pathbuf, 64, PROCDIR "/%s/status", obj->data.s); + generate_text_internal(objbuf, max_user_text, *obj->sub, &info); + snprintf(pathbuf, 64, PROCDIR "/%s/status", objbuf); buf = readfile(pathbuf, &bytes_read, 1); if(buf != NULL) { @@ -340,8 +370,11 @@ void print_pid_state_short(struct text_object *obj, char *p, int p_max_size) { char *begin, *buf = NULL; int bytes_read; char pathbuf[64]; + char objbuf[max_user_text]; - snprintf(pathbuf, 64, PROCDIR "/%s/status", obj->data.s); + generate_text_internal(objbuf, max_user_text, *obj->sub, &info); + + snprintf(pathbuf, 64, PROCDIR "/%s/status", objbuf); buf = readfile(pathbuf, &bytes_read, 1); if(buf != NULL) { @@ -357,27 +390,40 @@ void print_pid_state_short(struct text_object *obj, char *p, int p_max_size) { void print_pid_stderr(struct text_object *obj, char *p, int p_max_size) { char pathbuf[64]; + char objbuf[max_user_text]; - snprintf(pathbuf, 64, PROCDIR "/%s/fd/2", obj->data.s); + generate_text_internal(objbuf, max_user_text, *obj->sub, &info); + + snprintf(pathbuf, 64, PROCDIR "/%s/fd/2", objbuf); pid_readlink(pathbuf, p, p_max_size); } void print_pid_stdin(struct text_object *obj, char *p, int p_max_size) { + char objbuf[max_user_text]; char pathbuf[64]; - snprintf(pathbuf, 64, PROCDIR "/%s/fd/0", obj->data.s); + generate_text_internal(objbuf, max_user_text, *obj->sub, &info); + + snprintf(pathbuf, 64, PROCDIR "/%s/fd/0", objbuf); pid_readlink(pathbuf, p, p_max_size); } void print_pid_stdout(struct text_object *obj, char *p, int p_max_size) { char pathbuf[64]; + char objbuf[max_user_text]; - snprintf(pathbuf, 64, PROCDIR "/%s/fd/1", obj->data.s); + generate_text_internal(objbuf, max_user_text, *obj->sub, &info); + + snprintf(pathbuf, 64, PROCDIR "/%s/fd/1", objbuf); pid_readlink(pathbuf, p, p_max_size); } void scan_cmdline_to_pid_arg(struct text_object *obj, const char *arg, void* free_at_crash) { unsigned int i; + char objbuf[max_user_text]; + + /* FIXME */ + generate_text_internal(objbuf, max_user_text, *obj->sub, &info); if(strlen(arg) > 0) { obj->data.s = strdup(arg); @@ -432,8 +478,10 @@ void print_pid_threads(struct text_object *obj, char *p, int p_max_size) { char *begin, *end, *buf = NULL; int bytes_read; char pathbuf[64]; + char objbuf[max_user_text]; - snprintf(pathbuf, 64, PROCDIR "/%s/status", obj->data.s); + generate_text_internal(objbuf, max_user_text, *obj->sub, &info); + snprintf(pathbuf, 64, PROCDIR "/%s/status", objbuf); buf = readfile(pathbuf, &bytes_read, 1); if(buf != NULL) { @@ -457,8 +505,10 @@ void print_pid_thread_list(struct text_object *obj, char *p, int p_max_size) { struct dirent *entry; int totallength = 0; char pathbuf[64]; + char objbuf[max_user_text]; - snprintf(pathbuf, 64, PROCDIR "/%s/task", obj->data.s); + generate_text_internal(objbuf, max_user_text, *obj->sub, &info); + snprintf(pathbuf, 64, PROCDIR "/%s/task", objbuf); dir = opendir(pathbuf); if(dir != NULL) { @@ -480,9 +530,12 @@ void print_pid_time_kernelmode(struct text_object *obj, char *p, int p_max_size) int bytes_read; unsigned long int umtime; char pathbuf[64]; + char objbuf[max_user_text]; - if(*(obj->data.s) != 0) { - snprintf(pathbuf, 64, PROCDIR "/%s/stat", obj->data.s); + generate_text_internal(objbuf, max_user_text, *obj->sub, &info); + + if(*(objbuf) != 0) { + snprintf(pathbuf, 64, PROCDIR "/%s/stat", objbuf); buf = readfile(pathbuf, &bytes_read, 1); if(buf != NULL) { sscanf(buf, "%*d %*s %*c %*d %*d %*d %*d %*d %*u %*u %*u %*u %*u %lu", &umtime); @@ -499,9 +552,12 @@ void print_pid_time_usermode(struct text_object *obj, char *p, int p_max_size) { int bytes_read; unsigned long int kmtime; char pathbuf[64]; + char objbuf[max_user_text]; - if(*(obj->data.s) != 0) { - snprintf(pathbuf, 64, PROCDIR "/%s/stat", obj->data.s); + generate_text_internal(objbuf, max_user_text, *obj->sub, &info); + + if(*(objbuf) != 0) { + snprintf(pathbuf, 64, PROCDIR "/%s/stat", objbuf); buf = readfile(pathbuf, &bytes_read, 1); if(buf != NULL) { sscanf(buf, "%*d %*s %*c %*d %*d %*d %*d %*d %*u %*u %*u %*u %*u %*u %lu", &kmtime); @@ -518,9 +574,12 @@ void print_pid_time(struct text_object *obj, char *p, int p_max_size) { int bytes_read; unsigned long int umtime, kmtime; char pathbuf[64]; + char objbuf[max_user_text]; - if(*(obj->data.s) != 0) { - snprintf(pathbuf, 64, PROCDIR "/%s/stat", obj->data.s); + generate_text_internal(objbuf, max_user_text, *obj->sub, &info); + + if(*(objbuf) != 0) { + snprintf(pathbuf, 64, PROCDIR "/%s/stat", objbuf); buf = readfile(pathbuf, &bytes_read, 1); if(buf != NULL) { sscanf(buf, "%*d %*s %*c %*d %*d %*d %*d %*d %*u %*u %*u %*u %*u %lu %lu", &umtime, &kmtime); @@ -538,8 +597,11 @@ void print_pid_uid(struct text_object *obj, char *p, int p_max_size) { char *begin, *end, *buf = NULL; int bytes_read; char pathbuf[64]; + char objbuf[max_user_text]; + + generate_text_internal(objbuf, max_user_text, *obj->sub, &info); + snprintf(pathbuf, 64, PROCDIR "/%s/status", objbuf); - snprintf(pathbuf, 64, PROCDIR "/%s/status", obj->data.s); buf = readfile(pathbuf, &bytes_read, 1); if(buf != NULL) { begin = strstr(buf, UID_ENTRY); @@ -562,8 +624,11 @@ void print_pid_euid(struct text_object *obj, char *p, int p_max_size) { char *begin, *end, *buf = NULL; int bytes_read; char pathbuf[64]; + char objbuf[max_user_text]; + + generate_text_internal(objbuf, max_user_text, *obj->sub, &info); + snprintf(pathbuf, 64, PROCDIR "/%s/status", objbuf); - snprintf(pathbuf, 64, PROCDIR "/%s/status", obj->data.s); buf = readfile(pathbuf, &bytes_read, 1); if(buf != NULL) { begin = strstr(buf, UID_ENTRY); @@ -587,8 +652,11 @@ void print_pid_suid(struct text_object *obj, char *p, int p_max_size) { char *begin, *end, *buf = NULL; int bytes_read; char pathbuf[64]; + char objbuf[max_user_text]; + + generate_text_internal(objbuf, max_user_text, *obj->sub, &info); + snprintf(pathbuf, 64, PROCDIR "/%s/status", objbuf); - snprintf(pathbuf, 64, PROCDIR "/%s/status", obj->data.s); buf = readfile(pathbuf, &bytes_read, 1); if(buf != NULL) { begin = strstr(buf, UID_ENTRY); @@ -613,8 +681,11 @@ void print_pid_fsuid(struct text_object *obj, char *p, int p_max_size) { char *begin, *end, *buf = NULL; int bytes_read; char pathbuf[64]; + char objbuf[max_user_text]; + + generate_text_internal(objbuf, max_user_text, *obj->sub, &info); + snprintf(pathbuf, 64, PROCDIR "/%s/status", objbuf); - snprintf(pathbuf, 64, PROCDIR "/%s/status", obj->data.s); buf = readfile(pathbuf, &bytes_read, 1); if(buf != NULL) { begin = strstr(buf, UID_ENTRY); @@ -641,8 +712,11 @@ void print_pid_gid(struct text_object *obj, char *p, int p_max_size) { char *begin, *end, *buf = NULL; int bytes_read; char pathbuf[64]; + char objbuf[max_user_text]; + + generate_text_internal(objbuf, max_user_text, *obj->sub, &info); + snprintf(pathbuf, 64, PROCDIR "/%s/status", objbuf); - snprintf(pathbuf, 64, PROCDIR "/%s/status", obj->data.s); buf = readfile(pathbuf, &bytes_read, 1); if(buf != NULL) { begin = strstr(buf, GID_ENTRY); @@ -665,8 +739,11 @@ void print_pid_egid(struct text_object *obj, char *p, int p_max_size) { char *begin, *end, *buf = NULL; int bytes_read; char pathbuf[64]; + char objbuf[max_user_text]; + + generate_text_internal(objbuf, max_user_text, *obj->sub, &info); + snprintf(pathbuf, 64, PROCDIR "/%s/status", objbuf); - snprintf(pathbuf, 64, PROCDIR "/%s/status", obj->data.s); buf = readfile(pathbuf, &bytes_read, 1); if(buf != NULL) { begin = strstr(buf, GID_ENTRY); @@ -690,8 +767,11 @@ void print_pid_sgid(struct text_object *obj, char *p, int p_max_size) { char *begin, *end, *buf = NULL; int bytes_read; char pathbuf[64]; + char objbuf[max_user_text]; + + generate_text_internal(objbuf, max_user_text, *obj->sub, &info); + snprintf(pathbuf, 64, PROCDIR "/%s/status", objbuf); - snprintf(pathbuf, 64, PROCDIR "/%s/status", obj->data.s); buf = readfile(pathbuf, &bytes_read, 1); if(buf != NULL) { begin = strstr(buf, GID_ENTRY); @@ -716,8 +796,11 @@ void print_pid_fsgid(struct text_object *obj, char *p, int p_max_size) { char *begin, *end, *buf = NULL; int bytes_read; char pathbuf[64]; + char objbuf[max_user_text]; + + generate_text_internal(objbuf, max_user_text, *obj->sub, &info); + snprintf(pathbuf, 64, PROCDIR "/%s/status", objbuf); - snprintf(pathbuf, 64, PROCDIR "/%s/status", obj->data.s); buf = readfile(pathbuf, &bytes_read, 1); if(buf != NULL) { begin = strstr(buf, GID_ENTRY); @@ -738,12 +821,15 @@ void print_pid_fsgid(struct text_object *obj, char *p, int p_max_size) { } } -void internal_print_pid_vm(char* pid, char *p, int p_max_size, const char* entry, const char* errorstring) { +void internal_print_pid_vm(struct text_object *obj, char *p, int p_max_size, const char* entry, const char* errorstring) { char *begin, *end, *buf = NULL; int bytes_read; char pathbuf[64]; + char objbuf[max_user_text]; + + generate_text_internal(objbuf, max_user_text, *obj->sub, &info); + snprintf(pathbuf, 64, PROCDIR "/%s/status", objbuf); - snprintf(pathbuf, 64, PROCDIR "/%s/status", pid); buf = readfile(pathbuf, &bytes_read, 1); if(buf != NULL) { begin = strstr(buf, entry); @@ -765,43 +851,43 @@ void internal_print_pid_vm(char* pid, char *p, int p_max_size, const char* entry } 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'"); + internal_print_pid_vm(obj, 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'"); + internal_print_pid_vm(obj, 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'"); + internal_print_pid_vm(obj, 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'"); + internal_print_pid_vm(obj, 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'"); + internal_print_pid_vm(obj, 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'"); + internal_print_pid_vm(obj, 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'"); + internal_print_pid_vm(obj, 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'"); + internal_print_pid_vm(obj, 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'"); + internal_print_pid_vm(obj, 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'"); + internal_print_pid_vm(obj, p, p_max_size, "VmPTE:\t", "Can't find the process page table entries size in '%s'"); } #define READ_ENTRY "read_bytes: " @@ -810,8 +896,11 @@ void print_pid_read(struct text_object *obj, char *p, int p_max_size) { char *begin, *end, *buf = NULL; int bytes_read; char pathbuf[64]; + char objbuf[max_user_text]; + + generate_text_internal(objbuf, max_user_text, *obj->sub, &info); + snprintf(pathbuf, 64, PROCDIR "/%s/io", objbuf); - snprintf(pathbuf, 64, PROCDIR "/%s/io", obj->data.s); buf = readfile(pathbuf, &bytes_read, 1); if(buf != NULL) { begin = strstr(buf, READ_ENTRY); @@ -834,8 +923,11 @@ void print_pid_write(struct text_object *obj, char *p, int p_max_size) { char *begin, *end, *buf = NULL; int bytes_read; char pathbuf[64]; + char objbuf[max_user_text]; + + generate_text_internal(objbuf, max_user_text, *obj->sub, &info); + snprintf(pathbuf, 64, PROCDIR "/%s/io", objbuf); - snprintf(pathbuf, 64, PROCDIR "/%s/io", obj->data.s); buf = readfile(pathbuf, &bytes_read, 1); if(buf != NULL) { begin = strstr(buf, WRITE_ENTRY); diff --git a/src/proc.h b/src/proc.h index 9edc9c54..e600c37a 100644 --- a/src/proc.h +++ b/src/proc.h @@ -32,6 +32,9 @@ #define READERR "Can't read '%s'" #define READSIZE 128 +/* XXX: this should go global */ +void extract_object_args_to_sub(struct text_object *, const char *); + void print_pid_chroot(struct text_object *obj, char *p, int p_max_size); void print_pid_cmdline(struct text_object *obj, char *p, int p_max_size); void print_pid_cwd(struct text_object *obj, char *p, int p_max_size);