From 3454e0a32bbe59b36e396fa7a7c4aef869071d6a Mon Sep 17 00:00:00 2001 From: Johannes Zellner Date: Wed, 23 Aug 2006 18:08:08 +0000 Subject: [PATCH] * some files renamed * few small security changes (Old svn revision: 1915) --- aclocal.m4 | 25 ++++++ src/Makefile.am | 2 +- src/functions.c | 2 +- src/functions.h | 8 +- src/interface.c | 20 ++--- src/interface.h | 1 + src/xfce-taskmanager-linux.c | 152 +++++++++++++++++++++++++++++++++++ src/xfce-taskmanager-linux.h | 17 ++++ 8 files changed, 214 insertions(+), 13 deletions(-) create mode 100755 src/xfce-taskmanager-linux.c create mode 100755 src/xfce-taskmanager-linux.h diff --git a/aclocal.m4 b/aclocal.m4 index da9ca74..1a5ffdd 100644 --- a/aclocal.m4 +++ b/aclocal.m4 @@ -592,6 +592,31 @@ AU_ALIAS([AC_PROG_INTLTOOL], [IT_PROG_INTLTOOL]) # AC_DEFUN([AC_PROG_INTLTOOL], ...) +# isc-posix.m4 serial 2 (gettext-0.11.2) +dnl Copyright (C) 1995-2002 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +# This file is not needed with autoconf-2.53 and newer. Remove it in 2005. + +# This test replaces the one in autoconf. +# Currently this macro should have the same name as the autoconf macro +# because gettext's gettext.m4 (distributed in the automake package) +# still uses it. Otherwise, the use in gettext.m4 makes autoheader +# give these diagnostics: +# configure.in:556: AC_TRY_COMPILE was called before AC_ISC_POSIX +# configure.in:556: AC_TRY_RUN was called before AC_ISC_POSIX + +undefine([AC_ISC_POSIX]) + +AC_DEFUN([AC_ISC_POSIX], + [ + dnl This test replaces the obsolescent AC_ISC_POSIX kludge. + AC_CHECK_LIB(cposix, strerror, [LIBS="$LIBS -lcposix"]) + ] +) + # libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- # serial 48 AC_PROG_LIBTOOL diff --git a/src/Makefile.am b/src/Makefile.am index 89ca732..b2ecf4a 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -9,7 +9,7 @@ xfce4_taskmanager_SOURCES = \ callbacks.c callbacks.h \ functions.c functions.h \ interface.c interface.h \ - linux.c linux.h \ + xfce-taskmanager-linux.c xfce-taskmanager-linux.h \ types.h xfce4_taskmanager_CFLAGS = \ diff --git a/src/functions.c b/src/functions.c index dfcaa39..ff7ed15 100644 --- a/src/functions.c +++ b/src/functions.c @@ -101,7 +101,7 @@ gboolean refresh_task_list(void) } g_array_free(new_task_list, TRUE); - + return TRUE; } diff --git a/src/functions.h b/src/functions.h index f698959..9ef4404 100644 --- a/src/functions.h +++ b/src/functions.h @@ -28,11 +28,17 @@ #include #include #include +#include +#include #include #include "types.h" -#include "linux.h" +#include "interface.h" + +#ifdef LINUX +#include "xfce-taskmanager-linux.h" +#endif #define PROC_DIR_1 "/compat/linux/proc" #define PROC_DIR_2 "/emul/linux/proc" diff --git a/src/interface.c b/src/interface.c index a934e70..9b2322d 100644 --- a/src/interface.c +++ b/src/interface.c @@ -283,14 +283,14 @@ void fill_list_item(gint i, GtkTreeIter *iter) gtk_tree_store_set(GTK_TREE_STORE(list_store), iter, COLUMN_UNAME, uname, -1); gtk_tree_store_set(GTK_TREE_STORE(list_store), iter, COLUMN_TIME, time, -1); - free(pid); - free(ppid); - free(state); - free(size); - free(rss); - free(name); - free(uname); - free(time); + g_free(pid); + g_free(ppid); + g_free(state); + g_free(size); + g_free(rss); + g_free(name); + g_free(uname); + g_free(time); } } @@ -355,12 +355,12 @@ void remove_list_item(gint pid) if(pid == atoi(str_data)) { - free(str_data); + g_free(str_data); gtk_tree_store_remove(GTK_TREE_STORE(list_store), &iter); break; } - free(str_data); + g_free(str_data); valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(list_store), &iter); } } diff --git a/src/interface.h b/src/interface.h index a5ca605..5a3c8fe 100644 --- a/src/interface.h +++ b/src/interface.h @@ -30,6 +30,7 @@ #include #include #include +#include #include #include diff --git a/src/xfce-taskmanager-linux.c b/src/xfce-taskmanager-linux.c new file mode 100755 index 0000000..8ce9dff --- /dev/null +++ b/src/xfce-taskmanager-linux.c @@ -0,0 +1,152 @@ +#include "xfce-taskmanager-linux.h" + +struct task get_task_details(gint pid) +{ + FILE *task_file; + FILE *cmdline_file; + gchar dummy[255]; + gchar buffer_status[255]; + struct task task; + struct passwd *passwdp; + struct stat status; + gchar filename[255]; + gchar cmdline_filename[255]; + + sprintf(filename, "/proc/%i/stat", pid); + sprintf(cmdline_filename, "/proc/%i/cmdline", pid); + + stat(filename, &status); + + task.pid = -1; + task.checked = FALSE; + + if((task_file = fopen(filename,"r")) != NULL) + { + while(fgets(buffer_status, sizeof(buffer_status), task_file) != NULL) + { + gint utime = 0; + gint stime = 0; + + sscanf(buffer_status, "%i (%255s %1s %i %i %i %i %i %255s %255s %255s %255s %255s %i %i %i %i %i %i %i %i %i %i %i %255s %255s %255s %i %255s %255s %255s %255s %255s %255s %255s %255s %255s %255s %i %255s %255s", + &task.pid, // processid + &task.name, // processname + &task.state, // processstate + &task.ppid, // parentid + &dummy, // processs groupid + + &dummy, // session id + &dummy, // tty id + &dummy, // tpgid: The process group ID of the process running on tty of the process + &dummy, // flags + &dummy, // minflt minor faults the process has maid + + &dummy, // cminflt + &dummy, // majflt + &dummy, // cmajflt + &utime, // utime the number of jiffies that this process has scheduled in user mode + &stime, // stime " kernel mode + + &dummy, // cutime " waited for children in user + &dummy, // cstime " kernel mode + &dummy, // priority (nice value + fifteen) + &dummy, // nice range from 19 to -19 + &dummy, // hardcoded 0 + + &dummy, // itrealvalue time in jiffies to next SIGALRM send to this process + &dummy, // starttime jiffies the process startet after system boot + &task.size, // vsize in bytes + &task.rss, // rss + &dummy, // rlim limit in bytes for rss + + &dummy, // startcode + &dummy, // endcode + &dummy, // startstack + &dummy, // kstkesp value of esp (stack pointer) + &dummy, // kstkeip value of EIP (instruction pointer) + + &dummy, // signal. bitmap of pending signals + &dummy, // blocked: bitmap of blocked signals + &dummy, // sigignore: bitmap of ignored signals + &dummy, // sigcatch: bitmap of catched signals + &dummy, // wchan + + &dummy, // nswap + &dummy, // cnswap + &dummy, // exit_signal + &dummy, // CPU number last executed on + &dummy, + + &dummy + ); + task.time = stime + utime; + task.old_time = task.time; + task.time_percentage = 0; + } + task.uid = status.st_uid; + passwdp = getpwuid(task.uid); + if(passwdp != NULL && passwdp->pw_name != NULL) + g_strlcpy(task.uname, passwdp->pw_name, sizeof task.uname); + } + + + if(task_file != NULL) + fclose(task_file); + + if((cmdline_file = fopen(cmdline_filename,"r")) != NULL) + { + gchar dummy[255]; + strcpy(&dummy, ""); + fscanf(cmdline_file, "%255s", &dummy); + if(strcmp(dummy, "") != 0) + { + if(g_strrstr(dummy,"/") != NULL) + g_strlcpy(task.name, g_strrstr(dummy,"/")+1, 255); + else + g_strlcpy(task.name, dummy, 255); + + // workaround for cmd-line entries with leading "-" + if(g_str_has_prefix(task.name, "-")) + sscanf(task.name, "-%255s", task.name); + } + } + + if(cmdline_file != NULL) + fclose(cmdline_file); + + if(g_str_has_suffix(task.name, ")")) + *g_strrstr(task.name, ")") = '\0'; + + return task; +} + +GArray *get_task_list() +{ + DIR *dir; + struct dirent *dir_entry; + GArray *task_list; + + task_list = g_array_new (FALSE, FALSE, sizeof (struct task)); + + if((dir = opendir("/proc/")) == NULL) + { + fprintf(stderr, "Error: couldn't load the /proc directory\n"); + return NULL; + } + + gint count = 0; + + while((dir_entry = readdir(dir)) != NULL) + { + if(atoi(dir_entry->d_name) != 0) + { + struct task task = get_task_details(atoi(dir_entry->d_name)); + if(task.pid != -1) + g_array_append_val(task_list, task); + } + count++; + } + + closedir(dir); + + return task_list; +} diff --git a/src/xfce-taskmanager-linux.h b/src/xfce-taskmanager-linux.h new file mode 100755 index 0000000..9ea6234 --- /dev/null +++ b/src/xfce-taskmanager-linux.h @@ -0,0 +1,17 @@ +#ifndef LINUX_H +#define LINUX_H + +#include +#include +#include +#include +#include +#include +#include + +#include "types.h" + +struct task get_task_details(gint pid); +GArray *get_task_list(); + +#endif