Bug#473211: libgtop2: FTBFS on GNU/kFreeBSD

Petr Salinger Petr.Salinger at seznam.cz
Sat Mar 29 10:03:22 UTC 2008


Package: libgtop2
Severity: important
Version: 2.22.0-1
Tags: patch
User: glibc-bsd-devel at lists.alioth.debian.org
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
-------------- next part --------------
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
+ at LIBGTOP_SYSDEPS_PRIVATE_FSUSAGE_FALSE@@LIBGTOP_SYSDEPS_PRIVATE_MOUNTLIST_FALSE at am_libgtop_common_2_0_la_OBJECTS = error.lo \
+ at LIBGTOP_SYSDEPS_PRIVATE_FSUSAGE_FALSE@@LIBGTOP_SYSDEPS_PRIVATE_MOUNTLIST_FALSE@	gnuslib.lo \
+ at LIBGTOP_SYSDEPS_PRIVATE_FSUSAGE_FALSE@@LIBGTOP_SYSDEPS_PRIVATE_MOUNTLIST_FALSE@	procargs.lo \
+ at LIBGTOP_SYSDEPS_PRIVATE_FSUSAGE_FALSE@@LIBGTOP_SYSDEPS_PRIVATE_MOUNTLIST_FALSE@	default.lo \
+ at LIBGTOP_SYSDEPS_PRIVATE_FSUSAGE_FALSE@@LIBGTOP_SYSDEPS_PRIVATE_MOUNTLIST_FALSE@	mountlist.lo \
+ at LIBGTOP_SYSDEPS_PRIVATE_FSUSAGE_FALSE@@LIBGTOP_SYSDEPS_PRIVATE_MOUNTLIST_FALSE@	fsusage.lo
+ at LIBGTOP_SYSDEPS_PRIVATE_FSUSAGE_FALSE@@LIBGTOP_SYSDEPS_PRIVATE_MOUNTLIST_TRUE at am_libgtop_common_2_0_la_OBJECTS = error.lo \
+ at LIBGTOP_SYSDEPS_PRIVATE_FSUSAGE_FALSE@@LIBGTOP_SYSDEPS_PRIVATE_MOUNTLIST_TRUE@	gnuslib.lo \
+ at LIBGTOP_SYSDEPS_PRIVATE_FSUSAGE_FALSE@@LIBGTOP_SYSDEPS_PRIVATE_MOUNTLIST_TRUE@	procargs.lo \
+ at LIBGTOP_SYSDEPS_PRIVATE_FSUSAGE_FALSE@@LIBGTOP_SYSDEPS_PRIVATE_MOUNTLIST_TRUE@	default.lo \
+ at LIBGTOP_SYSDEPS_PRIVATE_FSUSAGE_FALSE@@LIBGTOP_SYSDEPS_PRIVATE_MOUNTLIST_TRUE@	fsusage.lo
+ at LIBGTOP_SYSDEPS_PRIVATE_FSUSAGE_TRUE@@LIBGTOP_SYSDEPS_PRIVATE_MOUNTLIST_FALSE at am_libgtop_common_2_0_la_OBJECTS = error.lo \
+ at LIBGTOP_SYSDEPS_PRIVATE_FSUSAGE_TRUE@@LIBGTOP_SYSDEPS_PRIVATE_MOUNTLIST_FALSE@	gnuslib.lo \
+ at LIBGTOP_SYSDEPS_PRIVATE_FSUSAGE_TRUE@@LIBGTOP_SYSDEPS_PRIVATE_MOUNTLIST_FALSE@	procargs.lo \
+ at LIBGTOP_SYSDEPS_PRIVATE_FSUSAGE_TRUE@@LIBGTOP_SYSDEPS_PRIVATE_MOUNTLIST_FALSE@	default.lo \
+ at LIBGTOP_SYSDEPS_PRIVATE_FSUSAGE_TRUE@@LIBGTOP_SYSDEPS_PRIVATE_MOUNTLIST_FALSE@	mountlist.lo
+ at LIBGTOP_SYSDEPS_PRIVATE_FSUSAGE_TRUE@@LIBGTOP_SYSDEPS_PRIVATE_MOUNTLIST_TRUE at am_libgtop_common_2_0_la_OBJECTS = error.lo \
+ at LIBGTOP_SYSDEPS_PRIVATE_FSUSAGE_TRUE@@LIBGTOP_SYSDEPS_PRIVATE_MOUNTLIST_TRUE@	gnuslib.lo \
+ at LIBGTOP_SYSDEPS_PRIVATE_FSUSAGE_TRUE@@LIBGTOP_SYSDEPS_PRIVATE_MOUNTLIST_TRUE@	procargs.lo \
+ at LIBGTOP_SYSDEPS_PRIVATE_FSUSAGE_TRUE@@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
+ at LIBGTOP_SYSDEPS_PRIVATE_FSUSAGE_FALSE@@LIBGTOP_SYSDEPS_PRIVATE_MOUNTLIST_FALSE at libgtop_common_2_0_la_SOURCES = error.c gnuslib.c \
+ at LIBGTOP_SYSDEPS_PRIVATE_FSUSAGE_FALSE@@LIBGTOP_SYSDEPS_PRIVATE_MOUNTLIST_FALSE@                                  procargs.c \
+ at LIBGTOP_SYSDEPS_PRIVATE_FSUSAGE_FALSE@@LIBGTOP_SYSDEPS_PRIVATE_MOUNTLIST_FALSE@				  default.c \
+ at LIBGTOP_SYSDEPS_PRIVATE_FSUSAGE_FALSE@@LIBGTOP_SYSDEPS_PRIVATE_MOUNTLIST_FALSE@				  mountlist.c \
+ at LIBGTOP_SYSDEPS_PRIVATE_FSUSAGE_FALSE@@LIBGTOP_SYSDEPS_PRIVATE_MOUNTLIST_FALSE@				  fsusage.c
+
+ at LIBGTOP_SYSDEPS_PRIVATE_FSUSAGE_FALSE@@LIBGTOP_SYSDEPS_PRIVATE_MOUNTLIST_TRUE at libgtop_common_2_0_la_SOURCES = error.c gnuslib.c \
+ at LIBGTOP_SYSDEPS_PRIVATE_FSUSAGE_FALSE@@LIBGTOP_SYSDEPS_PRIVATE_MOUNTLIST_TRUE@                                  procargs.c \
+ at LIBGTOP_SYSDEPS_PRIVATE_FSUSAGE_FALSE@@LIBGTOP_SYSDEPS_PRIVATE_MOUNTLIST_TRUE@				  default.c \
+ at LIBGTOP_SYSDEPS_PRIVATE_FSUSAGE_FALSE@@LIBGTOP_SYSDEPS_PRIVATE_MOUNTLIST_TRUE@				  fsusage.c
+
+ at LIBGTOP_SYSDEPS_PRIVATE_FSUSAGE_TRUE@@LIBGTOP_SYSDEPS_PRIVATE_MOUNTLIST_FALSE at libgtop_common_2_0_la_SOURCES = error.c gnuslib.c \
+ at LIBGTOP_SYSDEPS_PRIVATE_FSUSAGE_TRUE@@LIBGTOP_SYSDEPS_PRIVATE_MOUNTLIST_FALSE@                                  procargs.c \
+ at LIBGTOP_SYSDEPS_PRIVATE_FSUSAGE_TRUE@@LIBGTOP_SYSDEPS_PRIVATE_MOUNTLIST_FALSE@				  default.c \
+ at LIBGTOP_SYSDEPS_PRIVATE_FSUSAGE_TRUE@@LIBGTOP_SYSDEPS_PRIVATE_MOUNTLIST_FALSE@				  mountlist.c
+
+ at LIBGTOP_SYSDEPS_PRIVATE_FSUSAGE_TRUE@@LIBGTOP_SYSDEPS_PRIVATE_MOUNTLIST_TRUE at libgtop_common_2_0_la_SOURCES = error.c gnuslib.c \
+ at LIBGTOP_SYSDEPS_PRIVATE_FSUSAGE_TRUE@@LIBGTOP_SYSDEPS_PRIVATE_MOUNTLIST_TRUE@                                  procargs.c \
+ at LIBGTOP_SYSDEPS_PRIVATE_FSUSAGE_TRUE@@LIBGTOP_SYSDEPS_PRIVATE_MOUNTLIST_TRUE@				  default.c
 
 
 # libgtop_common_2_0_la_LDFLAGS	= $(LT_VERSION_INFO)
@@ -348,7 +384,9 @@
 
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/default.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/error.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/fsusage.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/gnuslib.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/mountlist.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/procargs.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/sysdeps_suid.Plo at am__quote@
 
@@ -550,10 +588,6 @@
 	uninstall-info-am
 
 
- at LIBGTOP_SYSDEPS_PRIVATE_MOUNTLIST_FALSE@	libgtop_common_2_0_la_SOURCES += mountlist.c
-
- at LIBGTOP_SYSDEPS_PRIVATE_FSUSAGE_FALSE@	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);
+}


More information about the pkg-gnome-maintainers mailing list