unofficial mirror of guix-patches@gnu.org 
 help / color / mirror / code / Atom feed
From: Pierre Neidhardt <mail@ambrevar.xyz>
To: 35147@debbugs.gnu.org
Subject: [bug#35147] [PATCH 2/2] gnu: Add hfsprogs.
Date: Thu,  4 Apr 2019 18:49:54 +0200	[thread overview]
Message-ID: <20190404164954.26854-1-mail@ambrevar.xyz> (raw)
In-Reply-To: <20190404164814.26096-1-mail@ambrevar.xyz>

* 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 <stdarg.h>
+ #include <string.h>
+ #include <assert.h>
+-#include <Block.h>
+ 
+ #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

  reply	other threads:[~2019-04-04 16:51 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-04-04 16:48 [bug#35147] [PATCH 1/2] gnu: Add apsl2.0 Pierre Neidhardt
2019-04-04 16:49 ` Pierre Neidhardt [this message]
2022-06-23  9:23   ` bug#35147: " zimoun
     [not found] ` <handler.35147.B.155439651118672.ack@debbugs.gnu.org>
2019-04-04 16:57   ` [bug#35147] Acknowledgement ([PATCH 1/2] gnu: Add apsl2.0.) Pierre Neidhardt
2022-04-07 12:48     ` [bug#35147] [PATCH 1/2] gnu: Add apsl2.0 zimoun
2022-05-19 21:24       ` zimoun
2022-06-23  9:22 ` zimoun

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://guix.gnu.org/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20190404164954.26854-1-mail@ambrevar.xyz \
    --to=mail@ambrevar.xyz \
    --cc=35147@debbugs.gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/guix.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).