diff options
Diffstat (limited to 'devel/libgtop/files')
-rw-r--r-- | devel/libgtop/files/patch-sysdeps_freebsd_Makefile.in | 28 | ||||
-rw-r--r-- | devel/libgtop/files/patch-sysdeps_freebsd_fsusage.c | 61 | ||||
-rw-r--r-- | devel/libgtop/files/patch-sysdeps_freebsd_mountlist.c | 171 | ||||
-rw-r--r-- | devel/libgtop/files/patch-sysdeps_freebsd_procopenfiles.c | 186 | ||||
-rw-r--r-- | devel/libgtop/files/patch-sysdeps_freebsd_procwd.c | 94 |
5 files changed, 540 insertions, 0 deletions
diff --git a/devel/libgtop/files/patch-sysdeps_freebsd_Makefile.in b/devel/libgtop/files/patch-sysdeps_freebsd_Makefile.in new file mode 100644 index 000000000000..e8a6bd895fa5 --- /dev/null +++ b/devel/libgtop/files/patch-sysdeps_freebsd_Makefile.in @@ -0,0 +1,28 @@ +--- sysdeps/freebsd/Makefile.in.orig 2007-11-02 23:55:07.000000000 -0400 ++++ sysdeps/freebsd/Makefile.in 2007-11-02 23:58:08.000000000 -0400 +@@ -54,7 +54,7 @@ libgtop_sysdeps_2_0_la_LIBADD = + am_libgtop_sysdeps_2_0_la_OBJECTS = nosuid.lo siglist.lo sysinfo.lo \ + shm_limits.lo cpu.lo msg_limits.lo sem_limits.lo loadavg.lo \ + uptime.lo netlist.lo fsusage.lo mem.lo procopenfiles.lo \ +- procwd.lo glibtop_private.lo ++ procwd.lo glibtop_private.lo mountlist.lo + libgtop_sysdeps_2_0_la_OBJECTS = $(am_libgtop_sysdeps_2_0_la_OBJECTS) + am__DEPENDENCIES_1 = + libgtop_sysdeps_suid_2_0_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ +@@ -303,7 +303,7 @@ libgtop_sysdeps_2_0_la_SOURCES = nosuid. + cpu.c msg_limits.c sem_limits.c loadavg.c \ + uptime.c netlist.c fsusage.c mem.c \ + procopenfiles.c procwd.c \ +- glibtop_private.c ++ glibtop_private.c mountlist.c + + libgtop_sysdeps_2_0_la_LDFLAGS = $(LT_VERSION_INFO) + libgtop_sysdeps_suid_2_0_la_LIBADD = $(KVM_LIBS) $(EXTRA_SYSDEPS_LIBS) +@@ -374,6 +374,7 @@ distclean-compile: + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/close.Plo@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cpu.Plo@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fsusage.Plo@am__quote@ ++@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mountlist.Plo@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/glibtop_private.Plo@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/loadavg.Plo@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mem.Plo@am__quote@ diff --git a/devel/libgtop/files/patch-sysdeps_freebsd_fsusage.c b/devel/libgtop/files/patch-sysdeps_freebsd_fsusage.c new file mode 100644 index 000000000000..90da05b1b71d --- /dev/null +++ b/devel/libgtop/files/patch-sysdeps_freebsd_fsusage.c @@ -0,0 +1,61 @@ +--- sysdeps/freebsd/fsusage.c.orig 2007-06-03 16:06:05.000000000 -0400 ++++ sysdeps/freebsd/fsusage.c 2008-02-09 19:50:44.000000000 -0500 +@@ -10,6 +10,7 @@ + #include <unistd.h> + #include <sys/param.h> + #include <sys/mount.h> ++#include <sys/statvfs.h> + #if __FreeBSD_version >= 600000 || defined(__FreeBSD_kernel__) + #include <libgeom.h> + #include <sys/resource.h> +@@ -21,15 +22,13 @@ + #include <string.h> + #include <stdlib.h> + +-void +-_glibtop_freebsd_get_fsusage_read_write(glibtop *server, +- glibtop_fsusage *buf, +- const char *path); ++static const unsigned long _glibtop_sysdeps_fsusage = ++(1L << GLIBTOP_FSUSAGE_BLOCKS) + (1L << GLIBTOP_FSUSAGE_BFREE) +++ (1L << GLIBTOP_FSUSAGE_BAVAIL) + (1L << GLIBTOP_FSUSAGE_FILES) +++ (1L << GLIBTOP_FSUSAGE_FFREE) + (1L << GLIBTOP_FSUSAGE_BLOCK_SIZE); + +-void +-_glibtop_freebsd_get_fsusage_read_write(glibtop *server, +- glibtop_fsusage *buf, +- const char *path) ++static void ++_glibtop_get_fsusage_read_write (glibtop *server, glibtop_fsusage *buf, const char *path) + { + int result; + struct statfs sfs; +@@ -135,3 +134,28 @@ _glibtop_freebsd_get_fsusage_read_write( + #endif + buf->flags |= (1 << GLIBTOP_FSUSAGE_READ) | (1 << GLIBTOP_FSUSAGE_WRITE); + } ++ ++void ++glibtop_get_fsusage_s(glibtop *server, glibtop_fsusage *buf, const char *path) ++{ ++ struct statvfs fsd; ++ ++ glibtop_init_r (&server, 0, 0); ++ ++ memset (buf, 0, sizeof (glibtop_fsusage)); ++ ++ if (statvfs (path, &fsd) < 0) ++ return; ++ ++ buf->block_size = fsd.f_frsize; ++ buf->blocks = fsd.f_blocks; ++ buf->bfree = fsd.f_bfree; ++ buf->bavail = (fsd.f_bavail > fsd.f_bfree) ? 0 : fsd.f_bavail; ++ buf->files = fsd.f_files; ++ buf->ffree = fsd.f_ffree; ++ ++ buf->flags = _glibtop_sysdeps_fsusage; ++ ++ _glibtop_get_fsusage_read_write(server, buf, path); ++} ++ diff --git a/devel/libgtop/files/patch-sysdeps_freebsd_mountlist.c b/devel/libgtop/files/patch-sysdeps_freebsd_mountlist.c new file mode 100644 index 000000000000..7c1b1774cd89 --- /dev/null +++ b/devel/libgtop/files/patch-sysdeps_freebsd_mountlist.c @@ -0,0 +1,171 @@ +--- sysdeps/freebsd/mountlist.c.orig 2008-02-15 02:11:59.000000000 -0500 ++++ sysdeps/freebsd/mountlist.c 2008-02-15 02:28:14.000000000 -0500 +@@ -0,0 +1,168 @@ ++/* mountlist.c -- return a list of mounted filesystems ++ Copyright (C) 1991, 1992 Free Software Foundation, Inc. ++ ++ This program 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, or (at your option) ++ any later version. ++ ++ This program 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 this program; if not, write to the Free Software Foundation, ++ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ ++ ++#include <config.h> ++ ++#include <glib.h> ++#include <stdio.h> ++#include <stdlib.h> ++#include <sys/types.h> ++#include <sys/param.h> ++#include <sys/mount.h> ++ ++#include <string.h> ++ ++#include <glibtop.h> ++#include <glibtop/mountlist.h> ++ ++/* A mount table entry. */ ++struct mount_entry ++{ ++ char *me_devname; /* Device node pathname, including "/dev/". */ ++ char *me_mountdir; /* Mount point directory pathname. */ ++ char *me_type; /* "nfs", "4.2", etc. */ ++ dev_t me_dev; /* Device number of me_mountdir. */ ++ struct mount_entry *me_next; ++}; ++ ++static struct mount_entry *read_filesystem_list (void); ++ ++/* Return a list of the currently mounted filesystems, or NULL on error. ++ Add each entry to the tail of the list so that they stay in order. ++*/ ++ ++static struct mount_entry * ++read_filesystem_list (void) ++{ ++ struct mount_entry *mount_list; ++ struct mount_entry *me; ++ struct mount_entry *mtail; ++ ++ /* Start the list off with a dummy entry. */ ++ me = g_new (struct mount_entry, 1); ++ me->me_next = NULL; ++ mount_list = mtail = me; ++ { ++ struct statfs *fsp; ++ int entries; ++ ++ entries = getmntinfo (&fsp, MNT_NOWAIT); ++ if (entries < 0) ++ return NULL; ++ while (entries-- > 0) ++ { ++ me = (struct mount_entry *) g_malloc (sizeof (struct mount_entry)); ++ me->me_devname = g_strdup (fsp->f_mntfromname); ++ me->me_mountdir = g_strdup (fsp->f_mntonname); ++ me->me_type = g_strdup (fsp->f_fstypename); ++ me->me_dev = (dev_t) -1; /* Magic; means not known yet. */ ++ me->me_next = NULL; ++ ++ /* Add to the linked list. */ ++ mtail->me_next = me; ++ mtail = me; ++ fsp++; ++ } ++ } ++ ++ /* Free the dummy head. */ ++ me = mount_list; ++ mount_list = mount_list->me_next; ++ g_free (me); ++ return mount_list; ++} ++ ++static gboolean ignore_mount_entry(const struct mount_entry *me) ++{ ++ /* keep sorted */ ++ static const char ignored[][17] = { ++ "autofs", ++ "devfs", ++ "fusectl", ++ "linprocfs", ++ "linsysfs", ++ "mfs", ++ "none", ++ "nfs", ++ "nullfs", ++ "nwfs", ++ "portalfs", ++ "proc", ++ "procfs", ++ "smbfs", ++ "tmpfs", ++ "unionfs", ++ "unknown" ++ }; ++ ++ typedef int (*Comparator)(const void*, const void*); ++ ++ return bsearch(me->me_type, ++ ignored, G_N_ELEMENTS(ignored), sizeof ignored[0], ++ (Comparator) strcmp) != NULL; ++} ++ ++ ++glibtop_mountentry * ++glibtop_get_mountlist_s (glibtop *server, glibtop_mountlist *buf, int all_fs) ++{ ++ struct mount_entry *entries, *cur, *next; ++ ++ GArray *mount_array = g_array_new(FALSE, FALSE, ++ sizeof(glibtop_mountentry)); ++ ++ glibtop_init_r (&server, 0, 0); ++ ++ memset (buf, 0, sizeof (glibtop_mountlist)); ++ ++ /* Read filesystem list. */ ++ ++ if((entries = read_filesystem_list ()) == NULL) ++ return NULL; ++ ++ for (cur = &entries[0]; cur != NULL; cur = next) { ++ ++ if(all_fs || !ignore_mount_entry(cur)) { ++ /* add a new glibtop_mountentry */ ++ glibtop_mountentry e; ++ ++ g_strlcpy(e.devname, cur->me_devname, sizeof e.devname); ++ g_strlcpy(e.mountdir, cur->me_mountdir, sizeof e.mountdir); ++ g_strlcpy(e.type, cur->me_type, sizeof e.type); ++ e.dev = cur->me_dev; ++ ++ g_array_append_val(mount_array, e); ++ } ++ ++ /* free current mount_entry and move to the next */ ++ next = cur->me_next; ++ g_free(cur->me_devname); ++ g_free(cur->me_mountdir); ++ g_free(cur->me_type); ++ g_free(cur); ++ } ++ ++ buf->size = sizeof (glibtop_mountentry); ++ buf->number = mount_array->len; ++ buf->total = buf->number * buf->size; ++ ++ buf->flags = (1 << GLIBTOP_MOUNTLIST_SIZE) ++ | (1 << GLIBTOP_MOUNTLIST_NUMBER) ++ | (1 << GLIBTOP_MOUNTLIST_TOTAL); ++ ++ return (glibtop_mountentry*) g_array_free(mount_array, FALSE); ++} diff --git a/devel/libgtop/files/patch-sysdeps_freebsd_procopenfiles.c b/devel/libgtop/files/patch-sysdeps_freebsd_procopenfiles.c new file mode 100644 index 000000000000..93e596dcf5fb --- /dev/null +++ b/devel/libgtop/files/patch-sysdeps_freebsd_procopenfiles.c @@ -0,0 +1,186 @@ +--- sysdeps/freebsd/procopenfiles.c.orig 2007-07-01 09:14:23.000000000 -0400 ++++ sysdeps/freebsd/procopenfiles.c 2008-02-10 02:45:20.000000000 -0500 +@@ -28,6 +28,13 @@ + #include <glibtop/error.h> + #include <glibtop/procopenfiles.h> + #include <sys/types.h> ++#include <sys/socket.h> ++#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> + #include <stdlib.h> + +@@ -46,6 +53,63 @@ _glibtop_init_proc_open_files_s (glibtop + server->sysdeps.proc_open_files = _glibtop_sysdeps_proc_open_files; + } + ++#if __FreeBSD_version > 800018 ++static char * ++addr_to_string(struct sockaddr_storage *ss) ++{ ++ char *buffer; ++ 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; ++ 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; +@@ -159,21 +223,105 @@ 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 ++ struct kinfo_file *freep, *kif; ++ int name[4]; ++ size_t len; ++ int i; ++#else + char *output; ++#endif + GArray *entries; + + memset(buf, 0, sizeof (glibtop_proc_open_files)); + ++#if __FreeBSD_version > 800018 ++ 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; ++ ++ entry.type = GLIBTOP_FILE_TYPE_INETSOCKET; ++ 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; diff --git a/devel/libgtop/files/patch-sysdeps_freebsd_procwd.c b/devel/libgtop/files/patch-sysdeps_freebsd_procwd.c new file mode 100644 index 000000000000..08a58359e584 --- /dev/null +++ b/devel/libgtop/files/patch-sysdeps_freebsd_procwd.c @@ -0,0 +1,94 @@ +--- sysdeps/freebsd/procwd.c.orig 2008-02-09 12:46:32.000000000 -0500 ++++ sysdeps/freebsd/procwd.c 2008-02-09 12:48:24.000000000 -0500 +@@ -24,7 +24,9 @@ + #include <glibtop_private.h> + + #include <sys/types.h> ++#include <sys/sysctl.h> + #include <sys/param.h> ++#include <sys/user.h> + #include <string.h> + + static const unsigned long _glibtop_sysdeps_proc_wd = +@@ -38,6 +40,7 @@ _glibtop_init_proc_wd_s(glibtop *server) + server->sysdeps.proc_wd = _glibtop_sysdeps_proc_wd; + } + ++#if __FreeBSD_version < 800019 + static GPtrArray * + parse_output(const char *output, glibtop_proc_wd *buf) + { +@@ -89,12 +92,21 @@ parse_output(const char *output, glibtop + + return dirs; + } ++#endif + + char** + glibtop_get_proc_wd_s(glibtop *server, glibtop_proc_wd *buf, pid_t pid) + { + char path[MAXPATHLEN]; ++#if __FreeBSD_version > 800018 ++ struct kinfo_file *freep, *kif; ++ GPtrArray *dirs; ++ size_t len; ++ int i; ++ int name[4]; ++#else + char *output; ++#endif + + memset (buf, 0, sizeof (glibtop_proc_wd)); + +@@ -102,6 +114,43 @@ glibtop_get_proc_wd_s(glibtop *server, g + if (safe_readlink(path, buf->exe, sizeof(buf->exe))) + buf->flags |= (1 << GLIBTOP_PROC_WD_EXE); + ++#if __FreeBSD_version > 800018 ++ 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; ++ } ++ ++ dirs = g_ptr_array_sized_new(1); ++ ++ for (i = 0; i < len / sizeof(*kif); i++, kif++) { ++ switch (kif->kf_fd) { ++ case KF_FD_TYPE_ROOT: ++ g_strlcpy(buf->root, kif->kf_path, ++ sizeof(buf->root)); ++ buf->flags |= (1 << GLIBTOP_PROC_WD_ROOT); ++ break; ++ case KF_FD_TYPE_CWD: ++ g_ptr_array_add(dirs, g_strdup (kif->kf_path)); ++ break; ++ } ++ } ++ g_free(freep); ++ ++ 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); ++#else + output = execute_lsof(pid); + if (output != NULL) { + GPtrArray *dirs; +@@ -116,6 +165,7 @@ glibtop_get_proc_wd_s(glibtop *server, g + + return (char **)g_ptr_array_free(dirs, FALSE); + } ++#endif + + return NULL; + } |