From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([209.51.188.92]:49723) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hC5Zw-0002PI-QU for guix-patches@gnu.org; Thu, 04 Apr 2019 12:51:06 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hC5Zu-00080w-Tm for guix-patches@gnu.org; Thu, 04 Apr 2019 12:51:04 -0400 Received: from debbugs.gnu.org ([209.51.188.43]:59320) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1hC5Zu-00080a-Me for guix-patches@gnu.org; Thu, 04 Apr 2019 12:51:02 -0400 Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1hC5Zu-0004vW-E2 for guix-patches@gnu.org; Thu, 04 Apr 2019 12:51:02 -0400 Subject: [bug#35147] [PATCH 2/2] gnu: Add hfsprogs. References: <20190404164814.26096-1-mail@ambrevar.xyz> In-Reply-To: <20190404164814.26096-1-mail@ambrevar.xyz> Resent-Message-ID: From: Pierre Neidhardt Date: Thu, 4 Apr 2019 18:49:54 +0200 Message-Id: <20190404164954.26854-1-mail@ambrevar.xyz> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: guix-patches-bounces+kyle=kyleam.com@gnu.org Sender: "Guix-patches" To: 35147@debbugs.gnu.org * gnu/packages/linux.scm (hfsprogs): New variable. --- gnu/packages/linux.scm | 54 +++++++ .../patches/hfsplus-tools-no-blocks.patch | 147 ++++++++++++++++++ 2 files changed, 201 insertions(+) create mode 100644 gnu/packages/patches/hfsplus-tools-no-blocks.patch diff --git a/gnu/packages/linux.scm b/gnu/packages/linux.scm index 06bf8095be..dcc9e946a2 100644 --- a/gnu/packages/linux.scm +++ b/gnu/packages/linux.scm @@ -80,8 +80,10 @@ #:use-module (gnu packages gnuzilla) #:use-module (gnu packages gperf) #:use-module (gnu packages gtk) + #:use-module (gnu packages libbsd) #:use-module (gnu packages libunwind) #:use-module (gnu packages libusb) + #:use-module (gnu packages llvm) #:use-module (gnu packages man) #:use-module (gnu packages maths) #:use-module (gnu packages multiprecision) @@ -5329,3 +5331,55 @@ have to construct the archives directly, without using the archiver.") (description "inputattach dispatches input events from several device types and interfaces and translates so that the X server can use them.") (license license:gpl2+))) + +(define-public hfsprogs + (package + (name "hfsprogs") + (version "540.1") + (source (origin + (method url-fetch) + (uri (string-append + ;; The tarball from + ;; https://opensource.apple.com/tarballs/diskdev_cmds/ + ;; does not contain any Makefile. + "http://cavan.codon.org.uk/~mjg59/diskdev_cmds/diskdev_cmds-" + version ".linux3.tar.gz")) + (sha256 + (base32 + "15sl9z1dafykj3b249z6a82p74ljqpgkvh97l0vbz8zrjwx206xh")) + ;; The patch cleans up the Makefile so we don't need clang, among others. + (patches (search-patches "hfsplus-tools-no-blocks.patch")))) + (build-system gnu-build-system) + (arguments + `(#:tests? #f ; No tests. + #:phases + (modify-phases %standard-phases + (delete 'configure) + (replace 'build + (lambda _ + ;; FIXME: Weirdly enough, PWD points to the parent directory when + ;; expanded in the CFLAGS, which leads the build to fail with + ;; "missing.h" not found. + (invoke "make" "CC=gcc" + (string-append "PWD=" (getcwd))))) + (replace 'install + (lambda* (#:key outputs #:allow-other-keys) + (let* ((out (assoc-ref outputs "out")) + (bin (string-append out "/bin/")) + (doc (string-append out "/share/man/man8"))) + (mkdir-p bin) + (copy-file "newfs_hfs.tproj/newfs_hfs" (string-append bin "/mkfs.hfsplus")) + (copy-file "fsck_hfs.tproj/fsck_hfs" (string-append bin "/fsck.hfsplus")) + (mkdir-p doc) + (copy-file "newfs_hfs.tproj/newfs_hfs.8" (string-append doc "/mkfs.hfsplus.8")) + (copy-file "fsck_hfs.tproj/fsck_hfs.8" (string-append doc "/fsck.hfsplus.8")))))))) + (inputs + `(("openssl" ,openssl))) + (native-inputs + `(("libbsd" ,libbsd) + ("util-linux" ,util-linux))) + (home-page "https://opensource.apple.com/") + (synopsis "HFS/HFS+ file system tools") + (description "This package provides user space tools to create and check +Apple HFS/HFS+ filesystems.") + (license license:apsl2.0))) diff --git a/gnu/packages/patches/hfsplus-tools-no-blocks.patch b/gnu/packages/patches/hfsplus-tools-no-blocks.patch new file mode 100644 index 0000000000..2017055744 --- /dev/null +++ b/gnu/packages/patches/hfsplus-tools-no-blocks.patch @@ -0,0 +1,147 @@ +diff -up diskdev_cmds-540.1.linux3/fsck_hfs.tproj/dfalib/SControl.c.jx diskdev_cmds-540.1.linux3/fsck_hfs.tproj/dfalib/SControl.c +--- diskdev_cmds-540.1.linux3/fsck_hfs.tproj/dfalib/SControl.c.jx 2012-02-02 17:16:56.000000000 -0500 ++++ diskdev_cmds-540.1.linux3/fsck_hfs.tproj/dfalib/SControl.c 2014-06-18 13:01:42.716781467 -0400 +@@ -200,6 +200,22 @@ isMinorError(int msg, int *counts) + } + } + ++static int *msgCounts = NULL; ++static jmp_buf envBuf; ++ ++static fsck_block_status_t ++fsckAfterCallback(fsck_ctx_t c, int msgNum, va_list args) ++{ ++ if (abs(msgNum) > E_FirstError && abs(msgNum) < E_LastError) { ++ if (isMinorError(abs(msgNum), msgCounts) == 1) ++ return fsckBlockContinue; ++ longjmp(envBuf, 1); ++ return fsckBlockAbort; ++ } else { ++ return fsckBlockContinue; ++ } ++} ++ + /*------------------------------------------------------------------------------ + + External +@@ -207,7 +223,6 @@ External + + ------------------------------------------------------------------------------*/ + +-static jmp_buf envBuf; + int + CheckHFS( const char *rdevnode, int fsReadRef, int fsWriteRef, int checkLevel, + int repairLevel, fsck_ctx_t fsckContext, int lostAndFoundMode, +@@ -222,7 +237,6 @@ CheckHFS( const char *rdevnode, int fsRe + int isJournaled = 0; + Boolean autoRepair; + Boolean exitEarly = 0; +- __block int *msgCounts = NULL; + Boolean majorErrors = 0; + + if (checkLevel == kMajorCheck) { +@@ -292,16 +306,7 @@ CheckHFS( const char *rdevnode, int fsRe + * the message in question corresponds to a major or a minor error. If it's + * major, we longjmp just above, which causes us to exit out early. + */ +- fsckSetBlock(fsckContext, fsckPhaseAfterMessage, (fsckBlock_t) ^(fsck_ctx_t c, int msgNum, va_list args) { +- if (abs(msgNum) > E_FirstError && abs(msgNum) < E_LastError) { +- if (isMinorError(abs(msgNum), msgCounts) == 1) +- return fsckBlockContinue; +- longjmp(envBuf, 1); +- return fsckBlockAbort; +- } else { +- return fsckBlockContinue; +- } +- }); ++ fsckSetBlock(fsckContext, fsckPhaseAfterMessage, fsckAfterCallback); + } + } + DoAgain: +diff -up diskdev_cmds-540.1.linux3/fsck_hfs.tproj/fsck_messages.c.jx diskdev_cmds-540.1.linux3/fsck_hfs.tproj/fsck_messages.c +--- diskdev_cmds-540.1.linux3/fsck_hfs.tproj/fsck_messages.c.jx 2012-02-02 17:42:58.000000000 -0500 ++++ diskdev_cmds-540.1.linux3/fsck_hfs.tproj/fsck_messages.c 2014-06-18 12:57:01.110952333 -0400 +@@ -29,7 +29,6 @@ + #include + #include + #include +-#include + + #include "fsck_messages.h" + #include "fsck_keys.h" +@@ -287,20 +286,10 @@ fsckSetBlock(fsck_ctx_t c, fsck_block_ph + if (c != NULL) { + switch (phase) { + case fsckPhaseBeforeMessage: +- if (ctx->preMessage) { +- Block_release(ctx->preMessage); +- ctx->preMessage = NULL; +- } +- if (bp) +- ctx->preMessage = (fsckBlock_t)Block_copy(bp); ++ ctx->preMessage = bp; + break; + case fsckPhaseAfterMessage: +- if (ctx->postMessage) { +- Block_release(ctx->postMessage); +- ctx->postMessage = NULL; +- } +- if (bp) +- ctx->postMessage = (fsckBlock_t)Block_copy(bp); ++ ctx->postMessage = bp; + break; + case fsckPhaseNone: + /* Just here for compiler warnings */ +@@ -591,12 +580,6 @@ fsckDestroy(fsck_ctx_t c) + if (ctx->flags & cfFromFD) { + fclose(ctx->fp); + } +- if (ctx->preMessage) { +- Block_release(ctx->preMessage); +- } +- if (ctx->postMessage) { +- Block_release(ctx->postMessage); +- } + + free(ctx); + return; +diff -up diskdev_cmds-540.1.linux3/fsck_hfs.tproj/fsck_messages.h.jx diskdev_cmds-540.1.linux3/fsck_hfs.tproj/fsck_messages.h +--- diskdev_cmds-540.1.linux3/fsck_hfs.tproj/fsck_messages.h.jx 2012-02-02 17:54:40.000000000 -0500 ++++ diskdev_cmds-540.1.linux3/fsck_hfs.tproj/fsck_messages.h 2014-06-18 12:31:48.602094998 -0400 +@@ -139,7 +139,7 @@ typedef enum fsck_block_phase_type fsck_ + * the third is a va_list of the arguments for the message. + */ + +-typedef fsck_block_status_t (^fsckBlock_t)(fsck_ctx_t, int, va_list); ++typedef fsck_block_status_t (*fsckBlock_t)(fsck_ctx_t, int, va_list); + + extern fsckBlock_t fsckGetBlock(fsck_ctx_t, fsck_block_phase_t); + extern void fsckSetBlock(fsck_ctx_t, fsck_block_phase_t, fsckBlock_t); +diff -up diskdev_cmds-540.1.linux3/fsck_hfs.tproj/Makefile.lnx.jx diskdev_cmds-540.1.linux3/fsck_hfs.tproj/Makefile.lnx +--- diskdev_cmds-540.1.linux3/fsck_hfs.tproj/Makefile.lnx.jx 2012-02-03 11:25:21.000000000 -0500 ++++ diskdev_cmds-540.1.linux3/fsck_hfs.tproj/Makefile.lnx 2014-06-18 12:52:03.146015370 -0400 +@@ -4,7 +4,7 @@ OFILES = $(CFILES:.c=.o) + all: fsck_hfs + + fsck_hfs: $(OFILES) dfalib/libdfa.a +- $(CC) $(CFLAGS) $(LDFLAGS) $(OFILES) dfalib/libdfa.a -o fsck_hfs -lBlocksRunTime -lpthread ++ $(CC) $(CFLAGS) $(LDFLAGS) $(OFILES) dfalib/libdfa.a -o fsck_hfs -lpthread + + dfalib/libdfa.a: FORCE + $(MAKE) -C dfalib -f Makefile.lnx libdfa.a +diff -up diskdev_cmds-540.1.linux3/Makefile.jx diskdev_cmds-540.1.linux3/Makefile +--- diskdev_cmds-540.1.linux3/Makefile.jx 2012-02-16 15:00:18.000000000 -0500 ++++ diskdev_cmds-540.1.linux3/Makefile 2014-06-18 12:42:59.015463500 -0400 +@@ -1,9 +1,8 @@ + VERSION=540.1.linux3 + +-CC := clang +-CFLAGS := -g3 -Wall -fblocks -I$(PWD)/BlocksRunTime -I$(PWD)/include -DDEBUG_BUILD=0 -D_FILE_OFFSET_BITS=64 -D LINUX=1 -D BSD=1 -D VERSION=\"$(VERSION)\" +-LDFLAGS := -Wl,--build-id -L$(PWD)/BlocksRunTime +-SUBDIRS := BlocksRunTime newfs_hfs.tproj fsck_hfs.tproj ++CFLAGS += -I$(PWD)/include -DDEBUG_BUILD=0 -D_FILE_OFFSET_BITS=64 -D LINUX=1 -D BSD=1 -D VERSION=\"$(VERSION)\" ++LDFLAGS := -Wl,--build-id ++SUBDIRS := newfs_hfs.tproj fsck_hfs.tproj + + all clean: + for d in $(SUBDIRS); do $(MAKE) -C $$d -f Makefile.lnx $@; done -- 2.21.0