diff options
author | Roy Marples <uberlord@gentoo.org> | 2007-09-15 08:54:26 +0000 |
---|---|---|
committer | Roy Marples <uberlord@gentoo.org> | 2007-09-15 08:54:26 +0000 |
commit | 840285b032d45d8f0657fcf94e24da403fc70779 (patch) | |
tree | 81de2f812f747b5fe2ecbbd897b5d8bf8d04a0dc | |
parent | fix #192289 (diff) | |
download | historical-840285b032d45d8f0657fcf94e24da403fc70779.tar.gz historical-840285b032d45d8f0657fcf94e24da403fc70779.tar.bz2 historical-840285b032d45d8f0657fcf94e24da403fc70779.zip |
Add the fsck_ext2fs helper and man page for FreeBSD and add a patch for 1.40.2 to work on FreeBSD.
Package-Manager: portage-2.1.3.9
-rw-r--r-- | sys-fs/e2fsprogs/ChangeLog | 8 | ||||
-rw-r--r-- | sys-fs/e2fsprogs/Manifest | 38 | ||||
-rw-r--r-- | sys-fs/e2fsprogs/e2fsprogs-1.40.2.ebuild | 31 | ||||
-rw-r--r-- | sys-fs/e2fsprogs/files/e2fsprogs-1.40-fbsd.patch | 21 | ||||
-rw-r--r-- | sys-fs/e2fsprogs/files/fsck_ext2fs.8 | 96 | ||||
-rw-r--r-- | sys-fs/e2fsprogs/files/fsck_ext2fs.c | 147 |
6 files changed, 315 insertions, 26 deletions
diff --git a/sys-fs/e2fsprogs/ChangeLog b/sys-fs/e2fsprogs/ChangeLog index ba8bcab81515..da05700f0b44 100644 --- a/sys-fs/e2fsprogs/ChangeLog +++ b/sys-fs/e2fsprogs/ChangeLog @@ -1,6 +1,12 @@ # ChangeLog for sys-fs/e2fsprogs # Copyright 1999-2007 Gentoo Foundation; Distributed under the GPL v2 -# $Header: /var/cvsroot/gentoo-x86/sys-fs/e2fsprogs/ChangeLog,v 1.110 2007/07/14 17:19:03 vapier Exp $ +# $Header: /var/cvsroot/gentoo-x86/sys-fs/e2fsprogs/ChangeLog,v 1.111 2007/09/15 08:54:25 uberlord Exp $ + + 15 Sep 2007; Roy Marples <uberlord@gentoo.org> +files/fsck_ext2fs.8, + +files/e2fsprogs-1.40-fbsd.patch, +files/fsck_ext2fs.c, + e2fsprogs-1.40.2.ebuild: + Add the fsck_ext2fs helper and man page for FreeBSD and add a patch for + 1.40.2 to work on FreeBSD. *e2fsprogs-1.40.2 (14 Jul 2007) diff --git a/sys-fs/e2fsprogs/Manifest b/sys-fs/e2fsprogs/Manifest index d362c5936751..a7500928cd4b 100644 --- a/sys-fs/e2fsprogs/Manifest +++ b/sys-fs/e2fsprogs/Manifest @@ -1,6 +1,3 @@ ------BEGIN PGP SIGNED MESSAGE----- -Hash: SHA1 - AUX e2fsprogs-1.32-mk_cmds-cosmetic.patch 316 RMD160 42dae53c318fb52b39c8e1d357974111bf8712bf SHA1 2515d77050072bcd1ae7defa90f32fb101ac01c5 SHA256 182da8741b852fdaf2d17a485da0451ec0c665adb83327b29b3372e2e43f712a MD5 1a896f2697b055d4b8b4139c3482ac9e files/e2fsprogs-1.32-mk_cmds-cosmetic.patch 316 RMD160 42dae53c318fb52b39c8e1d357974111bf8712bf files/e2fsprogs-1.32-mk_cmds-cosmetic.patch 316 @@ -41,10 +38,22 @@ AUX e2fsprogs-1.39-util-strptime.patch 178 RMD160 04d8e04d5e04f9a927a76b36a072c5 MD5 1fafebe6571f92773e2773deef654d16 files/e2fsprogs-1.39-util-strptime.patch 178 RMD160 04d8e04d5e04f9a927a76b36a072c50fb80eae84 files/e2fsprogs-1.39-util-strptime.patch 178 SHA256 fa300c80bbd679967ff74c361b63a9610f911b0916eff38fd491b797c0ff99c5 files/e2fsprogs-1.39-util-strptime.patch 178 +AUX e2fsprogs-1.40-fbsd.patch 646 RMD160 c0cf25c094ecad52464716f4031d9d43a1496ce1 SHA1 b6b1140b5877fafe4b03e0b7215f6fa62899055e SHA256 9320846955a3f258d888af0181bb0ee74d32cd3cc6ab8bcb31531447479bb72f +MD5 cc8abe69b45243ddd16a9ef3912734be files/e2fsprogs-1.40-fbsd.patch 646 +RMD160 c0cf25c094ecad52464716f4031d9d43a1496ce1 files/e2fsprogs-1.40-fbsd.patch 646 +SHA256 9320846955a3f258d888af0181bb0ee74d32cd3cc6ab8bcb31531447479bb72f files/e2fsprogs-1.40-fbsd.patch 646 AUX e2fsprogs-1.40-libintl.patch 395 RMD160 dc4216ba03bc4e530b499198838f5c5625d7f245 SHA1 59c50cc94f27537bc7e93094b919faf82b6512b7 SHA256 fb56042fde8e1cb0a22e3c76c3381ba39449ee151c95d437a267c5188dfdd6b1 MD5 2b3e72dc3791ae92ec98b5c937f88942 files/e2fsprogs-1.40-libintl.patch 395 RMD160 dc4216ba03bc4e530b499198838f5c5625d7f245 files/e2fsprogs-1.40-libintl.patch 395 SHA256 fb56042fde8e1cb0a22e3c76c3381ba39449ee151c95d437a267c5188dfdd6b1 files/e2fsprogs-1.40-libintl.patch 395 +AUX fsck_ext2fs.8 3806 RMD160 193e4e01508ad363c28c8d5feb124f65d59a76eb SHA1 dff54a3149f8d6187f6481c428d4b980c3abfb97 SHA256 fc1155e67f17aebc8762d75a25d25511a1463be3da05baf7a322d0b5f91938e0 +MD5 a689cd9a4217895c01c91c9e697f8416 files/fsck_ext2fs.8 3806 +RMD160 193e4e01508ad363c28c8d5feb124f65d59a76eb files/fsck_ext2fs.8 3806 +SHA256 fc1155e67f17aebc8762d75a25d25511a1463be3da05baf7a322d0b5f91938e0 files/fsck_ext2fs.8 3806 +AUX fsck_ext2fs.c 2797 RMD160 b5a58058b90876d11286ffb12de75bdbf6a064e3 SHA1 c0027c5e031b87dd8a5d50a3a256ac7637e59fd3 SHA256 a7c3614e76c89ab7882191c14a469789d4b5b54f3c61c5888e5bd72840816e22 +MD5 5afe4af9fb6c7069c01e66e282fec576 files/fsck_ext2fs.c 2797 +RMD160 b5a58058b90876d11286ffb12de75bdbf6a064e3 files/fsck_ext2fs.c 2797 +SHA256 a7c3614e76c89ab7882191c14a469789d4b5b54f3c61c5888e5bd72840816e22 files/fsck_ext2fs.c 2797 DIST e2fsprogs-1.39.tar.gz 3695111 RMD160 67e77a7cbf0e719fa8b5a8ac6285b334e1c3481b SHA1 c2dad0c9bd76701eafe3804e2a7d072aa198f046 SHA256 dc2033447e69a1612881151f6f163e8a3b80e51d16f5e8b3576f3f8ccb325ea3 DIST e2fsprogs-1.40.1.tar.gz 3957193 RMD160 5b468a143ac73da34601ad2d2f358e60091b4f08 SHA1 86e4d29accdd2a5d439940bd5c0551cfcbe875b7 SHA256 5db8bd0d4af126a112e784d40f81187a1d111d36e7b86a6ef993806a6ee02d39 DIST e2fsprogs-1.40.2.tar.gz 3965919 RMD160 6e4ec42d50fa6f0762b5c4f58c09a0fa71a9af79 SHA1 65519d66bd15550d0bcd32ec72481ff0dbe737e2 SHA256 8bbdfd8866b60edec27fee58611d98ef841892c4e2cd0f0dacf194f20a716a63 @@ -62,18 +71,18 @@ EBUILD e2fsprogs-1.40.1.ebuild 3584 RMD160 bed78e0da855c8fb36f6a7e8a91e73c28327a MD5 8c13b4ab7a190d040dd5402aa79b34f5 e2fsprogs-1.40.1.ebuild 3584 RMD160 bed78e0da855c8fb36f6a7e8a91e73c28327ab75 e2fsprogs-1.40.1.ebuild 3584 SHA256 f273f0dafcf092c546856519d02e78e2d4e164921352231c15836f533f778b67 e2fsprogs-1.40.1.ebuild 3584 -EBUILD e2fsprogs-1.40.2.ebuild 3584 RMD160 56d9cb0ca03357e92f8441d7e7d1a8ba00501ba6 SHA1 4a9b194d50082dc81f07d21f0a11f6f301b7f0fc SHA256 4d71537f6d42bca6e54b930832d439e64271480a0d5c8b3b73424cc0d965cc30 -MD5 e46b3a53115165a216a68e69cd1d4d6a e2fsprogs-1.40.2.ebuild 3584 -RMD160 56d9cb0ca03357e92f8441d7e7d1a8ba00501ba6 e2fsprogs-1.40.2.ebuild 3584 -SHA256 4d71537f6d42bca6e54b930832d439e64271480a0d5c8b3b73424cc0d965cc30 e2fsprogs-1.40.2.ebuild 3584 +EBUILD e2fsprogs-1.40.2.ebuild 3973 RMD160 3e48c9d123cb5b15050a5322ec839ffcdb6dc2a3 SHA1 47a1e4aaef7f7258d1b8c5b9a167ed68f4e4d089 SHA256 9f714fbbc1a70117ad002de8926bf171f67ed5ffede53bf889c85cf09eaa24fb +MD5 e809b207b836867744344a8fa99df150 e2fsprogs-1.40.2.ebuild 3973 +RMD160 3e48c9d123cb5b15050a5322ec839ffcdb6dc2a3 e2fsprogs-1.40.2.ebuild 3973 +SHA256 9f714fbbc1a70117ad002de8926bf171f67ed5ffede53bf889c85cf09eaa24fb e2fsprogs-1.40.2.ebuild 3973 EBUILD e2fsprogs-1.40.ebuild 3755 RMD160 4f4be7e00db70e664bcd2decd8bca753c1986846 SHA1 21a478adcb58d2c8d08a7851f39369eaaa03bf27 SHA256 4d29aba74951e171b0c80037181a6f178288190db8bd892aea61876d7105b30a MD5 b55a92cff12ba7d74ecc90caaec63aa3 e2fsprogs-1.40.ebuild 3755 RMD160 4f4be7e00db70e664bcd2decd8bca753c1986846 e2fsprogs-1.40.ebuild 3755 SHA256 4d29aba74951e171b0c80037181a6f178288190db8bd892aea61876d7105b30a e2fsprogs-1.40.ebuild 3755 -MISC ChangeLog 17819 RMD160 9073dcb2f55e6add6e28e92f4eeb72a8a8949f96 SHA1 8c53365dd9ba878b88eb6b7fed15ebdc7a471c8c SHA256 0524b9538b583eca04b3d31db05fd264fbe0db896886a56e8ec91e3f8ec1fc2a -MD5 41fbeade092c4e637d9e7ce4eddc7bcb ChangeLog 17819 -RMD160 9073dcb2f55e6add6e28e92f4eeb72a8a8949f96 ChangeLog 17819 -SHA256 0524b9538b583eca04b3d31db05fd264fbe0db896886a56e8ec91e3f8ec1fc2a ChangeLog 17819 +MISC ChangeLog 18081 RMD160 047f161984f594db257cc7e940cd98a16d566f18 SHA1 5f74e50f4063e4c0fbcdf15846947c1e128102d1 SHA256 954cde43c0e3b5c4dfec3cac293f2ab9bfa2f18464237aead3ad77520f7bfe35 +MD5 2c5525c71f0e07b05d952ce5d80252be ChangeLog 18081 +RMD160 047f161984f594db257cc7e940cd98a16d566f18 ChangeLog 18081 +SHA256 954cde43c0e3b5c4dfec3cac293f2ab9bfa2f18464237aead3ad77520f7bfe35 ChangeLog 18081 MISC metadata.xml 164 RMD160 f43cbec30b7074319087c9acffdb9354b17b0db3 SHA1 9c213f5803676c56439df3716be07d6692588856 SHA256 f5f2891f2a4791cd31350bb2bb572131ad7235cd0eeb124c9912c187ac10ce92 MD5 9a09f8d531c582e78977dbfd96edc1f2 metadata.xml 164 RMD160 f43cbec30b7074319087c9acffdb9354b17b0db3 metadata.xml 164 @@ -93,10 +102,3 @@ SHA256 34fc9d99ddb2ac1455d1eb05a649862baa502d24becbd4d952389d34498b1fe9 files/di MD5 4dfbb4dfcdb81f785ddc91f3307408ed files/digest-e2fsprogs-1.40.2 253 RMD160 e4d75313507a8be6e01cfffe25055b77f885bc86 files/digest-e2fsprogs-1.40.2 253 SHA256 68110f35f1b48f57c5da0f660ab454bc56debab94691022394ab4722f698b992 files/digest-e2fsprogs-1.40.2 253 ------BEGIN PGP SIGNATURE----- -Version: GnuPG v2.0.5 (GNU/Linux) - -iD8DBQFGmQWmp/wUKkr7RBoRAhozAKCUNf06kNVIGK+8A/LKIeXK718n1gCfeuYY -/jNu7/VtswVZTBj9vYwRZlw= -=KMzC ------END PGP SIGNATURE----- diff --git a/sys-fs/e2fsprogs/e2fsprogs-1.40.2.ebuild b/sys-fs/e2fsprogs/e2fsprogs-1.40.2.ebuild index eaf2f9fdcb55..7fcbda07b4a8 100644 --- a/sys-fs/e2fsprogs/e2fsprogs-1.40.2.ebuild +++ b/sys-fs/e2fsprogs/e2fsprogs-1.40.2.ebuild @@ -1,6 +1,6 @@ # Copyright 1999-2007 Gentoo Foundation # Distributed under the terms of the GNU General Public License v2 -# $Header: /var/cvsroot/gentoo-x86/sys-fs/e2fsprogs/e2fsprogs-1.40.2.ebuild,v 1.1 2007/07/14 17:19:03 vapier Exp $ +# $Header: /var/cvsroot/gentoo-x86/sys-fs/e2fsprogs/e2fsprogs-1.40.2.ebuild,v 1.2 2007/09/15 08:54:25 uberlord Exp $ inherit eutils flag-o-matic toolchain-funcs @@ -10,7 +10,7 @@ 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" +KEYWORDS="~alpha ~amd64 ~arm ~hppa ~ia64 ~m68k ~mips ~ppc ~ppc64 ~s390 ~sh ~sparc ~x86 ~x86-fbsd" IUSE="nls static" RDEPEND="~sys-libs/com_err-${PV} @@ -31,6 +31,9 @@ src_unpack() { epatch "${FILESDIR}"/e2fsprogs-1.39-makefile.patch epatch "${FILESDIR}"/${PN}-1.40-libintl.patch #122368 + # Fix compile on FreeBSD + epatch "${FILESDIR}"/${PN}-1.40-fbsd.patch + # kernel headers use the same defines as e2fsprogs and can cause issues #48829 sed -i \ -e 's:CONFIG_JBD_DEBUG:__CONFIG_JBD_DEBUG__E2FS:g' \ @@ -58,9 +61,9 @@ src_unpack() { src_compile() { # Keep the package from doing silly things - export LDCONFIG=/bin/true + export LDCONFIG=: export CC=$(tc-getCC) - export STRIP=/bin/true + export STRIP=: econf \ --bindir=/bin \ @@ -80,6 +83,11 @@ src_compile() { fi # Parallel make sometimes fails emake -j1 COMPILE_ET=compile_et || die + + # Build the FreeBSD helper + if use elibc_FreeBSD ; then + ${CC} "${FILESDIR}"/fsck_ext2fs.c -o fsck_ext2fs || die + fi } src_install() { @@ -104,8 +112,17 @@ src_install() { dosbin "${D}"/sbin/mklost+found rm -f "${D}"/sbin/mklost+found - # these manpages are already provided by FreeBSD libc - use elibc_FreeBSD && \ - rm -f "${D}"/usr/share/man/man3/{uuid,uuid_compare}.3 \ + if use elibc_FreeBSD ; then + # Install helpers for us + dosbin "${S}"/fsck_ext2fs + doman "${FILESDIR}"/fsck_ext2fs.8 + + # these manpages are already provided by FreeBSD libc + # and filefrag is linux only + rm -f \ + "${D}"/sbin/filefrag + "${D}"/usr/share/man/man8/filefrag.8 + "${D}"/usr/share/man/man3/{uuid,uuid_compare}.3 \ "${D}"/usr/share/man/man1/uuidgen.1 + fi } diff --git a/sys-fs/e2fsprogs/files/e2fsprogs-1.40-fbsd.patch b/sys-fs/e2fsprogs/files/e2fsprogs-1.40-fbsd.patch new file mode 100644 index 000000000000..616a638ef32c --- /dev/null +++ b/sys-fs/e2fsprogs/files/e2fsprogs-1.40-fbsd.patch @@ -0,0 +1,21 @@ +--- a/lib/ext2fs/tdb.c.orig Thu Apr 5 02:43:05 2007 ++++ b/lib/ext2fs/tdb.c Sat Jun 30 16:13:15 2007 +@@ -36,7 +36,6 @@ + #define HAVE_UTIME_H + #define HAVE_UTIME + #endif +-#define _XOPEN_SOURCE 500 + + #include <unistd.h> + #include <stdio.h> +--- a/lib/ext2fs/ext2_fs.h.orig Sat Jun 30 16:36:37 2007 ++++ b/lib/ext2fs/ext2_fs.h Sat Jun 30 16:36:43 2007 +@@ -414,7 +414,7 @@ + + #define i_size_high i_dir_acl + +-#if defined(__KERNEL__) || defined(__linux__) ++#if defined(__KERNEL__) || defined(__linux__) || defined(__FreeBSD__) + #define i_reserved1 osd1.linux1.l_i_reserved1 + #define i_frag osd2.linux2.l_i_frag + #define i_fsize osd2.linux2.l_i_fsize diff --git a/sys-fs/e2fsprogs/files/fsck_ext2fs.8 b/sys-fs/e2fsprogs/files/fsck_ext2fs.8 new file mode 100644 index 000000000000..ee40b26b58e0 --- /dev/null +++ b/sys-fs/e2fsprogs/files/fsck_ext2fs.8 @@ -0,0 +1,96 @@ +.TH fsck_ext2fs 8 2006-07-02 "Matthias Andree" "FreeBSD Ports" +.\" +.\" fsck_ext2fs.8 - manual page for fsck_ext2fs wrapper +.\" +.\" (C) Copyright 2006 by Matthias Andree <matthias.andree@gmx.de> +.\" +.\" License: This file may be redistributed in accordance with the terms +.\" of the GNU General Public License v2. +.\" +.\" Upstream $Id: fsck_ext2fs.8,v 1.1 2007/09/15 08:54:26 uberlord Exp $ +.\" $FreeBSD: ports/sysutils/e2fsprogs/files/fsck_ext2fs.8,v 1.1 2006/07/04 15:47:51 leeym Exp $ +.\" +.SH NAME +.B fsck_ext2fs +\- compatibility wrapper for e2fsck +.SH SYNOPSIS +.P +.B fsck_ext2fs +[\fB\-Fpfnyv\fR] [\fB\-b\fR \fIblock\fR] +.SH DESCRIPTION +.P +\fBfsck_ext2fs\fR maps the traditional FreeBSD \fBfsck_ffs\fR options to +options with the same functionality for \fBe2fsck,\fR runs \fBe2fsck\fR +and then maps its exit status to values that FreeBSD understands. +\fBe2fsck\fR is a utility to check and repair ext2 and ext3 file +systems. + +.SH OPTIONS +.IP \fB\-F\fR +(check foreground mode required) Immediately exits with status 1 to tell +\fBfsck\fR that ext2fs cannot be checked in the background. \fBfsck\fR +usually runs \fBfsck_*\fR programs twice, first with \fB\-F\fR to find +out if they can do background checking, then either immediately without +\fB\-F\fR for foreground checking or deferred in the background with +\fB\-B\fR. +.IP \fB\-p\fR +(preen mode) This option suppresses adding the \fB\-f\fR option (unless +\fB\-f\fR is also given) and adds the \fB\-p\fR option to the +\fBe2fsck\fR command line. This causes \fBe2fsck\fR to automatically fix +any filesystem problems that can safely be fixed without operator +intervention. Without this option given, \fBe2fsck\fR will be run with +the \fB\-f\fR option to force a check, since interactive scan and repair +mode is the default on FreeBSD, but not on Linux where \fBe2fsck\fR +comes from. +.IP \fB\-f\fR +(force check) This option forces the check of a clean file system while +preening and is passed to \fBe2fsck\fR verbatim. +.IP \fB\-n\fR +("no" mode) This option causes the file system to be opened in read-only +mode and assume "no" as answer to all questions. This is the only way to +safely run \fBfsck\fR on a mounted ext2 or ext3 file system. This option +is passed to \fBe2fsck\fR verbatim. +.IP \fB\-y\fR +("yes" mode) This option is passed verbatim to \fBe2fsck\fR and causes +it to assume "yes" as answer to all questions. This allows the +non-interactive use of e2fsck but is rather aggressive. Use with care. +.IP \fB\-v\fR +(verbose output) This option is passed verbatim to \fBe2fsck\fR and +causes it to verbosely report its progress. +.IP "\fB\-b\fR \fIblock\fR" +(use alternate super block) This option is passed verbatim to +\fBe2fsck\fR and selects an alternate super block, for use when the +primary super block has been damaged. Please see the \fBe2fsck\fR(8) +manual page for details. + +.SH EXIT STATUS +If errors remain after \fBe2fsck\fR, an invalid option or too many +options have been specified, \fBe2fsck\fR was killed with a signal or +the \fIfork\fB system call failed, \fBfsck_ext2fs\fR exits with status +EXIT_FAILURE (usually 1). If \fBe2fsck\fR cannot be started, exits with +status 127. If the file system is clean after \fBe2fsck\fR operation, +exits with status EXIT_SUCCESS (0). + +.SH NOTES +.P +This utility is merely meant as an adaptor so that \fBe2fsck\fR can be +run during the boot process, it does not support all options that +\fBe2fsck\fR offers. If you need one of its advanced options, please run +\fBe2fsck\fR directly. + +.SH FILES +.TP +.I /sbin/e2fsck +is the location of the \fBe2fsck\fR program to run. + +.SH AUTHOR +.P +Matthias Andree <matthias.andree@gmx.de> wrote the program and this +manual page. +.SH CONFORMING TO +The FreeBSD 6.1 command line interface for \fBfsck_ufs\fR(8). +.SH SEE ALSO +.BR fsck (8), +.BR e2fsck (8) +and +.BR fsck_ufs (8). diff --git a/sys-fs/e2fsprogs/files/fsck_ext2fs.c b/sys-fs/e2fsprogs/files/fsck_ext2fs.c new file mode 100644 index 000000000000..0b6a74ee0aab --- /dev/null +++ b/sys-fs/e2fsprogs/files/fsck_ext2fs.c @@ -0,0 +1,147 @@ +/* + * fsck_ext2fs - wrapper for e2fsck on FreeBSD + * Copyright (C) 2004,2006 Matthias Andree <matthias.andree@gmx.de> + * redistributable in accordance with the + * GNU General Public License v2 + * + * $FreeBSD: ports/sysutils/e2fsprogs/files/fsck_ext2fs.c,v 1.5 2006/07/04 15:47:51 leeym Exp $ + * + * Upstream: $Id: fsck_ext2fs.c,v 1.1 2007/09/15 08:54:26 uberlord Exp $ + * + * format: gindent -kr + */ + +#include <sys/types.h> +#include <unistd.h> +#include <stdlib.h> +#include <stdio.h> +#include <string.h> +#include <sys/wait.h> +#include <sys/time.h> +#include <sys/resource.h> +#include <errno.h> + +__attribute__ ((noreturn)) +static int die(const char *tag) +{ + perror(tag); + exit(EXIT_FAILURE); +} + +int main(int argc, char **argv) +{ + int ch, i = 1, force = 0, status, verbose = 0, t; + long block = 0; + enum { normal, preen, yes, no } mode = normal; + char *cmd[256]; + pid_t pid; + + cmd[0] = "/sbin/e2fsck"; + while ((ch = getopt(argc, argv, "BFpfnyb:v")) != -1) { + switch (ch) { + case 'p': + mode = preen; + break; + case 'f': + force = 1; + break; + case 'n': + mode = no; + break; + case 'y': + mode = yes; + break; + case 'b': + block = atol(optarg); + break; + case 'v': + verbose++; + break; + case 'F': + /* e2fsck does not support background checking, + * hence exit with nonzero status to force + * the foreground check. */ + exit(1); + case 'B': + default: + fprintf(stderr, "%s: unknown option -%c\n", + argv[0], optopt); + exit(EXIT_FAILURE); + } + } + + if (force) + cmd[i++] = "-f"; + + switch (mode) { + case normal: + /* FreeBSD needs -f to force a check only in context + * with -p -- so map normal to force to match + * expectations */ + if (!force) + cmd[i++] = "-f"; + break; + case yes: + cmd[i++] = "-y"; + break; + case no: + cmd[i++] = "-n"; + break; + case preen: + cmd[i++] = "-p"; + break; + } + + if (block) { + static char b[30]; + + sprintf(b, "-b %ld", block); + cmd[i++] = b; + } + + /* silently limit verbose to 15 so we don't overflow the cmd array */ + if (verbose > 15) + verbose = 15; + + for (t = verbose; t > 1; t--) + cmd[i++] = "-v"; + + while (optind < argc) { + cmd[i++] = argv[optind++]; + /* sanity check so we don't overflow the cmd buffer */ + if (i+1 == sizeof(cmd)/sizeof(cmd[0])) { + errno = E2BIG; + die(argv[0]); + } + } + + cmd[i++] = 0; + + if (verbose) { + for (i=0; cmd[i]; i++) + fputs(cmd[i], stderr), + fputc(' ', stderr); + fputc('\n', stderr); + } + + pid = fork(); + switch (pid) { + case -1: + /* error */ + die("fork"); + break; + case 0: + /* child */ + (void) execv(cmd[0], cmd); + perror("execve"); + _exit(127); + default: + /* parent */ + if (pid != waitpid(pid, &status, 0)) + die("waitpid"); + if (WIFSIGNALED(status) + || (WIFEXITED(status) && WEXITSTATUS(status) >= 4)) + exit(EXIT_FAILURE); + } + exit(EXIT_SUCCESS); +} |