summaryrefslogtreecommitdiff
path: root/Utility
diff options
context:
space:
mode:
authorGravatar Joey Hess <joeyh@joeyh.name>2016-02-15 11:13:26 -0400
committerGravatar Joey Hess <joeyh@joeyh.name>2016-02-15 11:14:37 -0400
commit96e893d718dc6bad7b2abdefce886694f986c367 (patch)
treee74e9cd0916b02c418d7eb78a1569f3ea94809fa /Utility
parent6ab78795eaa25bb0e42daf7980df2d30f397665c (diff)
remove Utility.Mounts et al; moved to mountpoints package
Diffstat (limited to 'Utility')
-rw-r--r--Utility/Mounts.hs21
-rw-r--r--Utility/Mounts.hsc97
-rw-r--r--Utility/libmounts.c103
-rw-r--r--Utility/libmounts.h38
4 files changed, 21 insertions, 238 deletions
diff --git a/Utility/Mounts.hs b/Utility/Mounts.hs
new file mode 100644
index 000000000..192da31a1
--- /dev/null
+++ b/Utility/Mounts.hs
@@ -0,0 +1,21 @@
+{- portability shim for System.MountPoints
+ -
+ - Copyright 2016 Joey Hess <id@joeyh.name>
+ -
+ - License: BSD-2-clause
+ -}
+
+{-# LANGUAGE CPP #-}
+{-# OPTIONS_GHC -fno-warn-tabs #-}
+
+module Utility.Mounts (getMounts, Mntent(..)) where
+
+import qualified System.MountPoints
+import System.MountPoints (Mntent(..))
+
+getMounts :: IO [Mntent]
+#ifndef __ANDROID__
+getMounts = System.MountPoints.getMounts
+#else
+getMounts = System.MountPoints.getProcMounts
+#endif
diff --git a/Utility/Mounts.hsc b/Utility/Mounts.hsc
deleted file mode 100644
index 3f121233a..000000000
--- a/Utility/Mounts.hsc
+++ /dev/null
@@ -1,97 +0,0 @@
-{- Interface to mtab (and fstab)
- -
- - Deprecated; moving to mountpoints library on hackage.
- -
- - Derived from hsshellscript, originally written by
- - Volker Wysk <hsss@volker-wysk.de>
- -
- - Modified to support BSD, Mac OS X, and Android by
- - Joey Hess <id@joeyh.name>
- -
- - Licensed under the GNU LGPL version 2.1 or higher.
- -
- -}
-
-{-# LANGUAGE ForeignFunctionInterface #-}
-
-module Utility.Mounts (
- Mntent(..),
- getMounts
-) where
-
-#ifndef __ANDROID__
-import Control.Monad
-import Foreign
-import Foreign.C
-#include "libmounts.h"
-#else
-import Utility.Exception
-import Data.Maybe
-import Control.Applicative
-#endif
-import Prelude
-
-{- This is a stripped down mntent, containing only
- - fields available everywhere. -}
-data Mntent = Mntent
- { mnt_fsname :: String
- , mnt_dir :: FilePath
- , mnt_type :: String
- } deriving (Show, Eq, Ord)
-
-#ifndef __ANDROID__
-
-getMounts :: IO [Mntent]
-getMounts = do
- h <- c_mounts_start
- when (h == nullPtr) $
- throwErrno "getMounts"
- mntent <- getmntent h []
- _ <- c_mounts_end h
- return mntent
-
- where
- getmntent h c = do
- ptr <- c_mounts_next h
- if (ptr == nullPtr)
- then return $ reverse c
- else do
- mnt_fsname_str <- #{peek struct mntent, mnt_fsname} ptr >>= peekCString
- mnt_dir_str <- #{peek struct mntent, mnt_dir} ptr >>= peekCString
- mnt_type_str <- #{peek struct mntent, mnt_type} ptr >>= peekCString
- let ent = Mntent
- { mnt_fsname = mnt_fsname_str
- , mnt_dir = mnt_dir_str
- , mnt_type = mnt_type_str
- }
- getmntent h (ent:c)
-
-{- Using unsafe imports because the C functions are belived to never block.
- - Note that getmntinfo is called with MNT_NOWAIT to avoid possibly blocking;
- - while getmntent only accesses a file in /etc (or /proc) that should not
- - block. -}
-foreign import ccall unsafe "libmounts.h mounts_start" c_mounts_start
- :: IO (Ptr ())
-foreign import ccall unsafe "libmounts.h mounts_next" c_mounts_next
- :: Ptr () -> IO (Ptr ())
-foreign import ccall unsafe "libmounts.h mounts_end" c_mounts_end
- :: Ptr () -> IO CInt
-
-#else
-
-{- Android does not support getmntent (well, it's a no-op stub in Bionic).
- -
- - But, the linux kernel's /proc/mounts is available to be parsed.
- -}
-getMounts :: IO [Mntent]
-getMounts = catchDefaultIO [] $
- mapMaybe (parse . words) . lines <$> readFile "/proc/mounts"
- where
- parse (device:mountpoint:fstype:_rest) = Just $ Mntent
- { mnt_fsname = device
- , mnt_dir = mountpoint
- , mnt_type = fstype
- }
- parse _ = Nothing
-
-#endif
diff --git a/Utility/libmounts.c b/Utility/libmounts.c
deleted file mode 100644
index c469d7710..000000000
--- a/Utility/libmounts.c
+++ /dev/null
@@ -1,103 +0,0 @@
-/* mounted filesystems, C mini-library
- *
- * Copyright (c) 1980, 1989, 1993, 1994
- * The Regents of the University of California. All rights reserved.
- * Copyright (c) 2001
- * David Rufino <daverufino@btinternet.com>
- * Copyright 2012
- * Joey Hess <id@joeyh.name>
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-#include "libmounts.h"
-
-#ifdef GETMNTENT
-/* direct passthrough the getmntent */
-FILE *mounts_start (void) {
- return setmntent("/etc/mtab", "r");
-}
-int mounts_end (FILE *fp) {
- return endmntent(fp);
-}
-struct mntent *mounts_next (FILE *fp) {
- return getmntent(fp);
-}
-#endif
-
-#ifdef GETMNTINFO
-/* getmntent emulation using getmntinfo */
-FILE *mounts_start (void) {
- return ((FILE *)0x1); /* dummy non-NULL FILE pointer, not used */
-}
-int mounts_end (FILE *fp) {
- return 1;
-}
-
-static struct mntent _mntent;
-
-static struct mntent *statfs_to_mntent (struct statfs *mntbuf) {
- _mntent.mnt_fsname = mntbuf->f_mntfromname;
- _mntent.mnt_dir = mntbuf->f_mntonname;
- _mntent.mnt_type = mntbuf->f_fstypename;
-
- _mntent.mnt_opts = NULL;
- _mntent.mnt_freq = 0;
- _mntent.mnt_passno = 0;
-
- return (&_mntent);
-}
-
-static int pos = -1;
-static int mntsize = -1;
-struct statfs *mntbuf = NULL;
-
-struct mntent *mounts_next (FILE *fp) {
-
- if (pos == -1 || mntsize == -1)
- mntsize = getmntinfo(&mntbuf, MNT_NOWAIT);
- ++pos;
- if (pos == mntsize) {
- pos = mntsize = -1;
- mntbuf = NULL;
- return NULL;
- }
-
- return (statfs_to_mntent(&mntbuf[pos]));
-}
-#endif
-
-#ifdef UNKNOWN
-/* dummy, do-nothing version */
-FILE *mounts_start (void) {
- return ((FILE *)0x1);
-}
-int mounts_end (FILE *fp) {
- return 1;
-}
-struct mntent *mounts_next (FILE *fp) {
- return NULL;
-}
-#endif
diff --git a/Utility/libmounts.h b/Utility/libmounts.h
deleted file mode 100644
index 24df55f31..000000000
--- a/Utility/libmounts.h
+++ /dev/null
@@ -1,38 +0,0 @@
-/* Include appropriate headers for the OS, and define what will be used. */
-#if defined (__FreeBSD__) || defined (__APPLE__)
-# include <sys/param.h>
-# include <sys/ucred.h>
-# include <sys/mount.h>
-# define GETMNTINFO
-#else
-#if defined __ANDROID__
-/* Android is handled by the Haskell code, not here. */
-# define UNKNOWN
-#else
-#if defined (__linux__) || defined (__FreeBSD_kernel__)
-/* Linux or Debian kFreeBSD */
-#include <mntent.h>
-# define GETMNTENT
-#else
-# warning mounts listing code not available for this OS
-# define UNKNOWN
-#endif
-#endif
-#endif
-
-#include <stdio.h>
-
-#ifndef GETMNTENT
-struct mntent {
- char *mnt_fsname;
- char *mnt_dir;
- char *mnt_type;
- char *mnt_opts; /* not filled in */
- int mnt_freq; /* not filled in */
- int mnt_passno; /* not filled in */
-};
-#endif
-
-FILE *mounts_start (void);
-int mounts_end (FILE *fp);
-struct mntent *mounts_next (FILE *fp);