From bc848239ffb0aa1abee6e45e25c308d33fa1a85d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beno=C3=AEt=20Dejean?= Date: Mon, 2 Jul 2007 15:47:24 +0000 Subject: [PATCH] Forgot to add these files. svn path=/trunk/; revision=2618 --- sysdeps/freebsd/glibtop_private.c | 54 +++++++++++++ sysdeps/freebsd/glibtop_private.h | 40 ++++++++++ sysdeps/freebsd/procwd.c | 121 ++++++++++++++++++++++++++++++ 3 files changed, 215 insertions(+) create mode 100644 sysdeps/freebsd/glibtop_private.c create mode 100644 sysdeps/freebsd/glibtop_private.h create mode 100644 sysdeps/freebsd/procwd.c diff --git a/sysdeps/freebsd/glibtop_private.c b/sysdeps/freebsd/glibtop_private.c new file mode 100644 index 00000000..5e7ed66b --- /dev/null +++ b/sysdeps/freebsd/glibtop_private.c @@ -0,0 +1,54 @@ +#include +#include +#include + +#include "glibtop_private.h" + +#include +#include +#include +#include +#include + +char * +execute_lsof(pid_t pid) { + char *output = NULL; + char *lsof; + char *command; + int exit_status; + + lsof = g_find_program_in_path("lsof"); + if (lsof == NULL) + return NULL; + + command = g_strdup_printf("%s -n -P -Fftn -p %d", lsof, pid); + g_free(lsof); + + if (g_spawn_command_line_sync (command, &output, NULL, &exit_status, NULL)) { + if (exit_status != 0) { + g_warning("Could not execute \"%s\" (%i)", command, + exit_status); + output = NULL; + } + } + + g_free(command); + return output; +} + +/* Ported from linux/glibtop_private.c */ +gboolean +safe_readlink(const char *path, char *buf, int bufsiz) +{ + int ret; + + ret = readlink(path, buf, bufsiz - 1); + + if (ret == -1) { + g_warning("Could not read link %s : %s", path, strerror(errno)); + return FALSE; + } + + buf[ret] = '\0'; + return TRUE; +} diff --git a/sysdeps/freebsd/glibtop_private.h b/sysdeps/freebsd/glibtop_private.h new file mode 100644 index 00000000..4fd8bd00 --- /dev/null +++ b/sysdeps/freebsd/glibtop_private.h @@ -0,0 +1,40 @@ +/* Copyright (C) 2007 Joe Marcus Clarke + This file is part of LibGTop 2.0. + + 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 __FREEBSD__GLIBTOP_PRIVATE_H__ +#define __FREEBSD__GLIBTOP_PRIVATE_H__ + +#include +#include + +#include + +#include +#include +#include +#include + +G_BEGIN_DECLS + +char *execute_lsof(pid_t pid); +gboolean safe_readlink(const char *path, char *buf, int bufsiz); + +G_END_DECLS + +#endif /* __FREEBSD__GLIBTOP_PRIVATE_H__ */ diff --git a/sysdeps/freebsd/procwd.c b/sysdeps/freebsd/procwd.c new file mode 100644 index 00000000..e7c42a46 --- /dev/null +++ b/sysdeps/freebsd/procwd.c @@ -0,0 +1,121 @@ +/* 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 + 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 +#include +#include + +#include + +#include +#include +#include + +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) +{ + 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 (!strcmp(lines[i], "fcwd")) { + nextwd = TRUE; + continue; + } + + if (!strcmp(lines[i], "frtd")) { + nextrtd = TRUE; + continue; + } + + if (!g_str_has_prefix(lines[i], "n")) + 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); + g_free(output); + + 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; +}