openbsd-ports/devel/libgtop2/patches/patch-sysdeps_bsd_procopenfiles_c
ajacoutot 40fdf8a7c1 Implements procwd and procopenfiles using a wrapper around lsof(8)
(from FreeBSD sysdeps directory).
Merge proctime.c patch from pkgsrc.
Several other cleanings.
2010-04-18 12:32:09 +00:00

185 lines
4.6 KiB
Plaintext

$OpenBSD: patch-sysdeps_bsd_procopenfiles_c,v 1.2 2010/04/18 12:32:09 ajacoutot Exp $
--- sysdeps/bsd/procopenfiles.c.orig Sun Apr 18 13:27:52 2010
+++ sysdeps/bsd/procopenfiles.c Sun Apr 18 13:36:28 2010
@@ -32,7 +32,6 @@
#include <sys/param.h>
#include <sys/sysctl.h>
#include <sys/un.h>
-#include <sys/user.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
@@ -53,63 +52,6 @@ _glibtop_init_proc_open_files_s (glibtop *server)
server->sysdeps.proc_open_files = _glibtop_sysdeps_proc_open_files;
}
-#if __FreeBSD_version > 800018 || (__FreeBSD_version < 800000 && __FreeBSD_version >= 700104)
-static char *
-addr_to_string(struct sockaddr_storage *ss)
-{
- char *buffer = NULL;
- char buffer2[INET6_ADDRSTRLEN];
- struct sockaddr_in6 *sin6;
- struct sockaddr_in *sin;
- struct sockaddr_un *sun;
-
- switch (ss->ss_family) {
- case AF_LOCAL:
- sun = (struct sockaddr_un *)ss;
- if (strlen(sun->sun_path) == 0)
- buffer = g_strdup("-");
- else
- buffer = g_strdup(sun->sun_path);
- break;
- case AF_INET:
- sin = (struct sockaddr_in *)ss;
- buffer = g_strdup(inet_ntoa(sin->sin_addr));
- break;
- case AF_INET6:
- sin6 = (struct sockaddr_in6 *)ss;
- if (inet_ntop(AF_INET6, &sin6->sin6_addr, buffer2,
- sizeof(buffer2)) != NULL)
- buffer = g_strdup(buffer2);
- else
- buffer = g_strdup("-");
- break;
- }
-
- return buffer;
-}
-
-static int
-addr_to_port(struct sockaddr_storage *ss)
-{
- int port = 0;
- struct sockaddr_in6 *sin6;
- struct sockaddr_in *sin;
-
- switch (ss->ss_family) {
- case AF_INET:
- sin = (struct sockaddr_in *)ss;
- port = ntohs(sin->sin_port);
- break;
- case AF_INET6:
- sin6 = (struct sockaddr_in6 *)ss;
- port = ntohs(sin6->sin6_port);
- break;
- }
-
- return port;
-}
-#else
-
static GArray *
parse_output(const char *output) {
GArray *entries;
@@ -256,108 +198,21 @@ parse_output(const char *output) {
return entries;
}
-#endif
glibtop_open_files_entry *
glibtop_get_proc_open_files_s (glibtop *server, glibtop_proc_open_files *buf, pid_t pid)
{
-#if __FreeBSD_version > 800018 || (__FreeBSD_version < 800000 && __FreeBSD_version >= 700104)
- struct kinfo_file *freep, *kif;
- int name[4];
- size_t len;
- size_t i;
-#else
char *output;
-#endif
GArray *entries;
memset(buf, 0, sizeof (glibtop_proc_open_files));
-#if __FreeBSD_version > 800018 || (__FreeBSD_version < 800000 && __FreeBSD_version >= 700104)
- name[0] = CTL_KERN;
- name[1] = KERN_PROC;
- name[2] = KERN_PROC_FILEDESC;
- name[3] = pid;
-
- if (sysctl(name, 4, NULL, &len, NULL, 0) < 0)
- return NULL;
-
- freep = kif = g_malloc(len);
- if (sysctl(name, 4, kif, &len, NULL, 0) < 0) {
- g_free(freep);
- return NULL;
- }
-
- entries = g_array_new(FALSE, FALSE, sizeof(glibtop_open_files_entry));
-
- for (i = 0; i < len / sizeof(*kif); i++, kif++) {
- glibtop_open_files_entry entry = {0};
-
- if (kif->kf_fd < 0)
- continue;
-
- if (kif->kf_type == KF_TYPE_SOCKET) {
- if (kif->kf_sock_domain == AF_LOCAL) {
- struct sockaddr_un *sun;
-
- entry.type = GLIBTOP_FILE_TYPE_LOCALSOCKET;
- sun = (struct sockaddr_un *)&kif->kf_sa_local;
-
- if (sun->sun_path[0]) {
- char *addrstr;
-
- addrstr = addr_to_string(&kif->kf_sa_local);
- g_strlcpy(entry.info.localsock.name,
- addrstr,
- sizeof(entry.info.localsock.name));
- g_free(addrstr);
- } else {
- char *addrstr;
-
- addrstr = addr_to_string(&kif->kf_sa_peer);
- g_strlcpy(entry.info.localsock.name,
- addrstr,
- sizeof(entry.info.localsock.name));
- g_free(addrstr);
- }
- } else if (kif->kf_sock_domain == AF_INET ||
- kif->kf_sock_domain == AF_INET6) {
- char *addrstr;
-
- if (kif->kf_sock_domain == AF_INET)
- entry.type = GLIBTOP_FILE_TYPE_INETSOCKET;
- else
- entry.type = GLIBTOP_FILE_TYPE_INET6SOCKET;
- addrstr = addr_to_string(&kif->kf_sa_peer);
- g_strlcpy(entry.info.sock.dest_host,
- addrstr,
- sizeof(entry.info.sock.dest_host));
- g_free(addrstr);
- entry.info.sock.dest_port = addr_to_port(&kif->kf_sa_peer);
- }
- } else if (kif->kf_type == KF_TYPE_PIPE) {
- entry.type = GLIBTOP_FILE_TYPE_PIPE;
- } else if (kif->kf_type == KF_TYPE_VNODE) {
- entry.type = GLIBTOP_FILE_TYPE_FILE;
- g_strlcpy(entry.info.file.name, kif->kf_path,
- sizeof(entry.info.file.name));
- } else
- continue;
-
- entry.fd = kif->kf_fd;
-
- g_array_append_val(entries, entry);
- }
- g_free(freep);
-#else
-
output = execute_lsof(pid);
if (output == NULL) return NULL;
entries = parse_output(output);
g_free(output);
-#endif
buf->flags = _glibtop_sysdeps_proc_open_files;
buf->number = entries->len;