[pacman-dev] [PATCH] Add function to list mount points
Allan McRae
allan at archlinux.org
Sun Oct 31 08:53:49 EDT 2010
The helper function _alpm_mount_list provides a relatively portable
interface to obtaining a list of mount pints on a system. This will
be useful in checking for disk space availability when installing
packages.
Signed-off-by: Allan McRae <allan at archlinux.org>
---
I have not tested the HAVE_GETMNTINFO path as that requires BSD4.4, OSX or NetBSD 3.0.
However, it is taken from various example code on the internet so should work...
configure.ac | 6 +++---
lib/libalpm/util.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++++
lib/libalpm/util.h | 1 +
3 files changed, 53 insertions(+), 3 deletions(-)
diff --git a/configure.ac b/configure.ac
index 6f601f4..5bbd761 100644
--- a/configure.ac
+++ b/configure.ac
@@ -185,9 +185,9 @@ AC_FUNC_FORK
AC_FUNC_LSTAT_FOLLOWS_SLASHED_SYMLINK
AC_FUNC_MKTIME
AC_TYPE_SIGNAL
-AC_CHECK_FUNCS([geteuid realpath regcomp strcasecmp \
- strndup strrchr strsep swprintf \
- wcwidth uname])
+AC_CHECK_FUNCS([geteuid getmntent getmntinfo realpath \
+ regcomp strcasecmp strndup strrchr \
+ strsep swprintf wcwidth uname])
# Enable large file support if available
AC_SYS_LARGEFILE
diff --git a/lib/libalpm/util.c b/lib/libalpm/util.c
index 2661241..9b7454f 100644
--- a/lib/libalpm/util.c
+++ b/lib/libalpm/util.c
@@ -39,6 +39,15 @@
#include <sys/stat.h>
#include <sys/wait.h>
+#ifdef HAVE_GETMNTENT
+#include <mntent.h>
+#endif
+
+#ifdef HAVE_GETMNTINFO
+#include <sys/mount.h>
+#include <sys/statvfs.h>
+#endif
+
/* libarchive */
#include <archive.h>
#include <archive_entry.h>
@@ -845,4 +854,44 @@ int _alpm_splitname(const char *target, pmpkg_t *pkg)
return(0);
}
+alpm_list_t *_alpm_mount_list()
+{
+ alpm_list_t *mount_points = NULL;
+
+#ifdef HAVE_GETMNTENT
+ struct mntent *mnt;
+ FILE *fp;
+
+ fp = setmntent(MOUNTED, "r");
+
+ if (fp == NULL) {
+ return NULL;
+ }
+
+ while((mnt = getmntent (fp))) {
+ mount_points = alpm_list_add(mount_points, strdup(mnt->mnt_dir));
+ }
+
+ endmntent(fp);
+#endif
+
+#ifdef HAVE_GETMNTINFO
+ struct statvfs *fsp;
+ int entries;
+
+ entries = getmntinfo (&fsp, MNT_NOWAIT);
+
+ if (entries < 0) {
+ return NULL;
+ }
+
+ for (; entries-- > 0; fsp++) {
+ mount_points = alpm_list_add(mount_points, strdup(fsp->f_mntonname));
+ }
+#endif
+
+ mount_points = alpm_list_msort(mount_points, alpm_list_count(mount_points), _alpm_str_cmp);
+ return(mount_points);
+}
+
/* vim: set ts=2 sw=2 noet: */
diff --git a/lib/libalpm/util.h b/lib/libalpm/util.h
index 75e2c45..0d2ac79 100644
--- a/lib/libalpm/util.h
+++ b/lib/libalpm/util.h
@@ -78,6 +78,7 @@ int _alpm_lstat(const char *path, struct stat *buf);
int _alpm_test_md5sum(const char *filepath, const char *md5sum);
char *_alpm_archive_fgets(char *line, size_t size, struct archive *a);
int _alpm_splitname(const char *target, pmpkg_t *pkg);
+alpm_list_t *_alpm_mount_list();
#ifndef HAVE_STRSEP
char *strsep(char **, const char *);
--
1.7.3.2
More information about the pacman-dev
mailing list