Fixe some problems as well as implements procwd and procopenfiles for
2007-07-01 Benoît Dejean <benoit@placenet.org> Fixe some problems as well as implements procwd and procopenfiles for FreeBSD using a wrapper around lsof. This same backend should also work on kFreeBSD. Patch by Joe Marcus Clarke <marcus@freebsd.org> svn path=/trunk/; revision=2617
This commit is contained in:
committed by
Benoît Dejean
parent
01f1e7e955
commit
0285e018f4
@@ -1,3 +1,11 @@
|
|||||||
|
2007-07-01 Benoît Dejean <benoit@placenet.org>
|
||||||
|
|
||||||
|
Fixe some problems as well as implements procwd and procopenfiles
|
||||||
|
for FreeBSD using a wrapper around lsof. This same backend should
|
||||||
|
also work on kFreeBSD.
|
||||||
|
|
||||||
|
Patch by Joe Marcus Clarke <marcus@freebsd.org>
|
||||||
|
|
||||||
2007-02-18 Benoît Dejean <benoit@placenet.org>
|
2007-02-18 Benoît Dejean <benoit@placenet.org>
|
||||||
|
|
||||||
* AUTHORS:
|
* AUTHORS:
|
||||||
|
@@ -5,7 +5,9 @@ noinst_LTLIBRARIES = libgtop_sysdeps-2.0.la libgtop_sysdeps_suid-2.0.la
|
|||||||
|
|
||||||
libgtop_sysdeps_2_0_la_SOURCES = nosuid.c siglist.c sysinfo.c shm_limits.c \
|
libgtop_sysdeps_2_0_la_SOURCES = nosuid.c siglist.c sysinfo.c shm_limits.c \
|
||||||
cpu.c msg_limits.c sem_limits.c loadavg.c \
|
cpu.c msg_limits.c sem_limits.c loadavg.c \
|
||||||
uptime.c netlist.c fsusage.c mem.c
|
uptime.c netlist.c fsusage.c mem.c \
|
||||||
|
procopenfiles.c procwd.c \
|
||||||
|
glibtop_private.c
|
||||||
|
|
||||||
libgtop_sysdeps_2_0_la_LDFLAGS = $(LT_VERSION_INFO)
|
libgtop_sysdeps_2_0_la_LDFLAGS = $(LT_VERSION_INFO)
|
||||||
|
|
||||||
@@ -14,11 +16,11 @@ libgtop_sysdeps_suid_2_0_la_SOURCES = open.c close.c swap.c \
|
|||||||
proclist.c procstate.c procuid.c \
|
proclist.c procstate.c procuid.c \
|
||||||
proctime.c procmem.c procsignal.c \
|
proctime.c procmem.c procsignal.c \
|
||||||
prockernel.c procsegment.c procargs.c \
|
prockernel.c procsegment.c procargs.c \
|
||||||
procmap.c netload.c ppp.c procopenfiles.c
|
procmap.c netload.c ppp.c
|
||||||
|
|
||||||
libgtop_sysdeps_suid_2_0_la_LDFLAGS = $(LT_VERSION_INFO)
|
libgtop_sysdeps_suid_2_0_la_LDFLAGS = $(LT_VERSION_INFO)
|
||||||
|
|
||||||
libgtopinclude_HEADERS = glibtop_server.h glibtop_machine.h \
|
libgtopinclude_HEADERS = glibtop_server.h glibtop_machine.h \
|
||||||
glibtop_suid.h
|
glibtop_suid.h glibtop_private.h
|
||||||
|
|
||||||
libgtopincludedir = $(includedir)/libgtop-2.0
|
libgtopincludedir = $(includedir)/libgtop-2.0
|
||||||
|
@@ -45,6 +45,7 @@ G_BEGIN_DECLS
|
|||||||
#define GLIBTOP_SUID_MSG_LIMITS 0
|
#define GLIBTOP_SUID_MSG_LIMITS 0
|
||||||
#define GLIBTOP_SUID_SEM_LIMITS 0
|
#define GLIBTOP_SUID_SEM_LIMITS 0
|
||||||
#define GLIBTOP_SUID_NETLIST 0
|
#define GLIBTOP_SUID_NETLIST 0
|
||||||
|
#define GLIBTOP_SUID_PROC_WD 0
|
||||||
|
|
||||||
G_END_DECLS
|
G_END_DECLS
|
||||||
|
|
||||||
|
@@ -40,7 +40,7 @@ static const unsigned long _glibtop_sysdeps_proclist =
|
|||||||
* buf->flags is only set if the call succeeded, in this case pids_chain,
|
* buf->flags is only set if the call succeeded, in this case pids_chain,
|
||||||
* a list of the pids of all currently running processes is returned,
|
* a list of the pids of all currently running processes is returned,
|
||||||
* buf->number is the number of elements of this list and buf->size is
|
* buf->number is the number of elements of this list and buf->size is
|
||||||
* the size of one single element (sizeof (unsigned)). The total size is
|
* the size of one single element (sizeof (pid_t)). The total size is
|
||||||
* stored in buf->total.
|
* stored in buf->total.
|
||||||
*
|
*
|
||||||
* The calling function has to free the memory to which a pointer is returned.
|
* The calling function has to free the memory to which a pointer is returned.
|
||||||
@@ -61,7 +61,7 @@ _glibtop_init_proclist_p (glibtop *server)
|
|||||||
server->sysdeps.proclist = _glibtop_sysdeps_proclist;
|
server->sysdeps.proclist = _glibtop_sysdeps_proclist;
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned *
|
pid_t *
|
||||||
glibtop_get_proclist_p (glibtop *server, glibtop_proclist *buf,
|
glibtop_get_proclist_p (glibtop *server, glibtop_proclist *buf,
|
||||||
gint64 which, gint64 arg)
|
gint64 which, gint64 arg)
|
||||||
{
|
{
|
||||||
@@ -90,18 +90,18 @@ glibtop_get_proclist_p (glibtop *server, glibtop_proclist *buf,
|
|||||||
|
|
||||||
len /= sizeof (struct kinfo_proc);
|
len /= sizeof (struct kinfo_proc);
|
||||||
|
|
||||||
pids = g_array_sized_new (FALSE, FALSE, sizeof (unsigned), len);
|
pids = g_array_sized_new (FALSE, FALSE, sizeof (pid_t), len);
|
||||||
|
|
||||||
for (i = 0; i < len; i++) {
|
for (i = 0; i < len; i++) {
|
||||||
unsigned pid;
|
pid_t pid;
|
||||||
|
|
||||||
pid = (unsigned) pinfo[i].ki_pid;
|
pid = (pid_t) pinfo[i].ki_pid;
|
||||||
|
|
||||||
switch (which & GLIBTOP_KERN_PROC_MASK) {
|
switch (which & GLIBTOP_KERN_PROC_MASK) {
|
||||||
case GLIBTOP_KERN_PROC_ALL:
|
case GLIBTOP_KERN_PROC_ALL:
|
||||||
break;
|
break;
|
||||||
case GLIBTOP_KERN_PROC_PID:
|
case GLIBTOP_KERN_PROC_PID:
|
||||||
if ((unsigned) arg != pid)
|
if ((pid_t) arg != pid)
|
||||||
continue;
|
continue;
|
||||||
break;
|
break;
|
||||||
case GLIBTOP_KERN_PROC_UID:
|
case GLIBTOP_KERN_PROC_UID:
|
||||||
@@ -144,9 +144,9 @@ glibtop_get_proclist_p (glibtop *server, glibtop_proclist *buf,
|
|||||||
g_free (pinfo);
|
g_free (pinfo);
|
||||||
|
|
||||||
buf->flags = _glibtop_sysdeps_proclist;
|
buf->flags = _glibtop_sysdeps_proclist;
|
||||||
buf->size = sizeof (unsigned);
|
buf->size = sizeof (pid_t);
|
||||||
buf->number = pids->len;
|
buf->number = pids->len;
|
||||||
buf->total = buf->number * buf->size;
|
buf->total = buf->number * buf->size;
|
||||||
|
|
||||||
return (unsigned *) g_array_free (pids, FALSE);
|
return (pid_t *) g_array_free (pids, FALSE);
|
||||||
}
|
}
|
||||||
|
@@ -1,5 +1,6 @@
|
|||||||
/* Copyright (C) 1998-99 Martin Baulig
|
/* Copyright (C) 1998-99 Martin Baulig
|
||||||
Copyright (C) 2004 Nicol<6F>s Lichtmaier
|
Copyright (C) 2004 Nicol<6F>s Lichtmaier
|
||||||
|
Copyright (C) 2007 Joe Marcus Clarke
|
||||||
This file is part of LibGTop 1.0.
|
This file is part of LibGTop 1.0.
|
||||||
|
|
||||||
Modified by Nicol<6F>s Lichtmaier to give a process open files.
|
Modified by Nicol<6F>s Lichtmaier to give a process open files.
|
||||||
@@ -26,8 +27,11 @@
|
|||||||
#include <glibtop.h>
|
#include <glibtop.h>
|
||||||
#include <glibtop/error.h>
|
#include <glibtop/error.h>
|
||||||
#include <glibtop/procopenfiles.h>
|
#include <glibtop/procopenfiles.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
#include <glibtop_suid.h>
|
#include "glibtop_private.h"
|
||||||
|
|
||||||
static const unsigned long _glibtop_sysdeps_proc_open_files =
|
static const unsigned long _glibtop_sysdeps_proc_open_files =
|
||||||
(1L << GLIBTOP_PROC_OPEN_FILES_NUMBER)|
|
(1L << GLIBTOP_PROC_OPEN_FILES_NUMBER)|
|
||||||
@@ -42,10 +46,139 @@ _glibtop_init_proc_open_files_s (glibtop *server)
|
|||||||
server->sysdeps.proc_open_files = _glibtop_sysdeps_proc_open_files;
|
server->sysdeps.proc_open_files = _glibtop_sysdeps_proc_open_files;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static GArray *
|
||||||
|
parse_output(const char *output) {
|
||||||
|
GArray *entries;
|
||||||
|
char **lines;
|
||||||
|
char *ftype = NULL;
|
||||||
|
char *fname = NULL;
|
||||||
|
guint i;
|
||||||
|
guint len;
|
||||||
|
int fd = -1;
|
||||||
|
|
||||||
|
entries = g_array_new(FALSE, FALSE, sizeof(glibtop_open_files_entry));
|
||||||
|
|
||||||
|
lines = g_strsplit(output, "\n", 0);
|
||||||
|
len = g_strv_length(lines);
|
||||||
|
|
||||||
|
for (i = 0; i < len && lines[i]; i++) {
|
||||||
|
glibtop_open_files_entry entry = {0};
|
||||||
|
|
||||||
|
if (strlen(lines[i]) < 2)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (!g_str_has_prefix(lines[i], "f") &&
|
||||||
|
!g_str_has_prefix(lines[i], "t") &&
|
||||||
|
!g_str_has_prefix(lines[i], "n"))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (g_str_has_prefix(lines[i], "f")) {
|
||||||
|
if (!g_ascii_isdigit(*(lines[i] + 1)))
|
||||||
|
i += 2;
|
||||||
|
else
|
||||||
|
fd = atoi(lines[i] + 1);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (g_str_has_prefix(lines[i], "t")) {
|
||||||
|
ftype = lines[i];
|
||||||
|
ftype++;
|
||||||
|
continue;
|
||||||
|
} else {
|
||||||
|
fname = lines[i];
|
||||||
|
fname++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ftype == NULL || fname == NULL)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (!strcmp(ftype, "unix")) {
|
||||||
|
entry.type = GLIBTOP_FILE_TYPE_LOCALSOCKET;
|
||||||
|
g_strlcpy(entry.info.localsock.name, fname,
|
||||||
|
sizeof(entry.info.localsock.name));
|
||||||
|
} else if (!strcmp(ftype, "PIPE")) {
|
||||||
|
entry.type = GLIBTOP_FILE_TYPE_PIPE;
|
||||||
|
} else if (!strcmp(ftype, "VREG") ||
|
||||||
|
!strcmp(ftype, "GDIR") ||
|
||||||
|
!strcmp(ftype, "GREG") ||
|
||||||
|
!strcmp(ftype, "VCHR") ||
|
||||||
|
!strcmp(ftype, "VBLK") ||
|
||||||
|
!strcmp(ftype, "DIR") ||
|
||||||
|
!strcmp(ftype, "LINK") ||
|
||||||
|
!strcmp(ftype, "REG") ||
|
||||||
|
!strcmp(ftype, "VDIR")) {
|
||||||
|
entry.type = GLIBTOP_FILE_TYPE_FILE;
|
||||||
|
g_strlcpy(entry.info.file.name, fname,
|
||||||
|
sizeof(entry.info.file.name));
|
||||||
|
} else if (!strcmp(ftype, "IPv4")) {
|
||||||
|
char **hosts;
|
||||||
|
char **remote_host;
|
||||||
|
|
||||||
|
if (!strstr(fname, "->")) {
|
||||||
|
remote_host = g_strsplit(fname, ":", 0);
|
||||||
|
} else {
|
||||||
|
hosts = g_strsplit(fname, "->", 0);
|
||||||
|
if (g_strv_length(hosts) < 2) {
|
||||||
|
g_strfreev(hosts);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
remote_host = g_strsplit(hosts[1], ":", 0);
|
||||||
|
g_strfreev(hosts);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (g_strv_length(remote_host) < 2) {
|
||||||
|
g_strfreev(remote_host);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
entry.type = GLIBTOP_FILE_TYPE_INETSOCKET;
|
||||||
|
if (!strcmp(remote_host[0], "*"))
|
||||||
|
g_strlcpy(entry.info.sock.dest_host, "0.0.0.0",
|
||||||
|
sizeof(entry.info.sock.dest_host));
|
||||||
|
else
|
||||||
|
g_strlcpy(entry.info.sock.dest_host,
|
||||||
|
remote_host[0],
|
||||||
|
sizeof(entry.info.sock.dest_host));
|
||||||
|
entry.info.sock.dest_port = atoi(remote_host[1]);
|
||||||
|
|
||||||
|
g_strfreev(remote_host);
|
||||||
|
} else
|
||||||
|
continue;
|
||||||
|
|
||||||
|
entry.fd = fd;
|
||||||
|
|
||||||
|
fd = -1;
|
||||||
|
ftype = NULL;
|
||||||
|
fname = NULL;
|
||||||
|
|
||||||
|
g_array_append_val(entries, entry);
|
||||||
|
}
|
||||||
|
|
||||||
|
g_strfreev(lines);
|
||||||
|
|
||||||
|
return entries;
|
||||||
|
}
|
||||||
|
|
||||||
/* XXX Unimplemented on FreeBSD */
|
|
||||||
glibtop_open_files_entry *
|
glibtop_open_files_entry *
|
||||||
glibtop_get_proc_open_files_s (glibtop *server, glibtop_proc_open_files *buf, pid_t pid)
|
glibtop_get_proc_open_files_s (glibtop *server, glibtop_proc_open_files *buf, pid_t pid)
|
||||||
{
|
{
|
||||||
return NULL;
|
char *output;
|
||||||
|
GArray *entries;
|
||||||
|
|
||||||
|
memset(buf, 0, sizeof (glibtop_proc_open_files));
|
||||||
|
|
||||||
|
output = execute_lsof(pid);
|
||||||
|
if (output == NULL) return NULL;
|
||||||
|
|
||||||
|
entries = parse_output(output);
|
||||||
|
|
||||||
|
g_free(output);
|
||||||
|
|
||||||
|
buf->flags = _glibtop_sysdeps_proc_open_files;
|
||||||
|
buf->number = entries->len;
|
||||||
|
buf->size = sizeof(glibtop_open_files_entry);
|
||||||
|
buf->total = buf->number * buf->size;
|
||||||
|
|
||||||
|
return (glibtop_open_files_entry*)g_array_free(entries, FALSE);
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user