diff options
Diffstat (limited to 'devel/libgtop/files/patch-sysdeps_freebsd_procwd.c')
-rw-r--r-- | devel/libgtop/files/patch-sysdeps_freebsd_procwd.c | 95 |
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; +} |