summaryrefslogtreecommitdiffstats
path: root/devel/libgtop/files/patch-sysdeps_freebsd_procwd.c
diff options
context:
space:
mode:
Diffstat (limited to 'devel/libgtop/files/patch-sysdeps_freebsd_procwd.c')
-rw-r--r--devel/libgtop/files/patch-sysdeps_freebsd_procwd.c95
1 files changed, 90 insertions, 5 deletions
diff --git a/devel/libgtop/files/patch-sysdeps_freebsd_procwd.c b/devel/libgtop/files/patch-sysdeps_freebsd_procwd.c
index 0e03ce2f6..4b97a149e 100644
--- a/devel/libgtop/files/patch-sysdeps_freebsd_procwd.c
+++ b/devel/libgtop/files/patch-sysdeps_freebsd_procwd.c
@@ -1,7 +1,7 @@
---- sysdeps/freebsd/procwd.c.orig Fri Jun 8 19:55:15 2007
-+++ sysdeps/freebsd/procwd.c Fri Jun 8 19:59:35 2007
-@@ -0,0 +1,37 @@
-+/* Copyright (C) 2007 BenoƮt Dejean
+--- sysdeps/freebsd/procwd.c.orig 2007-06-26 00:49:06.000000000 -0400
++++ sysdeps/freebsd/procwd.c 2007-06-27 13:57:10.000000000 -0400
+@@ -0,0 +1,122 @@
++/* Copyright (C) 2007 Joe Marcus Clarke
+ This file is part of LibGTop 2.
+
+ LibGTop is free software; you can redistribute it and/or modify it
@@ -24,7 +24,16 @@
+#include <glibtop/procwd.h>
+#include <glibtop/error.h>
+
-+static const unsigned long _glibtop_sysdeps_proc_wd = 0;
++#include <glibtop_private.h>
++
++#include <sys/types.h>
++#include <sys/param.h>
++#include <string.h>
++
++static const unsigned long _glibtop_sysdeps_proc_wd =
++(1 << GLIBTOP_PROC_WD_EXE) |
++(1 << GLIBTOP_PROC_WD_ROOT) |
++(1 << GLIBTOP_PROC_WD_NUMBER);
+
+void
+_glibtop_init_proc_wd_s(glibtop *server)
@@ -32,9 +41,85 @@
+ server->sysdeps.proc_wd = _glibtop_sysdeps_proc_wd;
+}
+
++static GPtrArray *
++parse_output(const char *output, glibtop_proc_wd *buf)
++{
++ GPtrArray *dirs;
++ char **lines;
++ gboolean nextwd = FALSE;
++ gboolean nextrtd = FALSE;
++ gboolean havertd = FALSE;
++ guint i;
++ guint len;
++
++ dirs = g_ptr_array_sized_new(1);
++
++ lines = g_strsplit(output, "\n", 0);
++ len = g_strv_length(lines);
++
++ for (i = 0; i < len && lines[i]; i++) {
++
++ if (strlen(lines[i]) < 2)
++ continue;
++
++ if (!g_str_has_prefix(lines[i], "f") &&
++ !g_str_has_prefix(lines[i], "n"))
++ continue;
++
++ if (!strcmp(lines[i], "fcwd")) {
++ nextwd = TRUE;
++ continue;
++ }
++
++ if (!strcmp(lines[i], "frtd")) {
++ nextrtd = TRUE;
++ continue;
++ }
++
++ if (nextwd) {
++ g_ptr_array_add(dirs, g_strdup(lines[i] + 1));
++ nextwd = FALSE;
++ }
++
++ if (nextrtd && !havertd) {
++ g_strlcpy(buf->root, lines[i] + 1,
++ sizeof(buf->root));
++ buf->flags |= (1 << GLIBTOP_PROC_WD_ROOT);
++ nextrtd = FALSE;
++ havertd = TRUE;
++ }
++ }
++
++ g_strfreev(lines);
++
++ return dirs;
++}
++
+char**
+glibtop_get_proc_wd_s(glibtop *server, glibtop_proc_wd *buf, pid_t pid)
+{
++ char path[MAXPATHLEN];
++ char *output;
++
+ memset (buf, 0, sizeof (glibtop_proc_wd));
++
++ g_snprintf(path, sizeof(path), "/proc/%u/file", pid);
++ if (safe_readlink(path, buf->exe, sizeof(buf->exe)))
++ buf->flags |= (1 << GLIBTOP_PROC_WD_EXE);
++
++ output = execute_lsof(pid);
++ if (output != NULL) {
++ GPtrArray *dirs;
++
++ dirs = parse_output(output, buf);
++
++ 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);
++ }
++
+ return NULL;
+}