Package: libgtop2
Severity: important
Version: 2.22.0-1
Tags: patch
User: [EMAIL PROTECTED]
Usertags: kfreebsd

Hi,

as you informed debian-bsd list,
the current version fails to build on GNU/kFreeBSD.

In fact, there are three problems.

1) <sys/vnode.h> includes <sys/acl.h>, which is not presented by default
   (it is located in libacl1-dev package). It have to be fixed in
   kfreebsd-kernel-headers package (fix is already in our svn).

2) libgtop2-dev should depend on all kfreebsd specific packages.
   Small change in debian/rules and debian/control.in is needed,
   see attached patch.

3) upstream is broken on all but linux platforms :-(
   The problem is in sysdeps/common/ subdirectory.
   fsusage.c and mountlist.c is not present in tarball,
   Makefile.am is written in broken way.

The attached patch contains workaround for problem 3),
I hope it still works on Linux. The fsusage.c and mountlist.c
are restored from 2.20.0 release. Unfortunately I am not expert
on autoconf/automake, so I am unable to fix Makefile.am in a cleaner way.
The attached patch contains also regenerated Makefile.in.

It would also be nice if you can inform upstream
about problem with current sysdeps/common/Makefile.am.

Thanks in advance and sorry for the delay

                        Petr
diff -u libgtop2-2.22.0/debian/control.in libgtop2-2.22.0/debian/control.in
--- libgtop2-2.22.0/debian/control.in
+++ libgtop2-2.22.0/debian/control.in
@@ -34,7 +34,7 @@
 Section: libdevel
 Depends: libgtop2-7 (= ${binary:Version}),
          libglib2.0-dev,
-         ${libkvm-dev}
+         ${os-specific-dev}
 Description: gtop system monitoring library
  The gtop library reads information about processes and the state of the
  system. It is used by the GNOME desktop environment.
diff -u libgtop2-2.22.0/debian/control libgtop2-2.22.0/debian/control
--- libgtop2-2.22.0/debian/control
+++ libgtop2-2.22.0/debian/control
@@ -34,7 +34,7 @@
 Section: libdevel
 Depends: libgtop2-7 (= ${binary:Version}),
          libglib2.0-dev,
-         ${libkvm-dev}
+         ${os-specific-dev}
 Description: gtop system monitoring library
  The gtop library reads information about processes and the state of the
  system. It is used by the GNOME desktop environment.
diff -u libgtop2-2.22.0/debian/rules libgtop2-2.22.0/debian/rules
--- libgtop2-2.22.0/debian/rules
+++ libgtop2-2.22.0/debian/rules
@@ -16,3 +16,3 @@
-DEB_DH_GENCONTROL_ARGS += -- -Vlibkvm-dev=libkvm-dev
+DEB_DH_GENCONTROL_ARGS += -- -Vos-specific-dev="libkvm-dev, libgeom-dev, 
libdevstat-dev"
 endif

only in patch2:
unchanged:
--- libgtop2-2.22.0.orig/sysdeps/common/Makefile.am
+++ libgtop2-2.22.0/sysdeps/common/Makefile.am
@@ -3,19 +3,32 @@
 
 noinst_LTLIBRARIES             = libgtop_common-2.0.la 
libgtop_suid_common-2.0.la
 
+if !LIBGTOP_SYSDEPS_PRIVATE_MOUNTLIST
+if !LIBGTOP_SYSDEPS_PRIVATE_FSUSAGE
+libgtop_common_2_0_la_SOURCES  = error.c gnuslib.c \
+                                  procargs.c \
+                                 default.c \
+                                 mountlist.c \
+                                 fsusage.c
+else
+libgtop_common_2_0_la_SOURCES  = error.c gnuslib.c \
+                                  procargs.c \
+                                 default.c \
+                                 mountlist.c
+endif                            
+else                             
+if !LIBGTOP_SYSDEPS_PRIVATE_FSUSAGE
+libgtop_common_2_0_la_SOURCES  = error.c gnuslib.c \
+                                  procargs.c \
+                                 default.c \
+                                 fsusage.c
+else
 libgtop_common_2_0_la_SOURCES  = error.c gnuslib.c \
                                   procargs.c \
                                  default.c
-
-if !LIBGTOP_SYSDEPS_PRIVATE_MOUNTLIST
-       libgtop_common_2_0_la_SOURCES += mountlist.c
 endif
-
-if !LIBGTOP_SYSDEPS_PRIVATE_FSUSAGE
-       libgtop_common_2_0_la_SOURCES += fsusage.c
 endif
 
-
 # libgtop_common_2_0_la_LDFLAGS        = $(LT_VERSION_INFO)
 libgtop_common_2_0_la_LIBADD   = $(LIBGTOP_EXTRA_LIBS)
 
only in patch2:
unchanged:
--- libgtop2-2.22.0.orig/sysdeps/common/Makefile.in
+++ libgtop2-2.22.0/sysdeps/common/Makefile.in
@@ -50,8 +50,28 @@
 LTLIBRARIES = $(noinst_LTLIBRARIES)
 am__DEPENDENCIES_1 =
 libgtop_common_2_0_la_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am_libgtop_common_2_0_la_OBJECTS = error.lo gnuslib.lo procargs.lo \
