diff options
author | Benoît Dejean <bdejean@src.gnome.org> | 2007-05-13 14:28:50 +0000 |
---|---|---|
committer | Benoît Dejean <bdejean@src.gnome.org> | 2007-05-13 14:28:50 +0000 |
commit | eee0cad2b6042fa9da7ff683ad42ed310633f80f (patch) | |
tree | ba23f08655a9962c07d6ca12fbf6c09ab076bc6f | |
parent | 785b30aeb699dfa5d0b65b6f18233e562c0546b7 (diff) | |
download | libgtop-eee0cad2b6042fa9da7ff683ad42ed310633f80f.tar.gz |
Added missing files
svn path=/trunk/; revision=2580
-rw-r--r-- | examples/wd.c | 31 | ||||
-rw-r--r-- | include/glibtop/procwd.h | 69 | ||||
-rw-r--r-- | lib/libgtop.sym | 130 | ||||
-rw-r--r-- | sysdeps/linux/procwd.c | 98 |
4 files changed, 328 insertions, 0 deletions
diff --git a/examples/wd.c b/examples/wd.c new file mode 100644 index 00000000..4cb51a3b --- /dev/null +++ b/examples/wd.c @@ -0,0 +1,31 @@ +#include <glibtop.h> +#include <glibtop/procwd.h> + +#include <glib.h> +#include <unistd.h> + +int main(int argc, char **argv) +{ + pid_t pid; + glibtop_proc_wd buf; + char **dirs, **dir; + + if (argc < 2 || !(pid = strtoul(argv[1], NULL, 0))) + pid = getpid(); + + dirs = glibtop_get_proc_wd(&buf, pid); + + g_print("Process %u:\n" + " - root: '%s'\n" + " - exe: '%s'\n" + " - working directories:\n", + (unsigned)pid, buf.root, buf.exe); + + for (dir = dirs; *dir; ++dir) + g_print(" - '%s'\n", *dir); + + g_strfreev(dirs); + + return 0; +} + diff --git a/include/glibtop/procwd.h b/include/glibtop/procwd.h new file mode 100644 index 00000000..9da26059 --- /dev/null +++ b/include/glibtop/procwd.h @@ -0,0 +1,69 @@ +/* Copyright (C) 2007 Benoît Dejean + This file is part of LibGTop 2. + + LibGTop is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, + or (at your option) any later version. + + LibGTop is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with LibGTop; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. +*/ + +#ifndef __GLIBTOP_PROCWD_H__ +#define __GLIBTOP_PROCWD_H__ + +#include <glibtop.h> +#include <glibtop/global.h> + +G_BEGIN_DECLS + +typedef struct _glibtop_proc_wd glibtop_proc_wd; + +#define GLIBTOP_PROC_WD_NUMBER 0 +#define GLIBTOP_PROC_WD_ROOT 1 +#define GLIBTOP_PROC_WD_EXE 2 +#define GLIBTOP_PROC_WD_MAX 3 + +#define GLIBTOP_PROC_WD_ROOT_LEN 215 +#define GLIBTOP_PROC_WD_EXE_LEN 215 + +struct _glibtop_proc_wd +{ + guint64 flags; + guint32 number; + char root[GLIBTOP_PROC_WD_ROOT_LEN+1]; + char exe[GLIBTOP_PROC_WD_EXE_LEN+1]; +}; + + +char ** glibtop_get_proc_wd(glibtop_proc_wd *buf, pid_t pid); +char ** glibtop_get_proc_wd_l(glibtop *server, glibtop_proc_wd *buf, pid_t pid); + + +#if GLIBTOP_SUID_PROC_WD + +#define glibtop_get_proc_wd_r glibtop_get_proc_wd_p +void _glibtop_init_proc_wd_p(glibtop *server); +char ** glibtop_get_proc_wd_p(glibtop *server, glibtop_proc_wd *buf, pid_t pid); + +#else + +#define glibtop_get_proc_wd_r glibtop_get_proc_wd_s +void _glibtop_init_proc_wd_s(glibtop *server); +char ** glibtop_get_proc_wd_s(glibtop *server, glibtop_proc_wd *buf, pid_t pid); + +#endif + + + +G_END_DECLS + +#endif diff --git a/lib/libgtop.sym b/lib/libgtop.sym new file mode 100644 index 00000000..9ba1f337 --- /dev/null +++ b/lib/libgtop.sym @@ -0,0 +1,130 @@ +glibtop_call_l +glibtop_call_p +glibtop_close +glibtop_close_p +glibtop_close_r +glibtop_close_s +glibtop_get_cpu +glibtop_get_cpu_l +glibtop_get_cpu_p +glibtop_get_cpu_s +glibtop_get_fsusage +glibtop_get_fsusage_l +glibtop_get_fsusage_p +glibtop_get_fsusage_s +glibtop_get_loadavg +glibtop_get_loadavg_l +glibtop_get_loadavg_p +glibtop_get_loadavg_s +glibtop_get_mem +glibtop_get_mem_l +glibtop_get_mem_p +glibtop_get_mem_s +glibtop_get_mountlist +glibtop_get_mountlist_l +glibtop_get_mountlist_p +glibtop_get_mountlist_s +glibtop_get_msg_limits +glibtop_get_msg_limits_l +glibtop_get_msg_limits_p +glibtop_get_msg_limits_s +glibtop_get_netlist +glibtop_get_netlist_l +glibtop_get_netlist_p +glibtop_get_netlist_s +glibtop_get_netload +glibtop_get_netload_l +glibtop_get_netload_p +glibtop_get_netload_s +glibtop_get_parameter_l +glibtop_get_parameter_p +glibtop_get_ppp +glibtop_get_ppp_l +glibtop_get_ppp_p +glibtop_get_ppp_s +glibtop_get_proc_args +glibtop_get_proc_args_l +glibtop_get_proc_args_p +glibtop_get_proc_args_s +glibtop_get_proc_argv +glibtop_get_proc_argv_l +glibtop_get_proc_argv_p +glibtop_get_proc_kernel +glibtop_get_proc_kernel_l +glibtop_get_proc_kernel_p +glibtop_get_proc_kernel_s +glibtop_get_proclist +glibtop_get_proclist_l +glibtop_get_proclist_p +glibtop_get_proclist_s +glibtop_get_proc_map +glibtop_get_proc_map_l +glibtop_get_proc_map_p +glibtop_get_proc_map_s +glibtop_get_proc_mem +glibtop_get_proc_mem_l +glibtop_get_proc_mem_p +glibtop_get_proc_mem_s +glibtop_get_proc_open_files +glibtop_get_proc_open_files_l +glibtop_get_proc_open_files_p +glibtop_get_proc_open_files_s +glibtop_get_proc_segment +glibtop_get_proc_segment_l +glibtop_get_proc_segment_p +glibtop_get_proc_segment_s +glibtop_get_proc_signal +glibtop_get_proc_signal_l +glibtop_get_proc_signal_p +glibtop_get_proc_signal_s +glibtop_get_proc_state +glibtop_get_proc_state_l +glibtop_get_proc_state_p +glibtop_get_proc_state_s +glibtop_get_proc_time +glibtop_get_proc_time_l +glibtop_get_proc_time_p +glibtop_get_proc_time_s +glibtop_get_proc_uid +glibtop_get_proc_uid_l +glibtop_get_proc_uid_p +glibtop_get_proc_uid_s +glibtop_get_proc_wd +glibtop_get_proc_wd_l +glibtop_get_proc_wd_p +glibtop_get_proc_wd_s +glibtop_get_sem_limits +glibtop_get_sem_limits_l +glibtop_get_sem_limits_p +glibtop_get_sem_limits_s +glibtop_get_shm_limits +glibtop_get_shm_limits_l +glibtop_get_shm_limits_p +glibtop_get_shm_limits_s +glibtop_get_swap +glibtop_get_swap_l +glibtop_get_swap_p +glibtop_get_swap_s +glibtop_get_sysdeps +glibtop_get_sysdeps_r +glibtop_get_sysinfo +glibtop_get_sysinfo_p +glibtop_get_sysinfo_s +glibtop_get_uptime +glibtop_get_uptime_l +glibtop_get_uptime_p +glibtop_get_uptime_s +glibtop_global_server +glibtop_init +glibtop_init_p +glibtop_init_r +glibtop_init_s +glibtop_internet_addr +glibtop_make_connection +glibtop_open_l +glibtop_open_p +glibtop_open_s +glibtop_server_features +glibtop_set_parameter_l +glibtop_set_parameter_p +glibtop_sys_siglist diff --git a/sysdeps/linux/procwd.c b/sysdeps/linux/procwd.c new file mode 100644 index 00000000..71990015 --- /dev/null +++ b/sysdeps/linux/procwd.c @@ -0,0 +1,98 @@ +/* Copyright (C) 2007 Benoît Dejean + This file is part of LibGTop 2. + + LibGTop is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, + or (at your option) any later version. + + LibGTop is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with LibGTop; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. +*/ + +#include <config.h> +#include <glibtop/procwd.h> +#include <glibtop/error.h> + +#include <glibtop_private.h> + +#include <unistd.h> +#include <dirent.h> +#include <sys/types.h> + + +void +_glibtop_init_proc_wd_s(glibtop *server) +{ + server->sysdeps.proc_wd = + (1 << GLIBTOP_PROC_WD_EXE) + + (1 << GLIBTOP_PROC_WD_ROOT) + + (1 << GLIBTOP_PROC_WD_NUMBER); + +} + +static gboolean is_in(GPtrArray *array, const char *str) +{ + guint i; + + for (i = 0; i != array->len; ++i) { + if (strcmp(g_ptr_array_index(array, i), str) == 0) + return TRUE; + } + + return FALSE; +} + + +char** +glibtop_get_proc_wd_s(glibtop *server, glibtop_proc_wd *buf, pid_t pid) +{ + GPtrArray *dirs; + char path[80]; + char dir[256]; + DIR *task; + + glibtop_init_s(&server, GLIBTOP_SYSDEPS_PROC_WD, 0); + + memset(buf, 0, sizeof(glibtop_proc_wd)); + + g_snprintf(path, sizeof path, "/proc/%u/root", pid); + if (safe_readlink(path, buf->root, sizeof buf->root)) + buf->flags |= (1 << GLIBTOP_PROC_WD_ROOT); + + g_snprintf(path, sizeof path, "/proc/%u/exe", pid); + if (safe_readlink(path, buf->exe, sizeof buf->exe)) + buf->flags |= (1 << GLIBTOP_PROC_WD_EXE); + + dirs = g_ptr_array_sized_new(2); + + g_snprintf(path, sizeof path, "/proc/%u/cwd", pid); + if (safe_readlink(path, dir, sizeof dir)) + g_ptr_array_add(dirs, g_strdup(dir)); + + g_snprintf(path, sizeof path, "/proc/%u/task", pid); + if ((task = opendir(path)) != NULL) { + struct dirent *sub; + while ((sub = readdir(task)) != NULL) { + g_snprintf(path, sizeof path, "/proc/%u/task/%s/cwd", pid, sub->d_name); + if (safe_readlink(path, dir, sizeof dir) && !is_in(dirs, dir)) + g_ptr_array_add(dirs, g_strdup(dir)); + } + closedir(task); + } + + buf->number = dirs->len; + buf->flags |= (1 << GLIBTOP_PROC_WD_NUMBER); + + g_ptr_array_add(dirs, NULL); + + return (char**) g_ptr_array_free(dirs, FALSE); +} + |