diff --git a/Utility/Mounts.hs b/Utility/Mounts.hs new file mode 100644 index 0000000000..192da31a1c --- /dev/null +++ b/Utility/Mounts.hs @@ -0,0 +1,21 @@ +{- portability shim for System.MountPoints + - + - Copyright 2016 Joey Hess + - + - 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 3f121233ab..0000000000 --- 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 - - - - Modified to support BSD, Mac OS X, and Android by - - Joey Hess - - - - 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 c469d77103..0000000000 --- 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 - * Copyright 2012 - * Joey Hess - * - * 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 24df55f310..0000000000 --- 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 -# include -# include -# 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 -# define GETMNTENT -#else -# warning mounts listing code not available for this OS -# define UNKNOWN -#endif -#endif -#endif - -#include - -#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); diff --git a/debian/copyright b/debian/copyright index 5f80d40507..4f89d811bc 100644 --- a/debian/copyright +++ b/debian/copyright @@ -35,51 +35,11 @@ Copyright: 2007 Henrik Nyh License: other Free to modify and redistribute with due credit, and obviously free to use. -Files: Utility/Mounts.hsc -Copyright: Volker Wysk -License: LGPL-2.1+ - Files: Annex/DirHashes.hs Copyright: 2001 Ian Lynagh 2010-2015 Joey Hess License: GPL-3+ -Files: Utility/libmounts.c -Copyright: 1980, 1989, 1993, 1994 The Regents of the University of California - 2001 David Rufino - 2012 Joey Hess -License: BSD-3-clause - * Copyright (c) 1980, 1989, 1993, 1994 - * The Regents of the University of California. All rights reserved. - * Copyright (c) 2001 - * David Rufino - * Copyright 2012 - * Joey Hess - * - * 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. - Files: static/jquery* Copyright: © 2005-2011 by John Resig, Branden Aaron & Jörn Zaefferer © 2011 The Dojo Foundation @@ -135,11 +95,6 @@ License: GPL-3+ this package's source, or in /usr/share/common-licenses/GPL-3 on Debian systems. -License: LGPL-2.1+ - The full text of version 2.1 of the LGPL is distributed as doc/license/LGPL - in this package's source, or in /usr/share/common-licenses/LGPL-2.1 - on Debian systems. - License: BSD-2-clause Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions diff --git a/git-annex.cabal b/git-annex.cabal index fa496d8e01..4edbd21c3b 100644 --- a/git-annex.cabal +++ b/git-annex.cabal @@ -144,9 +144,8 @@ Executable git-annex else Build-Depends: unix -- Need to list these because they're generated from .hsc files. - Other-Modules: Utility.Touch Utility.Mounts + Other-Modules: Utility.Touch Include-Dirs: Utility - C-Sources: Utility/libdiskfree.c Utility/libmounts.c CPP-Options: -DWITH_CLIBS if flag(TestSuite) @@ -163,7 +162,7 @@ Executable git-annex CPP-Options: -DWITH_WEBDAV if flag(Assistant) && ! os(solaris) - Build-Depends: dns + Build-Depends: dns, mountpoints CPP-Options: -DWITH_ASSISTANT if flag(Assistant)