-       default.lo
+am__libgtop_common_2_0_la_SOURCES_DIST = error.c gnuslib.c procargs.c \
+       default.c mountlist.c fsusage.c
[EMAIL PROTECTED]@@[EMAIL PROTECTED] = error.lo \
[EMAIL PROTECTED]@@LIBGTOP_SYSDEPS_PRIVATE_MOUNTLIST_FALSE@     gnuslib.lo \
[EMAIL PROTECTED]@@LIBGTOP_SYSDEPS_PRIVATE_MOUNTLIST_FALSE@     procargs.lo \
[EMAIL PROTECTED]@@LIBGTOP_SYSDEPS_PRIVATE_MOUNTLIST_FALSE@     default.lo \
[EMAIL PROTECTED]@@LIBGTOP_SYSDEPS_PRIVATE_MOUNTLIST_FALSE@     mountlist.lo \
[EMAIL PROTECTED]@@LIBGTOP_SYSDEPS_PRIVATE_MOUNTLIST_FALSE@     fsusage.lo
[EMAIL PROTECTED]@@[EMAIL PROTECTED] = error.lo \
[EMAIL PROTECTED]@@LIBGTOP_SYSDEPS_PRIVATE_MOUNTLIST_TRUE@      gnuslib.lo \
[EMAIL PROTECTED]@@LIBGTOP_SYSDEPS_PRIVATE_MOUNTLIST_TRUE@      procargs.lo \
[EMAIL PROTECTED]@@LIBGTOP_SYSDEPS_PRIVATE_MOUNTLIST_TRUE@      default.lo \
[EMAIL PROTECTED]@@LIBGTOP_SYSDEPS_PRIVATE_MOUNTLIST_TRUE@      fsusage.lo
[EMAIL PROTECTED]@@[EMAIL PROTECTED] = error.lo \
[EMAIL PROTECTED]@@LIBGTOP_SYSDEPS_PRIVATE_MOUNTLIST_FALSE@     gnuslib.lo \
[EMAIL PROTECTED]@@LIBGTOP_SYSDEPS_PRIVATE_MOUNTLIST_FALSE@     procargs.lo \
[EMAIL PROTECTED]@@LIBGTOP_SYSDEPS_PRIVATE_MOUNTLIST_FALSE@     default.lo \
[EMAIL PROTECTED]@@LIBGTOP_SYSDEPS_PRIVATE_MOUNTLIST_FALSE@     mountlist.lo
[EMAIL PROTECTED]@@[EMAIL PROTECTED] = error.lo \
[EMAIL PROTECTED]@@LIBGTOP_SYSDEPS_PRIVATE_MOUNTLIST_TRUE@      gnuslib.lo \
[EMAIL PROTECTED]@@LIBGTOP_SYSDEPS_PRIVATE_MOUNTLIST_TRUE@      procargs.lo \
[EMAIL PROTECTED]@@LIBGTOP_SYSDEPS_PRIVATE_MOUNTLIST_TRUE@      default.lo
 libgtop_common_2_0_la_OBJECTS = $(am_libgtop_common_2_0_la_OBJECTS)
 libgtop_suid_common_2_0_la_LIBADD =
 am_libgtop_suid_common_2_0_la_OBJECTS = error.lo sysdeps_suid.lo
@@ -70,7 +90,7 @@
        $(AM_LDFLAGS) $(LDFLAGS) -o $@
 SOURCES = $(libgtop_common_2_0_la_SOURCES) \
        $(libgtop_suid_common_2_0_la_SOURCES)
-DIST_SOURCES = $(libgtop_common_2_0_la_SOURCES) \
+DIST_SOURCES = $(am__libgtop_common_2_0_la_SOURCES_DIST) \
        $(libgtop_suid_common_2_0_la_SOURCES)
 ETAGS = etags
 CTAGS = ctags
@@ -285,9 +305,25 @@
 target_os = @target_os@
 target_vendor = @target_vendor@
 noinst_LTLIBRARIES = libgtop_common-2.0.la libgtop_suid_common-2.0.la
-libgtop_common_2_0_la_SOURCES = error.c gnuslib.c \
-                                  procargs.c \
-                                 default.c
[EMAIL PROTECTED]@@[EMAIL PROTECTED] = error.c gnuslib.c \
[EMAIL PROTECTED]@@LIBGTOP_SYSDEPS_PRIVATE_MOUNTLIST_FALSE@                     
             procargs.c \
[EMAIL PROTECTED]@@LIBGTOP_SYSDEPS_PRIVATE_MOUNTLIST_FALSE@                     
          default.c \
[EMAIL PROTECTED]@@LIBGTOP_SYSDEPS_PRIVATE_MOUNTLIST_FALSE@                     
          mountlist.c \
[EMAIL PROTECTED]@@LIBGTOP_SYSDEPS_PRIVATE_MOUNTLIST_FALSE@                     
          fsusage.c
+
[EMAIL PROTECTED]@@[EMAIL PROTECTED] = error.c gnuslib.c \
[EMAIL PROTECTED]@@LIBGTOP_SYSDEPS_PRIVATE_MOUNTLIST_TRUE@                      
            procargs.c \
