summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDan McGee <dan@archlinux.org>2012-01-19 23:21:06 +0100
committerDan McGee <dan@archlinux.org>2012-01-19 23:28:04 +0100
commit1eb40c83287b07ac7428ad2d58504f386fad98f1 (patch)
treef677ff39b387122ea9a528f45dfb4b7490211c2a
parent562109c0e8717eaac3b9078271c4ca4f82abfecd (diff)
downloadpacman-1eb40c83287b07ac7428ad2d58504f386fad98f1.tar.gz
pacman-1eb40c83287b07ac7428ad2d58504f386fad98f1.tar.xz
Add diskspace checking support for Solaris/Illumos
Was able to get my hands on one of these boxes today, so add yet another new way of doing this. I'm glad these calls are so standardized. This was compile tested on Linux and Illumos and seems to still be working in both places. Signed-off-by: Dan McGee <dan@archlinux.org>
-rw-r--r--configure.ac3
-rw-r--r--lib/libalpm/diskspace.c54
2 files changed, 51 insertions, 6 deletions
diff --git a/configure.ac b/configure.ac
index 0de908a3..a8b142ea 100644
--- a/configure.ac
+++ b/configure.ac
@@ -173,7 +173,8 @@ AM_CONDITIONAL([HAVE_LIBGPGME], [test "x$with_gpgme" = "xyes"])
# Checks for header files.
AC_CHECK_HEADERS([fcntl.h float.h glob.h libintl.h limits.h locale.h \
- mntent.h stddef.h string.h sys/ioctl.h sys/mount.h \
+ mntent.h stddef.h string.h sys/ioctl.h \
+ sys/mnttab.h sys/mount.h \
sys/param.h sys/statvfs.h sys/time.h sys/types.h \
sys/ucred.h syslog.h termios.h wchar.h])
diff --git a/lib/libalpm/diskspace.c b/lib/libalpm/diskspace.c
index fe2036d5..4127153d 100644
--- a/lib/libalpm/diskspace.c
+++ b/lib/libalpm/diskspace.c
@@ -1,7 +1,7 @@
/*
* diskspace.c
*
- * Copyright (c) 2010-2011 Pacman Development Team <pacman-dev@archlinux.org>
+ * Copyright (c) 2010-2012 Pacman Development Team <pacman-dev@archlinux.org>
*
* 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
@@ -19,10 +19,15 @@
#include "config.h"
+#include <stdio.h>
#include <errno.h>
+
#if defined(HAVE_MNTENT_H)
#include <mntent.h>
#endif
+#if defined(HAVE_MNTTAB_H)
+#include <mnttab.h>
+#endif
#if defined(HAVE_SYS_STATVFS_H)
#include <sys/statvfs.h>
#endif
@@ -60,10 +65,10 @@ static alpm_list_t *mount_point_list(alpm_handle_t *handle)
alpm_list_t *mount_points = NULL, *ptr;
alpm_mountpoint_t *mp;
-#if defined HAVE_GETMNTENT
+#if defined(HAVE_GETMNTENT) && defined(HAVE_MNTENT_H)
+ /* Linux */
struct mntent *mnt;
FILE *fp;
- struct statvfs fsp;
fp = setmntent(MOUNTED, "r");
@@ -72,8 +77,10 @@ static alpm_list_t *mount_point_list(alpm_handle_t *handle)
}
while((mnt = getmntent(fp))) {
+ struct statvfs fsp;
if(!mnt) {
- _alpm_log(handle, ALPM_LOG_WARNING, _("could not get filesystem information\n"));
+ _alpm_log(handle, ALPM_LOG_WARNING,
+ _("could not get filesystem information\n"));
continue;
}
if(statvfs(mnt->mnt_dir, &fsp) != 0) {
@@ -93,7 +100,44 @@ static alpm_list_t *mount_point_list(alpm_handle_t *handle)
}
endmntent(fp);
-#elif defined HAVE_GETMNTINFO
+#elif defined(HAVE_GETMNTENT) && defined(HAVE_MNTTAB_H)
+ /* Solaris, Illumos */
+ struct mnttab mnt;
+ FILE *fp;
+ int ret;
+
+ fp = fopen("/etc/mnttab", "r");
+
+ if(fp == NULL) {
+ return NULL;
+ }
+
+ while((ret = getmntent(fp, &mnt)) == 0) {
+ struct statvfs fsp;
+ if(statvfs(mnt->mnt_mountp, &fsp) != 0) {
+ _alpm_log(handle, ALPM_LOG_WARNING,
+ _("could not get filesystem information for %s: %s\n"),
+ mnt->mnt_mountp, strerror(errno));
+ continue;
+ }
+
+ CALLOC(mp, 1, sizeof(alpm_mountpoint_t), RET_ERR(handle, ALPM_ERR_MEMORY, NULL));
+ mp->mount_dir = strdup(mnt->mnt_mountp);
+ mp->mount_dir_len = strlen(mp->mount_dir);
+ memcpy(&(mp->fsp), &fsp, sizeof(struct statvfs));
+ mp->read_only = fsp.f_flag & ST_RDONLY;
+
+ mount_points = alpm_list_add(mount_points, mp);
+ }
+ /* -1 == EOF */
+ if(ret != -1) {
+ _alpm_log(handle, ALPM_LOG_WARNING,
+ _("could not get filesystem information\n"));
+ }
+
+ fclose(fp);
+#elif defined(HAVE_GETMNTINFO)
+ /* FreeBSD (statfs), NetBSD (statvfs), OpenBSD (statfs), OS X (statfs) */
int entries;
FSSTATSTYPE *fsp;