summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJustin Lecher <jlec@gentoo.org>2010-11-19 18:53:47 +0000
committerJustin Lecher <jlec@gentoo.org>2010-11-19 18:53:47 +0000
commit938281d2444d58c4915cd3a754798580f28f6861 (patch)
treedb6a27e89004827aaa282d506963f5c4a3f68576 /sys-fs/e2fsprogs
parentbump a new snapshot (diff)
downloadhistorical-938281d2444d58c4915cd3a754798580f28f6861.tar.gz
historical-938281d2444d58c4915cd3a754798580f28f6861.tar.bz2
historical-938281d2444d58c4915cd3a754798580f28f6861.zip
Import Prefix Changes
Package-Manager: portage-2.2.0_alpha4/cvs/Linux x86_64
Diffstat (limited to 'sys-fs/e2fsprogs')
-rw-r--r--sys-fs/e2fsprogs/ChangeLog12
-rw-r--r--sys-fs/e2fsprogs/e2fsprogs-1.41.12-r1.ebuild169
-rw-r--r--sys-fs/e2fsprogs/files/e2fsprogs-1.41-mint.patch1947
-rw-r--r--sys-fs/e2fsprogs/files/e2fsprogs-1.41.12-darwin-makefile.patch101
-rw-r--r--sys-fs/e2fsprogs/files/e2fsprogs-1.41.12-darwin-no-mntent.patch27
-rw-r--r--sys-fs/e2fsprogs/files/e2fsprogs-1.41.4-darwin-no-mntent.patch32
-rw-r--r--sys-fs/e2fsprogs/files/e2fsprogs-1.41.7-mint-blkid.patch43
7 files changed, 2330 insertions, 1 deletions
diff --git a/sys-fs/e2fsprogs/ChangeLog b/sys-fs/e2fsprogs/ChangeLog
index 5056a5b4a096..d0178625c1d1 100644
--- a/sys-fs/e2fsprogs/ChangeLog
+++ b/sys-fs/e2fsprogs/ChangeLog
@@ -1,6 +1,16 @@
# ChangeLog for sys-fs/e2fsprogs
# Copyright 1999-2010 Gentoo Foundation; Distributed under the GPL v2
-# $Header: /var/cvsroot/gentoo-x86/sys-fs/e2fsprogs/ChangeLog,v 1.224 2010/10/09 17:11:27 armin76 Exp $
+# $Header: /var/cvsroot/gentoo-x86/sys-fs/e2fsprogs/ChangeLog,v 1.225 2010/11/19 18:49:02 jlec Exp $
+
+*e2fsprogs-1.41.12-r1 (19 Nov 2010)
+
+ 19 Nov 2010; Justin Lecher <jlec@gentoo.org>
+ +files/e2fsprogs-1.41.4-darwin-no-mntent.patch,
+ +files/e2fsprogs-1.41.7-mint-blkid.patch, +e2fsprogs-1.41.12-r1.ebuild,
+ +files/e2fsprogs-1.41.12-darwin-makefile.patch,
+ +files/e2fsprogs-1.41.12-darwin-no-mntent.patch,
+ +files/e2fsprogs-1.41-mint.patch:
+ Import Prefix Changes
09 Oct 2010; Raúl Porcel <armin76@gentoo.org> e2fsprogs-1.41.12.ebuild:
alpha/sparc stable wrt #337270
diff --git a/sys-fs/e2fsprogs/e2fsprogs-1.41.12-r1.ebuild b/sys-fs/e2fsprogs/e2fsprogs-1.41.12-r1.ebuild
new file mode 100644
index 000000000000..1b318f35dfb3
--- /dev/null
+++ b/sys-fs/e2fsprogs/e2fsprogs-1.41.12-r1.ebuild
@@ -0,0 +1,169 @@
+# Copyright 1999-2010 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Header: /var/cvsroot/gentoo-x86/sys-fs/e2fsprogs/e2fsprogs-1.41.12-r1.ebuild,v 1.1 2010/11/19 18:49:02 jlec Exp $
+
+EAPI="3"
+
+
+inherit eutils flag-o-matic multilib toolchain-funcs
+
+DESCRIPTION="Standard EXT2/EXT3/EXT4 filesystem utilities"
+HOMEPAGE="http://e2fsprogs.sourceforge.net/"
+SRC_URI="mirror://sourceforge/e2fsprogs/${P}.tar.gz"
+
+LICENSE="GPL-2 BSD"
+SLOT="0"
+KEYWORDS="~alpha ~amd64 ~arm ~hppa ~ia64 ~m68k ~mips ~ppc ~ppc64 ~s390 ~sh ~sparc ~x86 -x86-fbsd ~amd64-linux ~x86-linux ~ppc-macos ~x86-macos ~m68k-mint"
+IUSE="nls elibc_FreeBSD"
+
+RDEPEND="
+ >=sys-apps/util-linux-2.16
+ ~sys-libs/${PN}-libs-${PV}
+ nls? ( virtual/libintl )"
+DEPEND="${RDEPEND}
+ dev-util/pkgconfig
+ sys-apps/texinfo
+ nls? ( sys-devel/gettext )"
+
+pkg_setup() {
+ if [[ ! -e ${EROOT}/etc/mtab ]] ; then
+ # add some crap to deal with missing /etc/mtab #217719
+ ewarn "No /etc/mtab file, creating one temporarily"
+ echo "${PN} crap for src_test" > "${EROOT}"/etc/mtab
+ fi
+}
+
+src_prepare() {
+ epatch "${FILESDIR}"/${PN}-1.38-tests-locale.patch #99766
+ epatch "${FILESDIR}"/${PN}-1.41.8-makefile.patch
+ epatch "${FILESDIR}"/${PN}-1.40-fbsd.patch
+ # use symlinks rather than hardlinks
+ sed -i \
+ -e 's:$(LN) -f $(DESTDIR).*/:$(LN_S) -f :' \
+ {e2fsck,misc}/Makefile.in || die
+ epatch "${FILESDIR}"/${P}-darwin-makefile.patch
+ epatch "${FILESDIR}"/${P}-darwin-no-mntent.patch
+ if [[ ${CHOST} == *-mint* ]] ; then
+ epatch "${FILESDIR}"/${PN}-1.41-mint.patch
+ epatch "${FILESDIR}"/${PN}-1.41.7-mint-blkid.patch
+ fi
+ # blargh ... trick e2fsprogs into using e2fsprogs-libs
+ rm -rf doc || die
+ sed -i -r \
+ -e 's:@LIBINTL@:@LTLIBINTL@:' \
+ -e '/^LIB(COM_ERR|SS)/s:[$][(]LIB[)]/lib([^@]*)@LIB_EXT@:-l\1:' \
+ -e '/^DEPLIB(COM_ERR|SS)/s:=.*:=:' \
+ MCONFIG.in || die "muck libs" #122368
+ sed -i -r \
+ -e '/^LIB_SUBDIRS/s:lib/(et|ss)::g' \
+ Makefile.in || die "remove subdirs"
+ sed -i \
+ -e '/^#define _XOPEN/i#define _GNU_SOURCE' \
+ misc/mke2fs.c || die # needs open64() prototype
+
+ # Avoid rebuild
+ touch lib/ss/ss_err.h
+}
+
+src_configure() {
+ # Keep the package from doing silly things #261411
+ export VARTEXFONTS=${T}/fonts
+
+ # We want to use the "bsd" libraries while building on Darwin, but while
+ # building on other Gentoo/*BSD we prefer elf-naming scheme.
+ local libtype
+ case ${CHOST} in
+ *-darwin*) libtype=--enable-bsd-shlibs ;;
+ *-mint*) libtype= ;;
+ *) libtype=--enable-elf-shlibs ;;
+ esac
+
+ # On MacOSX 10.4 using the assembly built-in bitoperation functions causes
+ # segmentation faults. Though this is likely fixable we can quickly make it
+ # at least work by using the C functions.
+ if [[ ${CHOST} == i?86-apple-darwin* ]]; then
+ append-flags -D_EXT2_USE_C_VERSIONS_
+ fi
+
+ ac_cv_path_LDCONFIG=: \
+ econf \
+ --with-root-prefix="${EPREFIX}/" \
+ ${libtype} \
+ $(tc-has-tls || echo --disable-tls) \
+ --without-included-gettext \
+ $(use_enable nls) \
+ --disable-libblkid \
+ --disable-libuuid \
+ --disable-fsck \
+ --disable-uuidd
+ if [[ ${CHOST} != *-uclibc ]] && grep -qs 'USE_INCLUDED_LIBINTL.*yes' config.{log,status} ; then
+ eerror "INTL sanity check failed, aborting build."
+ eerror "Please post your ${S}/config.log file as an"
+ eerror "attachment to http://bugs.gentoo.org/show_bug.cgi?id=81096"
+ die "Preventing included intl cruft from building"
+ fi
+}
+
+src_compile() {
+ emake COMPILE_ET=compile_et MK_CMDS=mk_cmds || die
+
+ # Build the FreeBSD helper
+ if use elibc_FreeBSD ; then
+ cp "${FILESDIR}"/fsck_ext2fs.c .
+ emake fsck_ext2fs || die
+ fi
+}
+
+pkg_preinst() {
+ if [[ -r ${EROOT}/etc/mtab ]] ; then
+ if [[ $(<"${EROOT}"/etc/mtab) == "${PN} crap for src_test" ]] ; then
+ rm -f "${EROOT}"/etc/mtab
+ fi
+ fi
+}
+
+src_install() {
+ # need to set root_libdir= manually as any --libdir options in the
+ # econf above (i.e. multilib) will screw up the default #276465
+ emake \
+ STRIP=: \
+ root_libdir="${EPREFIX}/usr/$(get_libdir)" \
+ DESTDIR="${D}" \
+ install install-libs || die
+ dodoc README RELEASE-NOTES || die
+
+ insinto /etc
+ doins "${FILESDIR}"/e2fsck.conf || die
+
+ # Move shared libraries to /lib/, install static libraries to
+ # /usr/lib/,
+ # and install linker scripts to /usr/lib/.
+ set -- "${ED}"/usr/$(get_libdir)/*.a
+ set -- ${@/*\/lib}
+ gen_usr_ldscript -a "${@/.a}"
+
+ # For correct install_names (on Darwin) we can't do this with
+ # root_libdir=/lib and the code below, instead we need root_libdir=/usr/lib
+ # and gen_usr_ldscript that fixes install_names as the libs are moved
+ ## make sure symlinks are relative, not absolute, for cross-compiling
+ #cd "${ED}"/usr/$(get_libdir)
+ #local x l
+ #for x in lib* ; do
+ # l=$(readlink "${x}")
+ # [[ ${l} == /* ]] || continue
+ # rm -f "${x}"
+ # ln -s "../..${l}" "${x}"
+ #done
+
+ if use elibc_FreeBSD ; then
+ # Install helpers for us
+ into /
+ dosbin "${S}"/fsck_ext2fs || die
+ doman "${FILESDIR}"/fsck_ext2fs.8 || die
+
+ # filefrag is linux only
+ rm \
+ "${ED}"/usr/sbin/filefrag \
+ "${ED}"/usr/share/man/man8/filefrag.8 || die
+ fi
+}
diff --git a/sys-fs/e2fsprogs/files/e2fsprogs-1.41-mint.patch b/sys-fs/e2fsprogs/files/e2fsprogs-1.41-mint.patch
new file mode 100644
index 000000000000..43ed92d959c8
--- /dev/null
+++ b/sys-fs/e2fsprogs/files/e2fsprogs-1.41-mint.patch
@@ -0,0 +1,1947 @@
+http://bugs.gentoo.org/show_bug.cgi?id=256234
+http://sourceforge.net/tracker/?func=detail&aid=2550325&group_id=2406&atid=302406
+
+diff -ur --new-file e2fsprogs-1.41.3/lib/ext2fs/Makefile.in e2fsprogs-1.41.3-mint/lib/ext2fs/Makefile.in
+--- e2fsprogs-1.41.3/lib/ext2fs/Makefile.in 2008-10-07 14:22:39.000000000 +0000
++++ e2fsprogs-1.41.3-mint/lib/ext2fs/Makefile.in 2009-01-23 10:48:50.000000000 +0000
+@@ -74,7 +74,9 @@
+ unix_io.o \
+ unlink.o \
+ valid_blk.o \
+- version.o
++ version.o \
++ mint_io.o \
++ xhdi.o
+
+ SRCS= ext2_err.c \
+ $(srcdir)/alloc.c \
+@@ -146,6 +148,8 @@
+ $(srcdir)/unlink.c \
+ $(srcdir)/valid_blk.c \
+ $(srcdir)/version.c \
++ $(srcdir)/mint_io.c \
++ $(srcdir)/xhdi.c \
+ $(srcdir)/write_bb_file.c
+
+ HFILES= bitops.h ext2fs.h ext2_io.h ext2_fs.h ext2_ext_attr.h ext3_extents.h \
+diff -ur --new-file e2fsprogs-1.41.3/lib/ext2fs/bitops.h e2fsprogs-1.41.3-mint/lib/ext2fs/bitops.h
+--- e2fsprogs-1.41.3/lib/ext2fs/bitops.h 2008-10-07 14:22:39.000000000 +0000
++++ e2fsprogs-1.41.3-mint/lib/ext2fs/bitops.h 2009-01-23 10:47:35.000000000 +0000
+@@ -125,7 +125,7 @@
+ */
+ #ifdef NO_INLINE_FUNCS
+ #if (defined(__GNUC__) && (defined(__i386__) || defined(__i486__) || \
+- defined(__i586__) || defined(__mc68000__)))
++ defined(__i586__) || defined(__mc68020__)))
+ /* This prevents bitops.c from trying to include the C */
+ /* function version of these functions */
+ #define _EXT2_HAVE_ASM_BITOPS_
+@@ -246,7 +246,7 @@
+ #endif /* i386 */
+
+ #if ((defined __GNUC__) && !defined(_EXT2_USE_C_VERSIONS_) && \
+- (defined(__mc68000__)))
++ (defined(__mc68020__)))
+
+ #define _EXT2_HAVE_ASM_BITOPS_
+
+@@ -280,6 +280,50 @@
+ return retval;
+ }
+
++#elif defined(__mc68000__)
++
++#define _EXT2_HAVE_ASM_BITOPS_
++
++_INLINE_ int
++ext2fs_set_bit (unsigned int nr, void *addr)
++{
++ int mask, retval;
++ unsigned char *ADDR = (unsigned char *) addr;
++
++ ADDR += nr >> 3;
++ mask = 1UL << (nr & 0x07);
++ retval = (mask & *ADDR) != 0;
++ *ADDR |= mask;
++
++ return retval;
++}
++
++_INLINE_ int
++ext2fs_clear_bit (unsigned int nr, void *addr)
++{
++ int mask, retval;
++ unsigned char *ADDR = (unsigned char *) addr;
++
++ ADDR += nr >> 3;
++ mask = 1UL << (nr & 0x07);
++ retval = (mask & *ADDR) != 0;
++ *ADDR &= ~mask;
++
++ return retval;
++}
++
++_INLINE_ int
++ext2fs_test_bit (unsigned int nr, const void *addr)
++{
++ int mask;
++ const unsigned char *ADDR = (const unsigned char *) addr;
++
++ ADDR += nr >> 3;
++ mask = 1UL << (nr & 0x07);
++
++ return ((mask & *ADDR) != 0);
++}
++
+ #endif /* __mc68000__ */
+
+
+diff -ur --new-file e2fsprogs-1.41.3/lib/ext2fs/ext2_fs.h e2fsprogs-1.41.3-mint/lib/ext2fs/ext2_fs.h
+--- e2fsprogs-1.41.3/lib/ext2fs/ext2_fs.h 2009-01-23 10:01:34.000000000 +0000
++++ e2fsprogs-1.41.3-mint/lib/ext2fs/ext2_fs.h 2009-01-23 10:49:44.000000000 +0000
+@@ -307,6 +307,7 @@
+ #define _IOT_ext2_new_group_input _IOT (_IOTS(__u32), 5, _IOTS(__u16), 2, 0, 0)
+ #endif
+
++#ifndef __MINT__
+ #define EXT2_IOC_GETFLAGS _IOR('f', 1, long)
+ #define EXT2_IOC_SETFLAGS _IOW('f', 2, long)
+ #define EXT2_IOC_GETVERSION _IOR('v', 1, long)
+@@ -316,6 +317,9 @@
+ #define EXT2_IOC_GROUP_EXTEND _IOW('f', 7, unsigned long)
+ #define EXT2_IOC_GROUP_ADD _IOW('f', 8,struct ext2_new_group_input)
+ #define EXT4_IOC_GROUP_ADD _IOW('f', 8,struct ext4_new_group_input)
++#else
++#include <mint/dcntl.h>
++#endif
+
+ /*
+ * Structure of an inode on the disk
+diff -ur --new-file e2fsprogs-1.41.3/lib/ext2fs/getsize.c e2fsprogs-1.41.3-mint/lib/ext2fs/getsize.c
+--- e2fsprogs-1.41.3/lib/ext2fs/getsize.c 2008-10-07 14:22:39.000000000 +0000
++++ e2fsprogs-1.41.3-mint/lib/ext2fs/getsize.c 2009-01-23 10:47:35.000000000 +0000
+@@ -58,6 +58,11 @@
+ #define BLKGETSIZE DKIOCGETBLOCKCOUNT32
+ #endif /* APPLE_DARWIN */
+
++#ifdef __MINT__
++#include <sys/ioctl.h>
++#include "mint_io.h"
++#endif
++
+ #include "ext2_fs.h"
+ #include "ext2fs.h"
+
+diff -ur --new-file e2fsprogs-1.41.3/lib/ext2fs/llseek.c e2fsprogs-1.41.3-mint/lib/ext2fs/llseek.c
+--- e2fsprogs-1.41.3/lib/ext2fs/llseek.c 2008-10-07 14:22:39.000000000 +0000
++++ e2fsprogs-1.41.3-mint/lib/ext2fs/llseek.c 2009-01-23 10:47:35.000000000 +0000
+@@ -115,6 +115,8 @@
+
+ #else /* !linux */
+
++#ifndef __MINT__
++
+ #ifndef EINVAL
+ #define EINVAL EXT2_ET_INVALID_ARGUMENT
+ #endif
+@@ -133,6 +135,8 @@
+ #endif
+ }
+
++#endif /* __MINT__ */
++
+ #endif /* linux */
+
+
+diff -ur --new-file e2fsprogs-1.41.3/lib/ext2fs/mint_io.c e2fsprogs-1.41.3-mint/lib/ext2fs/mint_io.c
+--- e2fsprogs-1.41.3/lib/ext2fs/mint_io.c 1970-01-01 00:00:00.000000000 +0000
++++ e2fsprogs-1.41.3-mint/lib/ext2fs/mint_io.c 2009-01-23 10:49:51.000000000 +0000
+@@ -0,0 +1,858 @@
++/*
++ * $Id: e2fsprogs-1.41-mint.patch,v 1.1 2010/11/19 18:49:02 jlec Exp $
++ *
++ * This file belongs to FreeMiNT. It's not in the original MiNT 1.12
++ * distribution. See the file CHANGES for a detailed log of changes.
++ *
++ *
++ * Copyright 2000 Frank Naumann <fnaumann@freemint.de>
++ * All rights reserved.
++ *
++ * 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 file 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., 675 Mass Ave, Cambridge, MA 02139, USA.
++ *
++ *
++ * Author: Frank Naumann <fnaumann@freemint.de>
++ * Started: 200-06-14
++ *
++ * Please send suggestions, patches or bug reports to me or
++ * the MiNT mailing list.
++ *
++ */
++
++# ifdef __MINT__
++
++# include <assert.h>
++# include <ctype.h>
++# include <errno.h>
++# include <fcntl.h>
++# include <limits.h>
++# include <stdarg.h>
++# include <stdlib.h>
++# include <stdio.h>
++# include <string.h>
++# include <time.h>
++# include <unistd.h>
++
++# include "et/com_err.h"
++# include "ext2fs/ext2_io.h"
++# include <sys/ioctl.h>
++# include <sys/stat.h>
++# define loff_t ext2_loff_t
++# define llseek ext2fs_llseek
++
++# include <mintbind.h>
++# include "mint_io.h"
++# include "xhdi.h"
++
++
++# if 0
++# define DEBUG(x) printf x
++# else
++# define DEBUG(x)
++# endif
++
++
++/* prototypes */
++
++int __open_v(const char *_filename, int iomode, va_list argp);
++
++int open(__const char *__file, int __oflag, ...) __THROW;
++int __open(__const char *__file, int __oflag, ...) __THROW;
++
++int ioctl(int fd, int cmd, void *arg);
++int __ioctl(int fd, int cmd, void *arg);
++
++int fsync(int __fd) __THROW;
++int __fsync(int __fd) __THROW;
++
++__off_t lseek(int __fd, __off_t __offset, int __whence) __THROW;
++__off_t __lseek(int __fd, __off_t __offset, int __whence) __THROW;
++
++int close(int __fd) __THROW;
++int __close(int __fd) __THROW;
++
++ssize_t read(int __fd, void *__buf, size_t __nbytes) __THROW;
++ssize_t __read(int __fd, void *__buf, size_t __nbytes) __THROW;
++
++ssize_t write(int __fd, __const void *__buf, size_t __n) __THROW;
++ssize_t __write(int __fd, __const void *__buf, size_t __n) __THROW;
++
++int fstat(int __fd, struct stat *__buf) __THROW;
++int __fstat(int __fd, struct stat *__buf) __THROW;
++
++int stat(const char *filename, struct stat *st) __THROW;
++
++
++struct device
++{
++ int used;
++
++ int drv;
++ int open_flags;
++
++ ushort xhdi_maj;
++ ushort xhdi_min;
++ ulong xhdi_start;
++ ulong xhdi_blocks;
++ ulong xhdi_blocksize;
++ char xhdi_id[4];
++
++ loff_t pos;
++};
++
++# define DEVS 16
++static struct device devs[DEVS];
++
++static void
++init_device(struct device *dev)
++{
++ dev->used = 0;
++
++ dev->drv = -1;
++ dev->open_flags = 0;
++ dev->xhdi_maj = 0;
++ dev->xhdi_min = 0;
++ dev->xhdi_start = 0;
++ dev->xhdi_blocks = 0;
++ dev->xhdi_blocksize = 0;
++
++ dev->pos = 0;
++}
++
++static inline void
++init(void)
++{
++ static int done = 0;
++ int i;
++
++ if (done)
++ return;
++
++ assert(sizeof(loff_t) == sizeof(long long));
++
++ for (i = 0; i < DEVS; i++)
++ init_device (&devs[i]);
++
++ init_XHDI();
++
++ /* we are now initialized */
++ done = 1;
++}
++
++static struct device *
++get_device(int fd)
++{
++ struct device *dev;
++
++ if ((fd < 1024) || (fd >= (1024 + DEVS)))
++ return NULL;
++
++ fd -= 1024;
++ dev = &devs[fd];
++
++ assert(dev->used);
++
++ return dev;
++}
++
++static int
++alloc_device(void)
++{
++ int i;
++
++ for (i = 0; i < DEVS; i++)
++ {
++ struct device *dev = &devs[i];
++
++ if (!dev->used)
++ {
++ dev->used = 1;
++ return (i + 1024);
++ }
++ }
++
++ __set_errno(ENOMEM);
++ return -1;
++}
++
++static void
++free_device(struct device *dev)
++{
++ assert(dev->used);
++
++ init_device (dev);
++}
++
++
++int
++open(const char *filename, int iomode, ...)
++{
++ const char *f = filename;
++ struct device *mydev = NULL;
++ int dev = -1;
++ long ret;
++
++ init();
++
++ if (!filename)
++ {
++ __set_errno(EINVAL);
++ return -1;
++ }
++
++ if ((f[1] == ':') && (f[2] == '\0'))
++ {
++ int c = tolower(f[0]);
++
++ if (c >= 'a' && c <= 'z')
++ c = c - 'a';
++ else if (c >= '1' && c <= '6')
++ c = 26 + (c - '1');
++
++ if ((c >= 0) && (c < 32))
++ {
++ dev = alloc_device();
++ if (dev != -1)
++ {
++ mydev = get_device(dev);
++ assert(mydev);
++
++ mydev->drv = c;
++ mydev->open_flags = iomode;
++ }
++ }
++ }
++
++ if (dev == -1)
++ {
++ /* fall through */
++
++ va_list args;
++ int retval;
++
++ va_start(args, iomode);
++ retval = __open_v(filename, iomode, args);
++ va_end(args);
++
++ return retval;
++ }
++
++ if (mydev->open_flags == O_RDONLY)
++ {
++ DEBUG(("readonly mode!\n"));
++ sync();
++ }
++ else if (Dlock(1, mydev->drv))
++ {
++ printf("Can't lock partition %c:!\n", mydev->drv+'A');
++
++ if (mydev)
++ free_device(mydev);
++
++ __set_errno(EACCES);
++ return -1;
++ }
++
++ __set_errno(EERROR);
++
++ ret = XHGetVersion ();
++ DEBUG(("XHDI version: %lx\n", ret));
++
++ ret = XHInqDev2(mydev->drv,
++ &mydev->xhdi_maj, &mydev->xhdi_min,
++ &mydev->xhdi_start, NULL,
++ &mydev->xhdi_blocks, mydev->xhdi_id);
++ if (ret)
++ {
++ printf("XHInqDev2 [%c] fail (ret = %li, errno = %i)\n",
++ mydev->drv+'A', ret, errno);
++ ret = -1;
++ }
++ else
++ {
++ ret = XHInqTarget(mydev->xhdi_maj, mydev->xhdi_min,
++ &mydev->xhdi_blocksize, NULL, NULL);
++ if (ret)
++ {
++ printf("XHInqTarget [%i:%i] fail (ret = %li, errno = %i)\n",
++ mydev->xhdi_maj, mydev->xhdi_min, ret, errno);
++ ret = -1;
++ }
++ else
++ {
++ char *xhdi_id = mydev->xhdi_id;
++
++ if ( 0
++ || ((xhdi_id[0] == 'G') && (xhdi_id[1] == 'E') && (xhdi_id[2] == 'M')) /* GEM */
++ || ((xhdi_id[0] == 'B') && (xhdi_id[1] == 'G') && (xhdi_id[2] == 'M')) /* BGM */
++ || ((xhdi_id[0] == 'F') && (xhdi_id[1] == '3') && (xhdi_id[2] == '2')) /* F32 */
++ || ((xhdi_id[0] == 'M') && (xhdi_id[1] == 'I') && (xhdi_id[2] == 'X')) /* MIX */
++ || ((xhdi_id[0] == 'R') && (xhdi_id[1] == 'A') && (xhdi_id[2] == 'W')) /* RAW */
++ || ((xhdi_id[0] == 'L') && (xhdi_id[1] == 'N') && (xhdi_id[2] == 'X')) /* LNX */
++ || ((xhdi_id[0] == '\0') && (xhdi_id[1] == 'D'))) /* any DOS */
++ {
++ DEBUG(("Partition ok and accepted!\n"));
++ DEBUG(("start = %lu, blocks = %lu, blocksize = %lu\n",
++ mydev->xhdi_start, mydev->xhdi_blocks,
++ mydev->xhdi_blocksize));
++ }
++ else
++ {
++ xhdi_id [3] = '\0';
++ printf("Wrong partition ID [%s]!\n", xhdi_id);
++ printf("Only 'RAW', 'LNX' and DOS partitions are supported.\n");
++
++ __set_errno(EPERM);
++ ret = -1;
++ }
++ }
++ }
++
++ if (ret)
++ {
++ if (mydev)
++ free_device(mydev);
++
++ dev = -1;
++ }
++
++ return dev;
++}
++
++int
++close(int fd)
++{
++ struct device *mydev = get_device(fd);
++ int ret = 0;
++
++ if (!mydev)
++ /* fall through */
++ return __close(fd);
++
++ if (mydev->open_flags == O_RDONLY)
++ {
++ ;
++ }
++ else if (Dlock(0, mydev->drv))
++ {
++ printf("Can't unlock partition %c:!\n", 'A'+mydev->drv);
++
++ __set_errno(EACCES);
++ ret = -1;
++ }
++
++ free_device(mydev);
++ return ret;
++}
++
++/* simple buffer */
++static char buffer[1024L * 128];
++static ulong buf_recno = 0;
++static long buf_n = 0;
++
++static long
++rwabs_xhdi(struct device *mydev, ushort rw, void *buf, ulong size, ulong recno)
++{
++ ulong n = size / mydev->xhdi_blocksize;
++ long r;
++
++ assert((size % mydev->xhdi_blocksize) == 0);
++
++ if (!n || (recno + n) > mydev->xhdi_blocks)
++ {
++ printf("rwabs_xhdi: access outside partition (drv = %c:)\n", 'A'+mydev->drv);
++ exit(2);
++ }
++
++ if (n > 65535UL)
++ {
++ printf("rwabs_xhdi: n to large (drv = %c)\n", 'A'+mydev->drv);
++ exit(2);
++ }
++
++ if (!rw && (buf_recno == recno) && (buf_n == n))
++ {
++ bcopy(buffer, buf, buf_n * mydev->xhdi_blocksize);
++ return 0;
++ }
++
++ r = XHReadWrite (mydev->xhdi_maj, mydev->xhdi_min, rw, mydev->xhdi_start + recno, n, buf);
++
++ if (!r && (n * mydev->xhdi_blocksize) <= sizeof(buffer))
++ {
++ bcopy(buf, buffer, n * mydev->xhdi_blocksize);
++
++ buf_recno = recno;
++ buf_n = n;
++ }
++ else
++ buf_n = 0;
++
++ return r;
++}
++
++# define max(a,b) (a > b ? a : b)
++# define min(a,b) (a > b ? b : a)
++
++int
++read(int fd, void *_buf, size_t size)
++{
++ struct device *mydev = get_device(fd);
++
++ if (!mydev)
++ /* fall through */
++ return __read(fd, _buf, size);
++
++{
++ char *buf = _buf;
++ long todo; /* characters remaining */
++ long done; /* characters processed */
++
++ todo = size;
++ done = 0;
++
++ if (todo == 0)
++ return 0;
++
++ /* partial block copy
++ */
++ if (mydev->pos % mydev->xhdi_blocksize)
++ {
++ char tmp[mydev->xhdi_blocksize];
++
++ ulong recno = mydev->pos / mydev->xhdi_blocksize;
++ ulong offset = mydev->pos % mydev->xhdi_blocksize;
++ ulong data;
++ long ret;
++
++ ret = rwabs_xhdi(mydev, 0, tmp, mydev->xhdi_blocksize, recno);
++ if (ret)
++ {
++ DEBUG(("read: partial part: read failure (r = %li, errno = %i)\n", ret, errno));
++ goto out;
++ }
++
++ data = mydev->xhdi_blocksize - offset;
++ data = min (todo, data);
++
++ memcpy(buf, tmp + offset, data);
++
++ buf += data;
++ todo -= data;
++ done += data;
++ mydev->pos += data;
++ }
++
++ if (todo)
++ {
++ assert((todo > 0));
++ assert((mydev->pos % mydev->xhdi_blocksize) == 0);
++ }
++
++
++ /* full blocks
++ */
++ if (todo / mydev->xhdi_blocksize)
++ {
++ ulong recno = mydev->pos / mydev->xhdi_blocksize;
++ ulong data = (todo / mydev->xhdi_blocksize) * mydev->xhdi_blocksize;
++ long ret;
++
++ ret = rwabs_xhdi (mydev, 0, buf, data, recno);
++ if (ret)
++ {
++ DEBUG(("read: full blocks: read failure (r = %li, errno = %i)\n", ret, errno));
++ goto out;
++ }
++
++ buf += data;
++ todo -= data;
++ done += data;
++ mydev->pos += data;
++ }
++
++ if (todo)
++ {
++ assert((todo > 0) && (todo < mydev->xhdi_blocksize));
++ assert((mydev->pos % mydev->xhdi_blocksize) == 0);
++ }
++
++ /* anything left?
++ */
++ if (todo)
++ {
++ char tmp[mydev->xhdi_blocksize];
++
++ ulong recno = mydev->pos / mydev->xhdi_blocksize;
++ long ret;
++
++ ret = rwabs_xhdi (mydev, 0, tmp, mydev->xhdi_blocksize, recno);
++ if (ret)
++ {
++ DEBUG(("read: left part: read failure (r = %li, errno = %i)]\n", ret, errno));
++ goto out;
++ }
++
++ memcpy(buf, tmp, todo);
++
++ done += todo;
++ mydev->pos += todo;
++ }
++
++ assert(done == size);
++
++out:
++ return done;
++}
++}
++
++int
++write(int fd, const void *_buf, size_t size)
++{
++ struct device *mydev = get_device(fd);
++
++ if (!mydev)
++ /* fall through */
++ return __write(fd, _buf, size);
++
++ if (mydev->open_flags == O_RDONLY)
++ {
++ __set_errno(EPERM);
++ return -1;
++ }
++{
++ const char *buf = _buf;
++ long todo; /* characters remaining */
++ long done; /* characters processed */
++
++ todo = size;
++ done = 0;
++
++ if (todo == 0)
++ return 0;
++
++ /* partial block copy
++ */
++ if (mydev->pos % mydev->xhdi_blocksize)
++ {
++ char tmp[mydev->xhdi_blocksize];
++
++ ulong recno = mydev->pos / mydev->xhdi_blocksize;
++ ulong offset = mydev->pos % mydev->xhdi_blocksize;
++ ulong data;
++ long ret;
++
++ ret = rwabs_xhdi(mydev, 0, tmp, mydev->xhdi_blocksize, recno);
++ if (ret)
++ {
++ DEBUG(("write: partial part: read failure (r = %li, errno = %i)\n", ret, errno));
++ goto out;
++ }
++
++ data = mydev->xhdi_blocksize - offset;
++ data = min (todo, data);
++
++ memcpy(tmp + offset, buf, data);
++
++ ret = rwabs_xhdi(mydev, 1, tmp, mydev->xhdi_blocksize, recno);
++ if (ret)
++ {
++ DEBUG(("write: partial part: write failure (r = %li, errno = %i)\n", ret, errno));
++ goto out;
++ }
++
++ buf += data;
++ todo -= data;
++ done += data;
++ mydev->pos += data;
++ }
++
++ if (todo)
++ {
++ assert((todo > 0));
++ assert((mydev->pos % mydev->xhdi_blocksize) == 0);
++ }
++
++ /* full blocks
++ */
++ if (todo / mydev->xhdi_blocksize)
++ {
++ ulong recno = mydev->pos / mydev->xhdi_blocksize;
++ ulong data = (todo / mydev->xhdi_blocksize) * mydev->xhdi_blocksize;
++ long ret;
++
++ ret = rwabs_xhdi(mydev, 1, (void *)buf, data, recno);
++ if (ret)
++ {
++ DEBUG(("write: full blocks: write failure (r = %li, errno = %i)\n", ret, errno));
++ goto out;
++ }
++
++ buf += data;
++ todo -= data;
++ done += data;
++ mydev->pos += data;
++ }
++
++ if (todo)
++ {
++ assert((todo > 0) && (todo < mydev->xhdi_blocksize));
++ assert((mydev->pos % mydev->xhdi_blocksize) == 0);
++ }
++
++ /* anything left?
++ */
++ if (todo)
++ {
++ char tmp[mydev->xhdi_blocksize];
++
++ ulong recno = mydev->pos / mydev->xhdi_blocksize;
++ long ret;
++
++ ret = rwabs_xhdi(mydev, 0, tmp, mydev->xhdi_blocksize, recno);
++ if (ret)
++ {
++ DEBUG(("write: left part: read failure (r = %li, errno = %i)]\n", ret, errno));
++ goto out;
++ }
++
++ memcpy(tmp, buf, todo);
++
++ ret = rwabs_xhdi(mydev, 1, tmp, mydev->xhdi_blocksize, recno);
++ if (ret)
++ {
++ DEBUG(("write: partial part: write failure (r = %li, errno = %i)\n", ret, errno));
++ goto out;
++ }
++
++ done += todo;
++ mydev->pos += todo;
++ }
++
++ assert(done == size);
++
++out:
++ return done;
++}
++}
++
++int
++ioctl(int fd, int cmd, void *arg)
++{
++ struct device *mydev = get_device(fd);
++
++ if (!mydev)
++ /* fall through */
++ return __ioctl(fd, cmd, arg);
++
++ DEBUG(("ioctl: cmd = %i\n", cmd));
++
++ switch (cmd)
++ {
++ case BLKGETSIZE:
++ {
++ ulong *size = arg;
++ *size = mydev->xhdi_blocks * (mydev->xhdi_blocksize / 512);
++ break;
++ }
++ case BLOCKSIZE:
++ {
++ ulong *block_size = arg;
++ *block_size = mydev->xhdi_blocksize;
++ break;
++ }
++ default:
++ __set_errno(EINVAL);
++ return -1;
++ }
++
++ return 0;
++}
++
++int
++fstat(int fd, struct stat *st)
++{
++ struct device *mydev = get_device(fd);
++
++ if (!mydev)
++ /* fall through */
++ return __fstat(fd, st);
++
++ bzero(st, sizeof(*st));
++
++ st->st_dev = mydev->xhdi_maj;
++ st->st_ino = mydev->drv;
++ st->st_mode = S_IFBLK | S_IRUSR | S_IWUSR;
++ st->st_nlink = 1;
++ st->st_uid = 0;
++ st->st_gid = 0;
++ st->st_rdev = mydev->xhdi_min;
++ st->st_atime = time (NULL);
++ st->st_mtime = time (NULL);
++ st->st_ctime = time (NULL);
++ st->st_size = (int64_t) mydev->xhdi_blocks * mydev->xhdi_blocksize;
++ st->st_blocks = (int64_t) mydev->xhdi_blocks * mydev->xhdi_blocksize / 512;
++ st->st_blksize = mydev->xhdi_blocksize;
++ st->st_flags = 0;
++ st->st_gen = 0;
++
++ return 0;
++}
++
++int
++stat(const char *filename, struct stat *st)
++{
++ struct device *mydev;
++ int fd, res;
++
++ fd = open(filename, O_RDONLY);
++ if (fd == -1)
++ return -1;
++
++ mydev = get_device(fd);
++ if (!mydev)
++ {
++ close(fd);
++
++ /* fall through */
++ return __stat(filename, st);
++ }
++
++ res = fstat(fd, st);
++ close(fd);
++
++ return res;
++}
++
++int
++fsync(int fd)
++{
++ struct device *mydev = get_device(fd);
++
++ if (!mydev)
++ /* fall through */
++ return __fsync(fd);
++
++ /* nothing todo */
++ return 0;
++}
++
++loff_t llseek(int fd, loff_t offset, int origin);
++
++loff_t
++llseek(int fd, loff_t offset, int origin)
++{
++ struct device *mydev = get_device(fd);
++
++ if (!mydev)
++ /* fall through */
++ return __lseek(fd, (off_t) offset, origin);
++
++
++ switch (origin)
++ {
++ case SEEK_SET:
++ break;
++ case SEEK_CUR:
++ offset += mydev->pos;
++ break;
++ case SEEK_END:
++ offset += (int64_t) mydev->xhdi_blocks * mydev->xhdi_blocksize;
++ break;
++ default:
++ return -1;
++ }
++
++ if (offset > (loff_t) mydev->xhdi_blocks * mydev->xhdi_blocksize)
++ {
++ __set_errno(EINVAL);
++ return -1;
++ }
++
++ mydev->pos = offset;
++ return mydev->pos;
++}
++
++loff_t lseek64(int fd, loff_t offset, int origin);
++
++loff_t
++lseek64(int fd, loff_t offset, int origin)
++{
++ return llseek(fd, offset, origin);
++}
++
++__off_t
++lseek(int fd, __off_t offset, int mode)
++{
++ struct device *mydev = get_device(fd);
++
++ if (!mydev)
++ /* fall through */
++ return __lseek(fd, offset, mode);
++
++{
++ loff_t _offset = offset;
++
++ switch (mode)
++ {
++ case SEEK_SET:
++ break;
++ case SEEK_CUR:
++ _offset += mydev->pos;
++ break;
++ case SEEK_END:
++ _offset += (loff_t) mydev->xhdi_blocks * mydev->xhdi_blocksize;
++ break;
++ default:
++ return -1;
++ }
++
++ if (_offset > LONG_MAX)
++ {
++ __set_errno(EINVAL);
++ return -1;
++ }
++
++ if (_offset > (loff_t) mydev->xhdi_blocks * mydev->xhdi_blocksize)
++ {
++ __set_errno(EINVAL);
++ return -1;
++ }
++
++ mydev->pos = _offset;
++ return (off_t) mydev->pos;
++}
++}
++
++int gettype(int fd);
++
++int
++gettype(int fd)
++{
++ struct device *mydev = get_device(fd);
++ char *xhdi_id;
++
++ if (!mydev)
++ return -1;
++
++ /* Get filesystem type by XHDI ID */
++ xhdi_id = mydev->xhdi_id;
++ if ((xhdi_id[0] == '\0') && (xhdi_id[1] == 'D'))
++ return 0; /* DOS (\0D*) */
++ else
++ return 1; /* Atari (GEM/GBM) */
++}
++
++# endif /* __MINT__ */
+diff -ur --new-file e2fsprogs-1.41.3/lib/ext2fs/mint_io.h e2fsprogs-1.41.3-mint/lib/ext2fs/mint_io.h
+--- e2fsprogs-1.41.3/lib/ext2fs/mint_io.h 1970-01-01 00:00:00.000000000 +0000
++++ e2fsprogs-1.41.3-mint/lib/ext2fs/mint_io.h 2009-01-23 10:49:53.000000000 +0000
+@@ -0,0 +1,22 @@
++/*
++ * mint_io.h
++ *
++ * Copyright (C) 2000 Frank Naumann <fnaumann@freemint.de>.
++ *
++ * %Begin-Header%
++ * This file may be redistributed under the terms of the GNU Public
++ * License.
++ * %End-Header%
++ */
++
++# ifdef __MINT__
++
++# ifndef _mint_io_h
++# define _mint_io_h
++
++# define BLKGETSIZE (('b'<< 8) | 1)
++# define BLOCKSIZE (('b'<< 8) | 2)
++
++# endif /* _mint_io_h */
++
++# endif /* __MINT__ */
+diff -ur --new-file e2fsprogs-1.41.3/lib/ext2fs/unix_io.c e2fsprogs-1.41.3-mint/lib/ext2fs/unix_io.c
+--- e2fsprogs-1.41.3/lib/ext2fs/unix_io.c 2008-10-13 03:12:22.000000000 +0000
++++ e2fsprogs-1.41.3-mint/lib/ext2fs/unix_io.c 2009-01-23 10:47:35.000000000 +0000
+@@ -51,9 +51,15 @@
+ #define BLKROGET _IO(0x12, 94) /* Get read-only status (0 = read_write). */
+ #endif
+
++#ifdef __MINT__
++#include <sys/ioctl.h>
++#include "mint_io.h"
++#endif
++
+ #include "ext2_fs.h"
+ #include "ext2fs.h"
+
++
+ /*
+ * For checking structure magic numbers...
+ */
+@@ -512,6 +518,16 @@
+ }
+ }
+ #endif
++
++#ifdef __MINT__
++ {
++ unsigned long block_size;
++ retval = ioctl(data->dev, BLOCKSIZE, &block_size);
++ if (retval == 0)
++ io->block_size = block_size;
++ }
++#endif
++
+ *channel = io;
+ return 0;
+
+diff -ur --new-file e2fsprogs-1.41.3/lib/ext2fs/xhdi.c e2fsprogs-1.41.3-mint/lib/ext2fs/xhdi.c
+--- e2fsprogs-1.41.3/lib/ext2fs/xhdi.c 1970-01-01 00:00:00.000000000 +0000
++++ e2fsprogs-1.41.3-mint/lib/ext2fs/xhdi.c 2009-01-23 10:49:55.000000000 +0000
+@@ -0,0 +1,577 @@
++/*
++ * Copyright 2000 Frank Naumann <fnaumann@freemint.de>
++ * All rights reserved.
++ *
++ * 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 file 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., 675 Mass Ave, Cambridge, MA 02139, USA.
++ *
++ *
++ * Started: 2000-05-02
++ *
++ * Changes:
++ *
++ * 0.1:
++ *
++ * fix: Cookie handling stuff; use Getcookie from MiNT-Lib now
++ * requires an actual MiNT-Lib (>= PL49)
++ *
++ * 0.0:
++ *
++ * - inital version
++ *
++ */
++
++# include "xhdi.h"
++
++# include <stdio.h>
++# include <stdlib.h>
++# include <errno.h>
++# include <mintbind.h>
++# include <mint/cookie.h>
++
++
++/*
++ * internal usage
++ */
++
++/* dummy routine */
++static long
++XHDIfail (void)
++{
++ return -ENOSYS;
++}
++
++/* XHDI handler function */
++static long (*XHDI)() = XHDIfail;
++
++ushort XHDI_installed = 0;
++
++
++# define C_XHDI 0x58484449L
++# define XHDIMAGIC 0x27011992L
++
++/* initalize flag */
++static ushort init = 1;
++
++long
++init_XHDI (void)
++{
++ long *val;
++ long r;
++
++ init = 0;
++
++ r = Getcookie (C_XHDI, (long *) &val);
++ if (r == C_FOUND)
++ {
++ long *magic_test = val;
++
++ /* check magic */
++ if (magic_test)
++ {
++ magic_test--;
++ if (*magic_test == XHDIMAGIC)
++ {
++ XHDI = val;
++ }
++ }
++ }
++
++ r = XHGetVersion ();
++ if (r < 0)
++ {
++ perror ("XHGetVersion");
++
++ XHDI = XHDIfail;
++ return r;
++ }
++
++ /* we need at least XHDI 1.10 */
++ if (r >= 0x110)
++ {
++ XHDI_installed = r;
++ return 0;
++ }
++
++ XHDI = XHDIfail;
++ return -1;
++}
++
++
++/*
++ * XHDI wrapper routines
++ */
++
++# define CALL \
++ long oldstack = 0; \
++ long r; \
++ \
++ if (init) init_XHDI (); \
++ \
++ if (!Super (1L)) \
++ oldstack = Super (0L); \
++ \
++ r = XHDI (args); \
++ if (r < 0) \
++ { \
++ __set_errno (-r); \
++ r = -1; \
++ } \
++ \
++ if (oldstack) \
++ Super (oldstack); \
++ \
++ return r
++
++long
++XHGetVersion (void)
++{
++ struct args_XHGetVersion
++ {
++ ushort opcode;
++ }
++ args =
++ {
++ 0
++ };
++
++ CALL;
++}
++
++long
++XHInqTarget (ushort major, ushort minor, ulong *block_size, ulong *device_flags, char *product_name)
++{
++ struct args_XHInqTarget
++ {
++ ushort opcode;
++ ushort major;
++ ushort minor;
++ ulong *block_size;
++ ulong *device_flags;
++ char *product_name;
++ }
++ args =
++ {
++ 1,
++ major,
++ minor,
++ block_size,
++ device_flags,
++ product_name
++ };
++
++ CALL;
++}
++
++long
++XHReserve (ushort major, ushort minor, ushort do_reserve, ushort key)
++{
++ struct args_XHReserve
++ {
++ ushort opcode;
++ ushort major;
++ ushort minor;
++ ushort do_reserve;
++ ushort key;
++ }
++ args =
++ {
++ 2,
++ major,
++ minor,
++ do_reserve,
++ key
++ };
++
++ CALL;
++}
++
++long
++XHLock (ushort major, ushort minor, ushort do_lock, ushort key)
++{
++ struct args_XHLock
++ {
++ ushort opcode;
++ ushort major;
++ ushort minor;
++ ushort do_lock;
++ ushort key;
++ }
++ args =
++ {
++ 3,
++ major,
++ minor,
++ do_lock,
++ key
++ };
++
++ CALL;
++}
++
++long
++XHStop (ushort major, ushort minor, ushort do_stop, ushort key)
++{
++ struct args_XHStop
++ {
++ ushort opcode;
++ ushort major;
++ ushort minor;
++ ushort do_stop;
++ ushort key;
++ }
++ args =
++ {
++ 4,
++ major,
++ minor,
++ do_stop,
++ key
++ };
++
++ CALL;
++}
++
++long
++XHEject (ushort major, ushort minor, ushort do_eject, ushort key)
++{
++ struct args_XHEject
++ {
++ ushort opcode;
++ ushort major;
++ ushort minor;
++ ushort do_eject;
++ ushort key;
++ }
++ args =
++ {
++ 5,
++ major,
++ minor,
++ do_eject,
++ key
++ };
++
++ CALL;
++}
++
++long
++XHDrvMap (void)
++{
++ struct args_XHDrvMap
++ {
++ ushort opcode;
++ }
++ args =
++ {
++ 6
++ };
++
++ CALL;
++}
++
++long
++XHInqDev (ushort bios, ushort *major, ushort *minor, ulong *start, __BPB *bpb)
++{
++ struct args_XHInqDev
++ {
++ ushort opcode;
++ ushort bios;
++ ushort *major;
++ ushort *minor;
++ ulong *start;
++ __BPB *bpb;
++ }
++ args =
++ {
++ 7,
++ bios,
++ major,
++ minor,
++ start,
++ bpb
++ };
++
++ CALL;
++}
++
++long
++XHInqDriver (ushort bios, char *name, char *version, char *company, ushort *ahdi_version, ushort *maxIPL)
++{
++ struct args_XHInqDriver
++ {
++ ushort opcode;
++ ushort bios;
++ char *name;
++ char *version;
++ char *company;
++ ushort *ahdi_version;
++ ushort *maxIPL;
++ }
++ args =
++ {
++ 8,
++ bios,
++ name,
++ version,
++ company,
++ ahdi_version,
++ maxIPL
++ };
++
++ CALL;
++}
++
++long
++XHNewCookie (void *newcookie)
++{
++ struct args_XHNewCookie
++ {
++ ushort opcode;
++ void *newcookie;
++ }
++ args =
++ {
++ 9,
++ newcookie
++ };
++
++ CALL;
++}
++
++long
++XHReadWrite (ushort major, ushort minor, ushort rwflag, ulong recno, ushort count, void *buf)
++{
++ struct args_XHReadWrite
++ {
++ ushort opcode;
++ ushort major;
++ ushort minor;
++ ushort rwflag;
++ ulong recno;
++ ushort count;
++ void *buf;
++ }
++ args =
++ {
++ 10,
++ major,
++ minor,
++ rwflag,
++ recno,
++ count,
++ buf
++ };
++
++ CALL;
++}
++
++long
++XHInqTarget2 (ushort major, ushort minor, ulong *block_size, ulong *device_flags, char *product_name, ushort stringlen)
++{
++ struct args_XHInqTarget2
++ {
++ ushort opcode;
++ ushort major;
++ ushort minor;
++ ulong *block_size;
++ ulong *device_flags;
++ char *product_name;
++ ushort stringlen;
++ }
++ args =
++ {
++ 11,
++ major,
++ minor,
++ block_size,
++ device_flags,
++ product_name,
++ stringlen
++ };
++
++ CALL;
++}
++
++long
++XHInqDev2 (ushort bios, ushort *major, ushort *minor, ulong *start, __BPB *bpb, ulong *blocks, char *partid)
++{
++ struct args_XHInqDev2
++ {
++ ushort opcode;
++ ushort bios;
++ ushort *major;
++ ushort *minor;
++ ulong *start;
++ __BPB *bpb;
++ ulong *blocks;
++ char *partid;
++ }
++ args =
++ {
++ 12,
++ bios,
++ major,
++ minor,
++ start,
++ bpb,
++ blocks,
++ partid
++ };
++
++ CALL;
++}
++
++long
++XHDriverSpecial (ulong key1, ulong key2, ushort subopcode, void *data)
++{
++ struct args_XHDriverSpecial
++ {
++ ushort opcode;
++ ulong key1;
++ ulong key2;
++ ushort subopcode;
++ void *data;
++ }
++ args =
++ {
++ 13,
++ key1,
++ key2,
++ subopcode,
++ data
++ };
++
++ CALL;
++}
++
++long
++XHGetCapacity (ushort major, ushort minor, ulong *blocks, ulong *bs)
++{
++ struct args_XHGetCapacity
++ {
++ ushort opcode;
++ ushort major;
++ ushort minor;
++ ulong *blocks;
++ ulong *bs;
++ }
++ args =
++ {
++ 14,
++ major,
++ minor,
++ blocks,
++ bs
++ };
++
++ CALL;
++}
++
++long
++XHMediumChanged (ushort major, ushort minor)
++{
++ struct args_XHMediumChanged
++ {
++ ushort opcode;
++ ushort major;
++ ushort minor;
++ }
++ args =
++ {
++ 15,
++ major,
++ minor
++ };
++
++ CALL;
++}
++
++long
++XHMiNTInfo (ushort op, void *data)
++{
++ struct args_XHMiNTInfo
++ {
++ ushort opcode;
++ ushort op;
++ void *data;
++ }
++ args =
++ {
++ 16,
++ op,
++ data
++ };
++
++ CALL;
++}
++
++long
++XHDOSLimits (ushort which, ulong limit)
++{
++ struct args_XHDOSLimits
++ {
++ ushort opcode;
++ ushort which;
++ ulong limit;
++ }
++ args =
++ {
++ 17,
++ which,
++ limit
++ };
++
++ CALL;
++}
++
++long
++XHLastAccess (ushort major, ushort minor, ulong *ms)
++{
++ struct args_XHLastAccess
++ {
++ ushort opcode;
++ ushort major;
++ ushort minor;
++ ulong *ms;
++ }
++ args =
++ {
++ 18,
++ major,
++ minor,
++ ms
++ };
++
++ CALL;
++}
++
++long
++XHReaccess (ushort major, ushort minor)
++{
++ struct args_XHReaccess
++ {
++ ushort opcode;
++ ushort major;
++ ushort minor;
++ }
++ args =
++ {
++ 19,
++ major,
++ minor
++ };
++
++ CALL;
++}
+diff -ur --new-file e2fsprogs-1.41.3/lib/ext2fs/xhdi.h e2fsprogs-1.41.3-mint/lib/ext2fs/xhdi.h
+--- e2fsprogs-1.41.3/lib/ext2fs/xhdi.h 1970-01-01 00:00:00.000000000 +0000
++++ e2fsprogs-1.41.3-mint/lib/ext2fs/xhdi.h 2009-01-23 10:49:56.000000000 +0000
+@@ -0,0 +1,144 @@
++/*
++ * Copyright 2000 Frank Naumann <fnaumann@freemint.de>
++ * All rights reserved.
++ *
++ * 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 file 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., 675 Mass Ave, Cambridge, MA 02139, USA.
++ *
++ */
++
++# ifndef _xhdi_h
++# define _xhdi_h
++
++# include <sys/types.h>
++
++typedef unsigned char uchar;
++
++
++/*
++ * BIOS parameter block (osbind.h is buggy)
++ */
++
++typedef struct
++{
++ ushort recsiz; /* bytes per sector */
++ short clsiz; /* sectors per cluster */
++ ushort clsizb; /* bytes per cluster */
++ short rdlen; /* root directory size */
++ short fsiz; /* size of FAT */
++ short fatrec; /* startsector of second FAT */
++ short datrec; /* first data sector */
++ ushort numcl; /* total number of clusters */
++ short bflags; /* some flags */
++
++} __BPB;
++
++
++/*
++ * Extended BIOS Parameter Block (XHDI)
++ */
++
++typedef struct
++{
++ ushort recsiz; /* bytes per sector */
++ short clsiz; /* sectors per cluster */
++ ushort clsizb; /* bytes per cluster */
++ short rdlen; /* root directory size or 0 if FAT32 */
++ short fsiz; /* size of FAT or 0 if FAT32 */
++ short fatrec; /* startsector of second FAT or 0 if FAT32 */
++ short datrec; /* first data sector or 0 if FAT32 */
++ ushort numcl; /* total number of clusters or 0 if FAT32 */
++ short bflags; /* bit 0: 0 = FAT12, 1 = FAT16
++ * bit 1: 0 = 2 FATs, 1 = 1 FAT
++ * bit 2: 0 = BPB, 1 = EXTENDED_BPB
++ */
++
++ /* Ab hier undokumentiert, nur A: und B:! */
++ short ntracks; /* Anzahl Spuren */
++ short nsides; /* Anzahl Seiten */
++ short spc; /* Sektoren pro Zylinder */
++ short spt; /* Sektoren pro Spur */
++ ushort nhid; /* Anzahl versteckte Sektoren */
++ uchar ser[3]; /* Seriennummer */
++ uchar serms[4]; /* ab TOS 2.06: MS-DOS-4.0-Seriennummer */
++ char unused;
++
++ /* if bit 2 of bflags are set */
++ long l_recsiz; /* bytes per sector */
++ long l_clsiz; /* sectors per cluster */
++ long l_clsizb; /* bytes per cluster */
++ long l_rdlen; /* root directory size */
++ long l_fsiz; /* size of FAT */
++ long l_fatrec; /* startsector of second FAT */
++ long l_datrec; /* first data sector */
++ long l_numcl; /* total number of clusters */
++ long l_rdstcl; /* if FAT32: startcluster of root directory
++ * otherwise 0
++ */
++} __xhdi_BPB;
++
++
++# define XH_TARGET_STOPPABLE 0x00000001L
++# define XH_TARGET_REMOVABLE 0x00000002L
++# define XH_TARGET_LOCKABLE 0x00000004L
++# define XH_TARGET_EJECTABLE 0x00000008L
++# define XH_TARGET_LOCKED 0x20000000L
++# define XH_TARGET_STOPPED 0x40000000L
++# define XH_TARGET_RESERVED 0x80000000L
++
++# define XH_MI_SETKERINFO 0
++# define XH_MI_GETKERINFO 1
++
++# define XH_DL_SECSIZ 0
++# define XH_DL_MINFAT 1
++# define XH_DL_MAXFAT 2
++# define XH_DL_MINSPC 3
++# define XH_DL_MAXSPC 4
++# define XH_DL_CLUSTS 5
++# define XH_DL_MAXSEC 6
++# define XH_DL_DRIVES 7
++# define XH_DL_CLSIZB 8
++# define XH_DL_RDLEN 9
++# define XH_DL_CLUSTS12 12
++# define XH_DL_CLUSTS32 13
++# define XH_DL_BFLAGS 14
++
++
++extern ushort XHDI_installed;
++
++long init_XHDI (void);
++
++long XHGetVersion (void);
++long XHInqTarget (ushort major, ushort minor, ulong *block_size, ulong *device_flags, char *product_name);
++long XHReserve (ushort major, ushort minor, ushort do_reserve, ushort key);
++long XHLock (ushort major, ushort minor, ushort do_lock, ushort key);
++long XHStop (ushort major, ushort minor, ushort do_stop, ushort key);
++long XHEject (ushort major, ushort minor, ushort do_eject, ushort key);
++long XHDrvMap (void);
++long XHInqDev (ushort bios, ushort *major, ushort *minor, ulong *start, __BPB *bpb);
++long XHInqDriver (ushort bios, char *name, char *version, char *company, ushort *ahdi_version, ushort *maxIPL);
++long XHNewCookie (void *newcookie);
++long XHReadWrite (ushort major, ushort minor, ushort rwflag, ulong recno, ushort count, void *buf);
++long XHInqTarget2 (ushort major, ushort minor, ulong *block_size, ulong *device_flags, char *product_name, ushort stringlen);
++long XHInqDev2 (ushort bios, ushort *major, ushort *minor, ulong *start, __BPB *bpb, ulong *blocks, char *partid);
++long XHDriverSpecial (ulong key1, ulong key2, ushort subopcode, void *data);
++long XHGetCapacity (ushort major, ushort minor, ulong *blocks, ulong *bs);
++long XHMediumChanged (ushort major, ushort minor);
++long XHMiNTInfo (ushort op, void *data);
++long XHDOSLimits (ushort which, ulong limit);
++long XHLastAccess (ushort major, ushort minor, ulong *ms);
++long XHReaccess (ushort major, ushort minor);
++
++
++# endif /* _xhdi_h */
+diff -ur --new-file e2fsprogs-1.41.3/misc/e2undo.c e2fsprogs-1.41.3-mint/misc/e2undo.c
+--- e2fsprogs-1.41.3/misc/e2undo.c 2009-01-23 12:59:44.000000000 +0000
++++ e2fsprogs-1.41.3-mint/misc/e2undo.c 2009-01-23 12:56:40.000000000 +0000
+@@ -19,6 +19,7 @@
+ #if HAVE_ERRNO_H
+ #include <errno.h>
+ #endif
++#include <sys/types.h>
+ #include "ext2fs/tdb.h"
+ #include "ext2fs/ext2fs.h"
+ #include "nls-enable.h"
+diff -ur --new-file e2fsprogs-1.41.3/misc/e2initrd_helper.c e2fsprogs-1.41.3-mint/misc/e2initrd_helper.c
+--- e2fsprogs-1.41.3/misc/e2initrd_helper.c 2009-01-23 12:58:29.000000000 +0000
++++ e2fsprogs-1.41.3-mint/misc/e2initrd_helper.c 2009-01-23 12:59:11.000000000 +0000
+@@ -50,7 +50,7 @@
+ int ptr;
+ };
+
+-struct fs_info {
++struct _fs_info {
+ char *device;
+ char *mountpt;
+ char *type;
+@@ -58,7 +58,7 @@
+ int freq;
+ int passno;
+ int flags;
+- struct fs_info *next;
++ struct _fs_info *next;
+ };
+
+ static void usage(void)
+@@ -230,7 +230,7 @@
+ *q = 0;
+ }
+
+-static int parse_fstab_line(char *line, struct fs_info *fs)
++static int parse_fstab_line(char *line, struct _fs_info *fs)
+ {
+ char *dev, *device, *mntpnt, *type, *opts, *freq, *passno, *cp;
+
+@@ -280,7 +280,7 @@
+ return 0;
+ }
+
+-static void free_fstab_line(struct fs_info *fs)
++static void free_fstab_line(struct _fs_info *fs)
+ {
+ if (fs->device)
+ fs->device = 0;
+@@ -290,7 +290,7 @@
+ fs->type = 0;
+ if (fs->opts)
+ fs->opts = 0;
+- memset(fs, 0, sizeof(struct fs_info));
++ memset(fs, 0, sizeof(struct _fs_info));
+ }
+
+
+@@ -334,7 +334,7 @@
+ errcode_t retval;
+ struct mem_file file;
+ char *buf;
+- struct fs_info fs_info;
++ struct _fs_info _fs_info;
+ int ret;
+
+ retval = get_file(fs, "/etc/fstab", &file);
+@@ -344,14 +344,14 @@
+ if (!buf)
+ continue;
+
+- ret = parse_fstab_line(buf, &fs_info);
++ ret = parse_fstab_line(buf, &_fs_info);
+ if (ret < 0)
+ goto next_line;
+
+- if (!strcmp(fs_info.mountpt, "/"))
+- printf("%s\n", fs_info.type);
++ if (!strcmp(_fs_info.mountpt, "/"))
++ printf("%s\n", _fs_info.type);
+
+- free_fstab_line(&fs_info);
++ free_fstab_line(&_fs_info);
+
+ next_line:
+ free(buf);
+diff -ur --new-file e2fsprogs-1.41.3/misc/mke2fs.c e2fsprogs-1.41.3-mint/misc/mke2fs.c
+--- e2fsprogs-1.41.3/misc/mke2fs.c 2008-10-07 14:22:39.000000000 +0000
++++ e2fsprogs-1.41.3-mint/misc/mke2fs.c 2009-01-23 10:47:35.000000000 +0000
+@@ -1819,6 +1819,36 @@
+ return retval;
+ }
+
++#ifdef __MINT__
++void
++warn (const char *drv)
++{
++ char c;
++ int check;
++
++ check = open (drv, O_RDONLY);
++ if (check == -1)
++ return;
++
++ close (check);
++
++ if (check < 1024)
++ return;
++
++ fprintf (stderr, "\n");
++ fprintf (stderr, "WARNING: THIS WILL TOTALLY DESTROY ANY DATA ON %s:\n", drv);
++ fprintf (stderr, "Are you ABSOLUTELY SURE you want to do this? (y/n) ");
++ scanf ("%c", &c);
++ fprintf (stderr, "\n");
++
++ if (c == 'y' || c == 'Y')
++ return;
++
++ fprintf (stderr, "Aborted\n");
++ exit (1);
++}
++#endif
++
+ int main (int argc, char *argv[])
+ {
+ errcode_t retval = 0;
+@@ -1839,6 +1869,11 @@
+ #endif
+ PRS(argc, argv);
+
++#ifdef __MINT__
++ if (!quiet)
++ warn (device_name);
++#endif
++
+ #ifdef CONFIG_TESTIO_DEBUG
+ if (getenv("TEST_IO_FLAGS") || getenv("TEST_IO_BLOCK")) {
+ io_ptr = test_io_manager;
diff --git a/sys-fs/e2fsprogs/files/e2fsprogs-1.41.12-darwin-makefile.patch b/sys-fs/e2fsprogs/files/e2fsprogs-1.41.12-darwin-makefile.patch
new file mode 100644
index 000000000000..9fbbfcb041bf
--- /dev/null
+++ b/sys-fs/e2fsprogs/files/e2fsprogs-1.41.12-darwin-makefile.patch
@@ -0,0 +1,101 @@
+diff --git a/lib/Makefile.darwin-lib b/lib/Makefile.darwin-lib
+index c94a5e7..6a11a66 100644
+--- a/lib/Makefile.darwin-lib
++++ b/lib/Makefile.darwin-lib
+@@ -1,14 +1,15 @@
+ #
+-# This is a Makefile stub which handles the creation of Darwin BSD shared
+-# libraries.
++# This is a Makefile stub which handles the creation of Darwin shared
++# libraries based on the ELF scheme.
+ #
+ # In order to use this stub, the following makefile variables must be defined.
+-#
+-# BSDLIB_VERSION = 1.0
+-# BSDLIB_IMAGE = libce
+-# BSDLIB_MYDIR = et
+-# BSDLIB_INSTALL_DIR = $(SHLIBDIR)
+-#
++#
++# ELF_VERSION = 1.0
++# ELF_SO_VERSION = 1
++# ELF_IMAGE = libce
++# ELF_MYDIR = et
++# ELF_INSTALL_DIR = $(SHLIBDIR)
++# ELF_OTHER_LIBS = -lc
+
+ all:: image
+
+@@ -16,36 +17,53 @@ real-subdirs:: Makefile
+ $(E) " MKDIR pic"
+ $(Q) mkdir -p pic
+
+-BSD_LIB = $(BSDLIB_IMAGE).$(BSDLIB_VERSION).dylib
+-BSDLIB_PIC_FLAG = -fPIC
++ELF_LIB = $(ELF_IMAGE).$(ELF_VERSION).dylib
++ELF_SONAME = $(ELF_IMAGE).$(ELF_SO_VERSION).dylib
+
+-image: $(BSD_LIB)
++image: $(ELF_LIB)
+
+ $(BSD_LIB): $(OBJS)
+- $(E) " GEN_BSD_SOLIB $(BSD_LIB)"
+- $(Q) (cd pic; $(CC) -dynamiclib -compatibility_version 1.0 -current_version $(BSDLIB_VERSION) \
+- -flat_namespace -undefined warning -o $(BSD_LIB) $(OBJS))
+- $(Q) $(MV) pic/$(BSD_LIB) .
+- $(Q) $(RM) -f ../$(BSD_LIB)
++ $(E) " GEN_ELF_SOLIB $(ELF_LIB)"
++ $(Q) (cd pic; $(CC) -dynamiclib -o $(ELF_LIB) $(LDFLAGS) \
++ -Wl,-install_name,$(libdir)/$(ELF_SONAME) $(OBJS) $(ELF_OTHER_LIBS))
++ $(Q) $(MV) pic/$(ELF_LIB) .
++ $(Q) $(RM) -f ../$(ELF_LIB) ../$(ELF_IMAGE).dylib ../$(ELF_SONAME)
+ $(Q) (cd ..; $(LN) $(LINK_BUILD_FLAGS) \
+- `echo $(my_dir) | sed -e 's;lib/;;'`/$(BSD_LIB) $(BSD_LIB))
+- $(Q) (cd ..; $(LN) $(LINK_BUILD_FLAGS) $(BSD_LIB) $(BSDLIB_IMAGE).dylib)
++ `echo $(my_dir) | sed -e 's;lib/;;'`/$(ELF_LIB) $(ELF_LIB))
++ $(Q) (cd ..; $(LN) $(LINK_BUILD_FLAGS) ../$(ELF_SONAME))
++
++installdirs-elf-lib::
++ $(E) " MKINSTALLDIRS $(ELF_INSTALL_DIR) $(libdir)"
++ $(Q) $(MKINSTALLDIRS) $(DESTDIR)$(ELF_INSTALL_DIR) \
++ $(DESTDIR)$(libdir)
++
++installdirs:: installdirs-elf-lib
+
+-install-shlibs install:: $(BSD_LIB)
+- $(E) " INSTALL_PROGRAM $(BSDLIB_INSTALL_DIR)/$(BSD_LIB)"
+- $(Q) $(INSTALL_PROGRAM) $(BSD_LIB) \
+- $(DESTDIR)$(BSDLIB_INSTALL_DIR)/$(BSD_LIB)
+- -$(Q) $(LDCONFIG)
++install-shlibs install:: $(ELF_LIB) installdirs-elf-lib
++ $(E) " INSTALL-ELF-LIB $(ELF_INSTALL_DIR)/$(ELF_LIB)"
++ $(Q) $(INSTALL_PROGRAM) $(ELF_LIB) $(DESTDIR)$(ELF_INSTALL_DIR)/$(ELF_LIB)
++ $(E) " SYMLINK $(ELF_INSTALL_DIR)/$(ELF_SONAME)"
++ $(Q) $(LN_S) -f $(ELF_LIB) $(DESTDIR)$(ELF_INSTALL_DIR)/$(ELF_SONAME)
++ $(E) " SYMLINK $(libdir)/$(ELF_IMAGE).dylib"
++ $(Q) $(LN_S) -f $(ELF_SONAME) \
++ $(DESTDIR)$(libdir)/$(ELF_IMAGE).dylib
+
+ install-strip: install
++ $(E) " STRIP-LIB $(ELF_INSTALL_DIR)/$(ELF_LIB)"
++ $(Q) $(STRIP) --strip-unneeded --remove-section=.comment \
++ --remove-section=.note $(DESTDIR)$(ELF_INSTALL_DIR)/$(ELF_LIB)
+
+ install-shlibs-strip: install-shlibs
++ $(E) " STRIP-LIB $(ELF_INSTALL_DIR)/$(ELF_LIB)"
++ @$(STRIP) --strip-unneeded --remove-section=.comment \
++ --remove-section=.note $(DESTDIR)$(ELF_INSTALL_DIR)/$(ELF_LIB)
+
+ uninstall-shlibs uninstall::
+- $(RM) -f $(DESTDIR)$(BSDLIB_INSTALL_DIR)/$(BSD_LIB)
++ $(RM) -f $(DESTDIR)$(ELF_INSTALL_DIR)/$(ELF_LIB) \
++ $(DESTDIR)$(ELF_INSTALL_DIR)/$(ELF_SONAME) \
++ $(DESTDIR)$(libdir)/$(ELF_IMAGE).dylib
+
+ clean::
+ $(RM) -rf pic
+- $(RM) -f $(BSD_LIB)
+- $(RM) -f ../$(BSD_LIB)
+- $(RM) -f ../$(BSDLIB_IMAGE).dylib
++ $(RM) -f $(ELF_LIB)
++ $(RM) -f ../$(ELF_LIB) ../$(ELF_IMAGE).dylib ../$(ELF_SONAME)
diff --git a/sys-fs/e2fsprogs/files/e2fsprogs-1.41.12-darwin-no-mntent.patch b/sys-fs/e2fsprogs/files/e2fsprogs-1.41.12-darwin-no-mntent.patch
new file mode 100644
index 000000000000..ceb565d8fcd3
--- /dev/null
+++ b/sys-fs/e2fsprogs/files/e2fsprogs-1.41.12-darwin-no-mntent.patch
@@ -0,0 +1,27 @@
+diff --git a/misc/ismounted.c b/misc/ismounted.c
+index 50b4140..84579a4 100644
+--- a/misc/ismounted.c
++++ b/misc/ismounted.c
+@@ -86,8 +86,10 @@ static errcode_t check_mntent_file(const char *mtab_file, const char *file,
+ char buf[1024], *device = 0, *mnt_dir = 0, *cp;
+
+ *mount_flags = 0;
++ #ifndef __APPLE__
+ if ((f = setmntent (mtab_file, "r")) == NULL)
+ return errno;
++ #endif
+ if (stat(file, &st_buf) == 0) {
+ if (S_ISBLK(st_buf.st_mode)) {
+ #ifndef __GNU__ /* The GNU hurd is broken with respect to stat devices */
+@@ -175,7 +177,11 @@ static errcode_t check_mntent_file(const char *mtab_file, const char *file,
+
+ retval = 0;
+ errout:
++ #ifdef __APPLE__
++ fclose (f);
++ #else
+ endmntent (f);
++ #endif
+ return retval;
+ #else /* !HAVE_MNTENT_H */
+ return 0;
diff --git a/sys-fs/e2fsprogs/files/e2fsprogs-1.41.4-darwin-no-mntent.patch b/sys-fs/e2fsprogs/files/e2fsprogs-1.41.4-darwin-no-mntent.patch
new file mode 100644
index 000000000000..e48d0c208934
--- /dev/null
+++ b/sys-fs/e2fsprogs/files/e2fsprogs-1.41.4-darwin-no-mntent.patch
@@ -0,0 +1,32 @@
+Dirk Tilger <dirk@miriup.de>:
+ For the mntent.patch: e2fsprogs is using a GNU libc specific
+ operation: setmntent and endmntent. Both operate on /etc/mtab, which
+ doesn't exist on MacOSX, thus they are simply not called on Darwin.
+
+http://bugs.gentoo.org/show_bug.cgi?id=263841
+
+--- misc/ismounted.c 2008-05-05 21:00:01 +0400
++++ misc/ismounted.c 2008-05-05 21:00:16 +0400
+@@ -86,8 +86,10 @@
+ if ((f = fopen(mtab_file, "r")) == NULL)
+ return errno;
+
++ #ifndef __APPLE__
+ if ((f = setmntent (mtab_file, "r")) == NULL)
+ return errno;
++ #endif
+ if (stat(file, &st_buf) == 0) {
+ if (S_ISBLK(st_buf.st_mode)) {
+ #ifndef __GNU__ /* The GNU hurd is broken with respect to stat devices */
+@@ -177,7 +173,11 @@
+
+ retval = 0;
+ errout:
++ #ifdef __APPLE__
++ fclose (f);
++ #else
+ endmntent (f);
++ #endif
+ return retval;
+ }
+
diff --git a/sys-fs/e2fsprogs/files/e2fsprogs-1.41.7-mint-blkid.patch b/sys-fs/e2fsprogs/files/e2fsprogs-1.41.7-mint-blkid.patch
new file mode 100644
index 000000000000..2464ba0ee577
--- /dev/null
+++ b/sys-fs/e2fsprogs/files/e2fsprogs-1.41.7-mint-blkid.patch
@@ -0,0 +1,43 @@
+http://bugs.gentoo.org/276055
+
+<alanh@fairlite.co.uk>:
+The configure test program links against libblkid to test. This works
+fine on shared library systems as libblkid automatically depends on
+libuuid. But on static systems it needs explicit linking.
+
+
+--- configure.in
++++ configure.in
+@@ -398,8 +398,8 @@
+ fi
+
+ AC_CHECK_LIB(blkid, blkid_get_cache,
+- [LIBBLKID=`$PKG_CONFIG --libs blkid`;
+- STATIC_LIBBLKID=`$PKG_CONFIG --static --libs blkid`],
++ [LIBBLKID=`$PKG_CONFIG --libs blkid --libs uuid`;
++ STATIC_LIBBLKID=`$PKG_CONFIG --static --libs blkid --libs uuid`],
+ [AC_MSG_ERROR([external blkid library not found])],
+ [$LIBBLKID])
+ BLKID_CMT=#
+--- configure
++++ configure
+@@ -4565,7 +4565,7 @@
+ $as_echo_n "(cached) " >&6
+ else
+ ac_check_lib_save_LIBS=$LIBS
+-LIBS="-lblkid $LIBBLKID $LIBS"
++LIBS="-lblkid -luuid $LIBBLKID $LIBS"
+ cat >conftest.$ac_ext <<_ACEOF
+ /* confdefs.h. */
+ _ACEOF
+@@ -4625,8 +4625,8 @@
+ { $as_echo "$as_me:$LINENO: result: $ac_cv_lib_blkid_blkid_get_cache" >&5
+ $as_echo "$ac_cv_lib_blkid_blkid_get_cache" >&6; }
+ if test "x$ac_cv_lib_blkid_blkid_get_cache" = x""yes; then
+- LIBBLKID=`$PKG_CONFIG --libs blkid`;
+- STATIC_LIBBLKID=`$PKG_CONFIG --static --libs blkid`
++ LIBBLKID=`$PKG_CONFIG --libs blkid --libs uuid`;
++ STATIC_LIBBLKID=`$PKG_CONFIG --static --libs blkid --libs uuid`
+ else
+ { { $as_echo "$as_me:$LINENO: error: external blkid library not found" >&5
+ $as_echo "$as_me: error: external blkid library not found" >&2;}