summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenoît Dejean <bdejean@src.gnome.org>2007-05-13 14:28:50 +0000
committerBenoît Dejean <bdejean@src.gnome.org>2007-05-13 14:28:50 +0000
commiteee0cad2b6042fa9da7ff683ad42ed310633f80f (patch)
treeba23f08655a9962c07d6ca12fbf6c09ab076bc6f
parent785b30aeb699dfa5d0b65b6f18233e562c0546b7 (diff)
downloadlibgtop-eee0cad2b6042fa9da7ff683ad42ed310633f80f.tar.gz
Added missing files
svn path=/trunk/; revision=2580
-rw-r--r--examples/wd.c31
-rw-r--r--include/glibtop/procwd.h69
-rw-r--r--lib/libgtop.sym130
-rw-r--r--sysdeps/linux/procwd.c98
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);
+}
+