[EMAIL PROTECTED]@@LIBGTOP_SYSDEPS_PRIVATE_MOUNTLIST_TRUE@                      
          default.c \
[EMAIL PROTECTED]@@LIBGTOP_SYSDEPS_PRIVATE_MOUNTLIST_TRUE@                      
          fsusage.c
+
[EMAIL PROTECTED]@@[EMAIL PROTECTED] = error.c gnuslib.c \
[EMAIL PROTECTED]@@LIBGTOP_SYSDEPS_PRIVATE_MOUNTLIST_FALSE@                     
             procargs.c \
[EMAIL PROTECTED]@@LIBGTOP_SYSDEPS_PRIVATE_MOUNTLIST_FALSE@                     
          default.c \
[EMAIL PROTECTED]@@LIBGTOP_SYSDEPS_PRIVATE_MOUNTLIST_FALSE@                     
          mountlist.c
+
[EMAIL PROTECTED]@@[EMAIL PROTECTED] = error.c gnuslib.c \
[EMAIL PROTECTED]@@LIBGTOP_SYSDEPS_PRIVATE_MOUNTLIST_TRUE@                      
            procargs.c \
[EMAIL PROTECTED]@@LIBGTOP_SYSDEPS_PRIVATE_MOUNTLIST_TRUE@                      
          default.c
 
 
 # libgtop_common_2_0_la_LDFLAGS        = $(LT_VERSION_INFO)
@@ -348,7 +384,9 @@
 
 @AMDEP_TRUE@@am__include@ @[EMAIL PROTECTED]/$(DEPDIR)/[EMAIL PROTECTED]@
 @AMDEP_TRUE@@am__include@ @[EMAIL PROTECTED]/$(DEPDIR)/[EMAIL PROTECTED]@
[EMAIL PROTECTED]@@am__include@ @[EMAIL PROTECTED]/$(DEPDIR)/[EMAIL PROTECTED]@
 @AMDEP_TRUE@@am__include@ @[EMAIL PROTECTED]/$(DEPDIR)/[EMAIL PROTECTED]@
[EMAIL PROTECTED]@@am__include@ @[EMAIL PROTECTED]/$(DEPDIR)/[EMAIL PROTECTED]@
 @AMDEP_TRUE@@am__include@ @[EMAIL PROTECTED]/$(DEPDIR)/[EMAIL PROTECTED]@
 @AMDEP_TRUE@@am__include@ @[EMAIL PROTECTED]/$(DEPDIR)/[EMAIL PROTECTED]@
 
@@ -550,10 +588,6 @@
        uninstall-info-am
 
 
[EMAIL PROTECTED]@      libgtop_common_2_0_la_SOURCES += mountlist.c
-
[EMAIL PROTECTED]@      libgtop_common_2_0_la_SOURCES += fsusage.c
-
 # libgtop_suid_common_2_0_la_LDFLAGS   = $(LT_VERSION_INFO)
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
only in patch2:
unchanged:
--- libgtop2-2.22.0.orig/sysdeps/common/fsusage.c
+++ libgtop2-2.22.0/sysdeps/common/fsusage.c
@@ -0,0 +1,326 @@
+/* fsusage.c -- return space usage of mounted filesystems
+   Copyright (C) 1991, 1992, 1996, 1998, 1999, 2002, 2003 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.  */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <glibtop.h>
+#include <glibtop/fsusage.h>
+
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#ifdef HAVE_LIMITS_H
+# include <limits.h>
+#endif
+#ifndef CHAR_BIT
+# define CHAR_BIT 8
+#endif
+
+#ifdef HAVE_SYS_PARAM_H
+# include <sys/param.h>
+#endif
+
+#ifdef HAVE_SYS_MOUNT_H
+# include <sys/mount.h>
+#endif
+
+#ifdef HAVE_SYS_VFS_H
+# include <sys/vfs.h>
+#endif
+
+#ifdef HAVE_SYS_FS_S5PARAM_H   /* Fujitsu UXP/V */
+# include <sys/fs/s5param.h>
+#endif
+
+#if defined HAVE_SYS_FILSYS_H && !defined _CRAY
+# include <sys/filsys.h>       /* SVR2 */
+#endif
+
+#ifdef HAVE_FCNTL_H
+# include <fcntl.h>
+#endif
+
+#ifdef HAVE_SYS_STATFS_H
+# include <sys/statfs.h>
+#endif
+
+#ifdef HAVE_DUSTAT_H           /* AIX PS/2 */
+# include <sys/dustat.h>
+#endif
+
+#ifdef HAVE_SYS_STATVFS_H              /* SVR4 */
+# include <sys/statvfs.h>
+int statvfs (const char *path, struct statvfs *buf);
+#endif
+
+/* Many space usage primitives use all 1 bits to denote a value that is
+   not applicable or unknown.  Propagate this information by returning
+   a guint64 value that is all 1 bits if X is all 1 bits, even if X
+   is unsigned and narrower than guint64.  */
+#define PROPAGATE_ALL_ONES(x) \
+  ((sizeof (x) < sizeof (guint64) \
+    && (~ (x) == (sizeof (x) < sizeof (int) \
+                 ? - (1 << (sizeof (x) * CHAR_BIT)) \
+                 : 0))) \
+   ? G_MAXUINT64 : (x))
+
+/* Extract the top bit of X as an guint64 value.  */
+#define EXTRACT_TOP_BIT(x) ((x) \
+                           & ((guint64) 1 << (sizeof (x) * CHAR_BIT - 1)))
+
+/* If a value is negative, many space usage primitives store it into an
+   integer variable by assignment, even if the variable's type is unsigned.
+   So, if a space usage variable X's top bit is set, convert X to the
+   guint64 value V such that (- (guint64) V) is the negative of
+   the original value.  If X's top bit is clear, just yield X.
+   Use PROPAGATE_TOP_BIT if the original value might be negative;
+   otherwise, use PROPAGATE_ALL_ONES.  */
+#define PROPAGATE_TOP_BIT(x) ((x) | ~ (EXTRACT_TOP_BIT (x) - 1))
+
+/* Fill in the fields of FSP with information about space usage for
+   the filesystem on which PATH resides.
+   DISK is the device on which PATH is mounted, for space-getting
+   methods that need to know it.
+   Return 0 if successful, -1 if not.  When returning -1, ensure that
+   ERRNO is either a system error value, or zero if DISK is NULL
+   on a system that requires a non-NULL value.  */
+
+
+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);
+
+
+/*
+ * _glibtop_get_fsusage_read_write
+ * New function to retrieve total read and write
+ *
+ * Each arch should have its own function()
+ * and the proper #define. This is more readable than one single
+ * function full of #something where everything is mixed.
+ * These functions are private.
+ *
+ * void  _glibtop_<arch>_get_fsusage_read_write(glibtop*server,
+ *                                              glibtop_fsusage *buf,
+ *                                              const char *path);
+ *
+ * TODO: split this file properly, is possible
+ */
+
+#ifdef linux
+void
+_glibtop_linux_get_fsusage_read_write(glibtop *server,
+                                     glibtop_fsusage *buf,
+                                     const char *path);
+
+static inline void
+_glibtop_get_fsusage_read_write(glibtop *server,
+                               glibtop_fsusage *buf,
+                               const char *path)
+{
+       _glibtop_linux_get_fsusage_read_write(server, buf, path);
+}
+
+
+#elif defined(__FreeBSD__)
+void
+_glibtop_freebsd_get_fsusage_read_write(glibtop *server,
+                                       glibtop_fsusage *buf,
+                                       const char *path);
+
+#define _glibtop_get_fsusage_read_write(S, B, P) \
+       _glibtop_freebsd_get_fsusage_read_write(S, B, P)
+
+#else /* default fallback */
+#warning glibtop_get_fsusage .read .write are not implemented.
+static inline void
+_glibtop_get_fsusage_read_write(glibtop *server,
+                               glibtop_fsusage *buf,
+                               const char *path)
+{
+  /* NOOP */
+}
+#endif /* default fallback */
+
+/* end _glibtop_get_fsusage_read_write */
+
+
+
+void
+glibtop_get_fsusage_s (glibtop *server, glibtop_fsusage *buf,
+                      const char *path)
+{
+#if defined STAT_STATFS3_OSF1
+  struct statfs fsd;
+#elif defined STAT_STATFS2_FS_DATA  /* Ultrix */
+  struct fs_data fsd;
+#elif defined STAT_STATFS2_BSIZE    /* 4.3BSD, SunOS 4, HP-UX, AIX */
+  struct statfs fsd;
+#elif defined STAT_STATVFS          /* SVR4 */
+  struct statvfs fsd;
+#elif defined STAT_STATFS2_FSIZE    /* 4.4BSD */
+  struct statfs fsd;
+#elif defined STAT_STATFS4         /* SVR3, Dynix, Irix, AIX */
+  struct stafs fsd;
+#endif
+
+  glibtop_init_r (&server, 0, 0);
+
+  memset (buf, 0, sizeof (glibtop_fsusage));
+
+#ifdef STAT_STATFS3_OSF1
+
+  if (statfs (path, &fsd, sizeof (struct statfs)) != 0)
+    return;
+
+  buf->block_size = PROPAGATE_ALL_ONES (fsd.f_fsize);
+
+#endif /* STAT_STATFS3_OSF1 */
+
+#ifdef STAT_STATFS2_FS_DATA    /* Ultrix */
+
+  if (statfs (path, &fsd) != 1)
+    return;
+
+  buf->block_size = 1024;
+  buf->blocks = PROPAGATE_ALL_ONES (fsd.fd_req.btot);
+  buf->bfree = PROPAGATE_ALL_ONES (fsd.fd_req.bfree);
+  buf->bavail = PROPAGATE_TOP_BIT (fsd.fd_req.bfreen);
+  /* buf->bavail_top_bit_set = EXTRACT_TOP_BIT (fsd.fd_req.bfreen) != 0; */
+  buf->files = PROPAGATE_ALL_ONES (fsd.fd_req.gtot);
+  buf->ffree = PROPAGATE_ALL_ONES (fsd.fd_req.gfree);
+
+#endif /* STAT_STATFS2_FS_DATA */
+
+#ifdef STAT_STATFS2_BSIZE      /* 4.3BSD, SunOS 4, HP-UX, AIX */
+
+  if (statfs (path, &fsd) < 0)
+    return;
+
+  buf->block_size = PROPAGATE_ALL_ONES (fsd.f_bsize);
+
+# ifdef STATFS_TRUNCATES_BLOCK_COUNTS
+
+  /* In SunOS 4.1.2, 4.1.3, and 4.1.3_U1, the block counts in the
+     struct statfs are truncated to 2GB.  These conditions detect that
+     truncation, presumably without botching the 4.1.1 case, in which
+     the values are not truncated.  The correct counts are stored in
+     undocumented spare fields.  */
+  if (fsd.f_blocks == 0x7fffffff / fsd.f_bsize && fsd.f_spare[0] > 0)
+    {
+      fsd.f_blocks = fsd.f_spare[0];
+      fsd.f_bfree = fsd.f_spare[1];
+      fsd.f_bavail = fsd.f_spare[2];
+    }
+# endif /* STATFS_TRUNCATES_BLOCK_COUNTS */
+
+#endif /* STAT_STATFS2_BSIZE */
+
+#ifdef STAT_STATFS2_FSIZE      /* 4.4BSD */
+
+  if (statfs (path, &fsd) < 0)
+    return;
+
+  buf->block_size = PROPAGATE_ALL_ONES (fsd.f_fsize);
+
+#endif /* STAT_STATFS2_FSIZE */
+
+#ifdef STAT_STATFS4            /* SVR3, Dynix, Irix, AIX */
+
+# if !_AIX && !defined _SEQUENT_ && !defined DOLPHIN
+#  define f_bavail f_bfree
+# endif
+
+  if (statfs (path, &fsd, sizeof fsd, 0) < 0)
+    return;
+
+  /* Empirically, the block counts on most SVR3 and SVR3-derived
+     systems seem to always be in terms of 512-byte blocks,
+     no matter what value f_bsize has.  */
+# if _AIX || defined _CRAY
+   buf->block_size = PROPAGATE_ALL_ONES (fsd.f_bsize);
+# else
+   buf->block_size = 512;
+# endif
+
+#endif /* STAT_STATFS4 */
+
+#ifdef STAT_STATVFS            /* SVR4 */
+   /* Linux, Solaris */
+
+  if (statvfs (path, &fsd) < 0)
+    return;
+
+#if (defined(sun) || defined(__sun)) && (defined(__SVR4) || defined(__svr4__)) 
\
+       || defined(__FreeBSD__)
+  /* Solaris but not SunOS and FreeBSD */
+  buf->block_size = fsd.f_frsize;
+#else
+  /* else, including Linux */
+  buf->block_size = fsd.f_bsize;
+#endif
+
+#endif /* STAT_STATVFS */
+
+#if !defined STAT_STATFS2_FS_DATA && !defined STAT_READ_FILSYS
+                               /* !Ultrix && !SVR2 */
+  /* Linux */
+
+  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;
+
+#endif /* not STAT_STATFS2_FS_DATA && not STAT_READ_FILSYS */
+
+  buf->flags = _glibtop_sysdeps_fsusage;
+
+  /* setting additional flags is delegated */
+  _glibtop_get_fsusage_read_write(server, buf, path);
+}
+
+#if defined _AIX && defined _I386
+/* AIX PS/2 does not supply statfs.  */
+
+static int
+statfs (const char *path, struct statfs *fsb)
+{
+  struct stat stats;
+  struct dustat fsd;
+
+  if (stat (path, &stats))
+    return -1;
+  if (dustat (stats.st_dev, 0, &fsd, sizeof (fsd)))
+    return -1;
+  fsb->f_type   = 0;
+  fsb->f_bsize  = fsd.du_bsize;
+  fsb->f_blocks = fsd.du_fsize - fsd.du_isize;
+  fsb->f_bfree  = fsd.du_tfree;
+  fsb->f_bavail = fsd.du_tfree;
+  fsb->f_files  = (fsd.du_isize - 2) * fsd.du_inopb;
+  fsb->f_ffree  = fsd.du_tinode;
+  fsb->f_fsid.val[0] = fsd.du_site;
+  fsb->f_fsid.val[1] = fsd.du_pckno;
+  return 0;
+}
+
+#endif /* _AIX && _I386 */
only in patch2:
unchanged:
--- libgtop2-2.22.0.orig/sysdeps/common/mountlist.c
+++ libgtop2-2.22.0/sysdeps/common/mountlist.c
@@ -0,0 +1,622 @@
+/* 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.  */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <glib.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/types.h>
+
+#if defined(STDC_HEADERS) || defined(HAVE_STRING_H)
+#include <string.h>
+#else
+#include <strings.h>
+#endif
+
+#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);
+
+#ifdef HAVE_SYS_PARAM_H
+#include <sys/param.h>
+#endif
+
+#if defined (MOUNTED_GETFSSTAT)        /* __alpha running OSF_1 */
+#  include <sys/mount.h>
+#  include <sys/fs_types.h>
+#endif /* MOUNTED_GETFSSTAT */
+
+#ifdef MOUNTED_GETMNTENT1      /* 4.3BSD, SunOS, HP-UX, Dynix, Irix.  */
+#include <mntent.h>
+#if !defined(MOUNTED)
+#  if defined(MNT_MNTTAB)      /* HP-UX.  */
+#    define MOUNTED MNT_MNTTAB
+#  endif
+#  if defined(MNTTABNAME)      /* Dynix.  */
+#    define MOUNTED MNTTABNAME
+#  endif
+#endif
+#endif
+
+#ifdef MOUNTED_GETMNTINFO      /* 4.4BSD.  */
+#include <sys/mount.h>
+#endif
+
+#ifdef MOUNTED_GETMNT          /* Ultrix.  */
+#include <sys/mount.h>
+#include <sys/fs_types.h>
+#endif
+
+#ifdef MOUNTED_FREAD           /* SVR2.  */
+#include <mnttab.h>
+#endif
+
+#ifdef MOUNTED_FREAD_FSTYP     /* SVR3.  */
+#include <mnttab.h>
+#include <sys/fstyp.h>
+#include <sys/statfs.h>
+#endif
+
+#ifdef MOUNTED_LISTMNTENT
+#include <mntent.h>
+#endif
+
+#ifdef MOUNTED_GETMNTENT2      /* SVR4.  */
+#include <sys/mnttab.h>
+#endif
+
+#ifdef MOUNTED_VMOUNT          /* AIX.  */
+#include <fshelp.h>
+#include <sys/vfs.h>
+#endif
+
+#ifdef DOLPHIN
+/* So special that it's not worth putting this in autoconf.  */
+#undef MOUNTED_FREAD_FSTYP
+#define MOUNTED_GETMNTTBL
+#endif
+
+
+#if defined (MOUNTED_GETMNTINFO) && !defined (__NetBSD__) && !defined 
(__OpenBSD__) && !defined(__FreeBSD__)
+static const char *
+fstype_to_string (short t)
+{
+  switch (t)
+    {
+#ifdef MOUNT_PC
+    case MOUNT_PC:
+      return "pc";
+#endif
+#ifdef MOUNT_MFS
+    case MOUNT_MFS:
+      return "mfs";
+#endif
+#ifdef MOUNT_LO
+    case MOUNT_LO:
+      return "lo";
+#endif
+#ifdef MOUNT_TFS
+    case MOUNT_TFS:
+      return "tfs";
+#endif
+#ifdef MOUNT_TMP
+    case MOUNT_TMP:
+      return "tmp";
+#endif
+#ifdef MOUNT_UFS
+   case MOUNT_UFS:
+     return "ufs" ;
+#endif
+#ifdef MOUNT_NFS
+   case MOUNT_NFS:
+     return "nfs" ;
+#endif
+#ifdef MOUNT_MSDOS
+   case MOUNT_MSDOS:
+     return "msdos" ;
+#endif
+#ifdef MOUNT_LFS
+   case MOUNT_LFS:
+     return "lfs" ;
+#endif
+#ifdef MOUNT_LOFS
+   case MOUNT_LOFS:
+     return "lofs" ;
+#endif
+#ifdef MOUNT_FDESC
+   case MOUNT_FDESC:
+     return "fdesc" ;
+#endif
+#ifdef MOUNT_PORTAL
+   case MOUNT_PORTAL:
+     return "portal" ;
+#endif
+#ifdef MOUNT_NULL
+   case MOUNT_NULL:
+     return "null" ;
+#endif
+#ifdef MOUNT_UMAP
+   case MOUNT_UMAP:
+     return "umap" ;
+#endif
+#ifdef MOUNT_KERNFS
+   case MOUNT_KERNFS:
+     return "kernfs" ;
+#endif
+#ifdef MOUNT_PROCFS
+   case MOUNT_PROCFS:
+     return "procfs" ;
+#endif
+#ifdef MOUNT_AFS
+   case MOUNT_AFS:
+     return "afs" ;
+#endif
+#ifdef MOUNT_CD9660
+   case MOUNT_CD9660:
+     return "cd9660" ;
+#endif
+#ifdef MOUNT_UNION
+   case MOUNT_UNION:
+     return "union" ;
+#endif
+#ifdef MOUNT_DEVFS
+   case MOUNT_DEVFS:
+     return "devfs" ;
+#endif
+#ifdef MOUNT_EXT2FS
+   case MOUNT_EXT2FS:
+     return "ext2fs" ;
+#endif
+    default:
+      return "?";
+    }
+}
+#endif /* MOUNTED_GETMNTINFO */
+
+#ifdef MOUNTED_VMOUNT          /* AIX.  */
+static const char *
+fstype_to_string (int t)
+{
+  struct vfs_ent *e;
+
+  e = getvfsbytype (t);
+  if (!e || !e->vfsent_name)
+    return "none";
+  else
+    return e->vfsent_name;
+}
+#endif /* MOUNTED_VMOUNT */
+
+/* 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;
+
+#ifdef MOUNTED_LISTMNTENT
+  {
+    struct tabmntent *mntlist, *p;
+    struct mntent *mnt;
+    struct mount_entry *me;
+
+    /* the third and fourth arguments could be used to filter mounts,
+       but Crays doesn't seem to have any mounts that we want to
+       remove. Specifically, automount create normal NFS mounts.
+       */
+
+    if(listmntent(&mntlist, KMTAB, NULL, NULL) < 0)
+      return NULL;
+    p = mntlist;
+    while(p){
+      mnt = p->ment;
+      me = (struct mount_entry*) g_malloc(sizeof (struct mount_entry));
+      me->me_devname = g_strdup(mnt->mnt_fsname);
+      me->me_mountdir = g_strdup(mnt->mnt_dir);
+      me->me_type = g_strdup(mnt->mnt_type);
+      me->me_dev = -1;
+      me->me_next = NULL;
+      mtail->me_next = me;
+      mtail = me;
+      p = p->next;
+    }
+    freemntlist(mntlist);
+  }
+#endif
+
+#ifdef MOUNTED_GETMNTENT1   /* Linux, 4.3BSD, SunOS, HP-UX, Dynix, Irix.  */
+  {
+    const struct mntent *mnt;
+    FILE *fp;
+    const char *devopt;
+
+    fp = setmntent (MOUNTED, "r");
+    if (fp == NULL)
+      return NULL;
+
+    while ((mnt = getmntent (fp)))
+      {
+       me = g_new(struct mount_entry, 1);
+       me->me_devname = g_strdup (mnt->mnt_fsname);
+       me->me_mountdir = g_strdup (mnt->mnt_dir);
+       me->me_type = g_strdup (mnt->mnt_type);
+       devopt = strstr (mnt->mnt_opts, "dev=");
+       if (devopt)
+           me->me_dev = (dev_t) strtoull( devopt + 4, NULL, 0);
+       else
+           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;
+      }
+
+    if (endmntent (fp) == 0)
+      return NULL;
+  }
+#endif /* MOUNTED_GETMNTENT1. */
+
+#ifdef MOUNTED_GETMNTINFO      /* 4.4BSD.  */
+  {
+    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);
+#if defined(__NetBSD__) || defined(__OpenBSD__) || defined(__FreeBSD__)
+       me->me_type = g_strdup (fsp->f_fstypename);
+#else
+       me->me_type = g_strdup (fstype_to_string (fsp->f_type));
+#endif
+       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++;
+      }
+  }
+#endif /* MOUNTED_GETMNTINFO */
+
+#ifdef MOUNTED_GETMNT          /* Ultrix.  */
+  {
+    int offset = 0;
+    int val;
+    struct fs_data fsd;
+
+    while ((val = getmnt (&offset, &fsd, sizeof (fsd), NOSTAT_MANY,
+                         (char *) 0)) > 0)
+      {
+       me = (struct mount_entry *) g_malloc (sizeof (struct mount_entry));
+       me->me_devname = g_strdup (fsd.fd_req.devname);
+       me->me_mountdir = g_strdup (fsd.fd_req.path);
+       me->me_type = g_strdup (gt_names[fsd.fd_req.fstype]);
+       me->me_dev = fsd.fd_req.dev;
+       me->me_next = NULL;
+
+       /* Add to the linked list. */
+       mtail->me_next = me;
+       mtail = me;
+      }
+    if (val < 0)
+      return NULL;
+  }
+#endif /* MOUNTED_GETMNT. */
+
+#if defined (MOUNTED_GETFSSTAT)        /* __alpha running OSF_1 */
+  {
+    int numsys, counter, bufsize;
+    struct statfs *stats;
+
+    numsys = getfsstat ((struct statfs *)0, 0L, MNT_WAIT);
+    if (numsys < 0)
+      return (NULL);
+
+    bufsize = (1 + numsys) * sizeof (struct statfs);
+    stats = (struct statfs *) g_malloc (bufsize);
+    numsys = getfsstat (stats, bufsize, MNT_WAIT);
+
+    if (numsys < 0)
+      {
+       g_free (stats);
+       return (NULL);
+      }
+
+    for (counter = 0; counter < numsys; counter++)
+      {
+       me = (struct mount_entry *) g_malloc (sizeof (struct mount_entry));
+       me->me_devname = g_strdup (stats[counter].f_mntfromname);
+       me->me_mountdir = g_strdup (stats[counter].f_mntonname);
+       me->me_type = g_strdup (mnt_names[stats[counter].f_type]);
+       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;
+      }
+
+    g_free (stats);
+  }
+#endif /* MOUNTED_GETFSSTAT */
+
+#if defined (MOUNTED_FREAD) || defined (MOUNTED_FREAD_FSTYP) /* SVR[23].  */
+  {
+    struct mnttab mnt;
+    FILE *fp;
+    fp = fopen ("/etc/mnttab", "r");
+    if (fp == NULL)
+      return NULL;
+
+    while (fread (&mnt, sizeof mnt, 1, fp) > 0)
+      {
+       me = (struct mount_entry *) g_malloc (sizeof (struct mount_entry));
+#ifdef GETFSTYP                        /* SVR3.  */
+       me->me_devname = g_strdup (mnt.mt_dev);
+#else
+       me->me_devname = g_strdup_printf("/dev/%s", mnt.mt_dev);
+#endif
+       me->me_mountdir = g_strdup (mnt.mt_filsys);
+       me->me_dev = (dev_t) -1;        /* Magic; means not known yet. */
+
+#ifdef GETFSTYP                        /* SVR3.  */
+         {
+           struct statfs fsd;
+           char typebuf[FSTYPSZ];
+
+           if (statfs (me->me_mountdir, &fsd, sizeof fsd, 0) != -1
+               && sysfs (GETFSTYP, fsd.f_fstyp, typebuf) != -1)
+             me->me_type = g_strdup (typebuf);
+         }
+#else
+       me->me_type = g_strdup ("");
+#endif
+
+       me->me_next = NULL;
+
+       /* Add to the linked list. */
+       mtail->me_next = me;
+       mtail = me;
+      }
+
+    if (fclose (fp) == EOF)
+      return NULL;
+  }
+#endif /* MOUNTED_FREAD || MOUNTED_FREAD_FSTYP.  */
+
+#ifdef MOUNTED_GETMNTTBL       /* DolphinOS goes it's own way */
+  {
+    struct mntent **mnttbl=getmnttbl(),**ent;
+    for (ent=mnttbl;*ent;ent++)
+      {
+       me = (struct mount_entry *) g_malloc (sizeof (struct mount_entry));
+       me->me_devname = g_strdup ( (*ent)->mt_resource);
+       me->me_mountdir = g_strdup( (*ent)->mt_directory);
+       me->me_type =  g_strdup ((*ent)->mt_fstype);
+       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;
+      }
+    endmnttbl();
+  }
+#endif
+
+#ifdef MOUNTED_GETMNTENT2      /* SVR4.  */
+  {
+    struct mnttab mnt;
+    FILE *fp;
+    int ret;
+
+    fp = fopen (MNTTAB, "r");
+    if (fp == NULL)
+      return NULL;
+
+    while ((ret = getmntent (fp, &mnt)) == 0)
+      {
+       me = (struct mount_entry *) g_malloc (sizeof (struct mount_entry));
+       me->me_devname = g_strdup (mnt.mnt_special);
+       me->me_mountdir = g_strdup (mnt.mnt_mountp);
+       me->me_type = g_strdup (mnt.mnt_fstype);
+       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;
+      }
+
+   if (fclose (fp) == EOF)
+      return NULL;
+    if (ret > 0)
+      return NULL;
+  }
+#endif /* MOUNTED_GETMNTENT2.  */
+
+#ifdef MOUNTED_VMOUNT          /* AIX.  */
+  {
+    int bufsize;
+    char *entries, *thisent;
+    struct vmount *vmp;
+
+    /* Ask how many bytes to allocate for the mounted filesystem info.  */
+    mntctl (MCTL_QUERY, sizeof bufsize, (struct vmount *) &bufsize);
+    entries = g_malloc (bufsize);
+
+    /* Get the list of mounted filesystems.  */
+    mntctl (MCTL_QUERY, bufsize, (struct vmount *) entries);
+
+    for (thisent = entries; thisent < entries + bufsize;
+        thisent += vmp->vmt_length)
+      {
+       vmp = (struct vmount *) thisent;
+       me = (struct mount_entry *) g_malloc (sizeof (struct mount_entry));
+       if (vmp->vmt_flags & MNT_REMOTE)
+         {
+           /* Prepend the remote pathname.  */
+           me->me_devname = \
+             g_strdup_printf("%s:%s",
+                             thisent + vmp->vmt_data[VMT_HOSTNAME].vmt_off
+                             thisent + vmp->vmt_data[VMT_OBJECT  ].vmt_off);
+         }
+       else
+         {
+           me->me_devname = g_strdup (thisent +
+                                     vmp->vmt_data[VMT_OBJECT].vmt_off);
+         }
+       me->me_mountdir = g_strdup (thisent + vmp->vmt_data[VMT_STUB].vmt_off);
+       me->me_type = g_strdup (fstype_to_string (vmp->vmt_gfstype));
+       me->me_dev = (dev_t) -1; /* vmt_fsid might be the info we want.  */
+       me->me_next = NULL;
+
+       /* Add to the linked list. */
+       mtail->me_next = me;
+       mtail = me;
+      }
+    g_free (entries);
+  }
+#endif /* MOUNTED_VMOUNT. */
+
+  /* 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[][12] = {
+               "autofs",
+               "binfmt_misc",
+               "ctfs",
+               "devfs",
+               "devpts",
+               "fusectl",
+               "linprocfs",
+               "mfs",
+               "mntfs",
+               "mqueue",
+               "none",
+               "nsfd",
+               "objfs",
+               "openpromfs",
+               "proc",
+               "procfs",
+               "securityfs",
+               "supermount",
+               "sysfs",
+               "tmpfs",
+               "unknown",
+               "usbdevfs",
+               "usbfs"
+       };
+
+       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);
+}

Reply via email to