On Tue, 9 Feb 2021 23:21:08 -0500
George Koehler <kern...@gmail.com> wrote:

> On Sat, 6 Feb 2021 11:53:22 +0100
> Thaison Nguyen <thieso...@me.com> wrote:
> 
> > obsd# hpmount -r /dev/rsd1i
> > hpmount: /dev/rsd1i: This is not a HFS+ volume (Unknown error: -1)

Here's the diff that I want to commit.  Thaison, does this work with
your HFS+ drive?  OpenBSD devs, is this ok to commit?

misc/hfsplus is old code from 2002 and has 2 problems:

  1. It is broken on LP64_ARCHS (like amd64), because the C code
     assumes sizeof(long) == 4.

  2. It is broken when the HFS+ has no HFS wrapper.  (My old macppc
     DVD from 2005 is new enough to lack a wrapper.  A text file in
     the wrapper would tell users of Mac OS < 8.1 that HFS+ requires
     Mac OS >= 8.1.)

In this diff:
  - Simplify Makefile by setting AUTORECONF.
  - Fix LP64_ARCHS by changing UInt32 and like from long to int.
     - Most of this diff is "%ld" -> "%d" in printf()s.
  - Fix -fno-common from Gentoo.
  - Fix HFS+ with no HFS wrapper by setting vol->maxblocks.
  - In src/copyout.c, fix passing &size to int *lenptr.

For example, copy private/etc/passwd from my old DVD:
$ hpmount -rp1 /dev/cd0c    # -p1 only for Apple partition map
$ hpcd private
$ hpcd etc                  # private/etc doesn't work
$ hpcopy passwd .
$ hpumount

Index: Makefile
===================================================================
RCS file: /cvs/ports/misc/hfsplus/Makefile,v
retrieving revision 1.34
diff -u -p -r1.34 Makefile
--- Makefile    26 Jan 2020 11:14:32 -0000      1.34
+++ Makefile    12 Feb 2021 05:29:54 -0000
@@ -5,7 +5,7 @@ COMMENT=        hfsplus filesystem access tool
 VERSION=       1.0.4
 DISTNAME=      hfsplus_${VERSION}
 PKGNAME=       hfsplus-${VERSION}
-REVISION=      6
+REVISION=      7
 SHARED_LIBS=   hfsp    0.0
 
 CATEGORIES=    misc 
@@ -22,12 +22,9 @@ USE_GMAKE=           Yes
 
 AUTOCONF_VERSION=      2.59
 AUTOMAKE_VERSION=      1.9
-BUILD_DEPENDS=         ${MODGNU_AUTOCONF_DEPENDS} \
-                       ${MODGNU_AUTOMAKE_DEPENDS}
-# needs the AM_PROG_LIBTOOL macro                                           
-BUILD_DEPENDS+=                devel/libtool
+AUTORECONF=            ${MAKE_PROGRAM} -f Makefile.cvs all
 
-CONFIGURE_STYLE=       gnu
+CONFIGURE_STYLE=       gnu autoreconf
 CONFIGURE_ENV=         CPPFLAGS="-I${LOCALBASE}/include" \
                        LDFLAGS="-L${LOCALBASE}/lib" \
                        CFLAGS="${CFLAGS} -fgnu89-inline"
@@ -37,10 +34,7 @@ WRKDIST=             ${WRKDIR}/hfsplus-${VERSION}
 DOC=                   bugs.html hfsp.html libhfsp.html
 
 post-patch:
-       @cd ${WRKDIST} && ln -s ${LOCALBASE}/share/libtool/config/ltmain.sh \
-       @cd ${WRKDIST} && env AUTOCONF_VERSION=${AUTOCONF_VERSION} \
-               AUTOMAKE_VERSION=${AUTOMAKE_VERSION} \
-               ${MAKE_PROGRAM} -f Makefile.cvs all
+       @cd ${WRKDIST} && ln -s ${LOCALBASE}/share/libtool/config/ltmain.sh .
 
 post-install:
        ${INSTALL_DATA_DIR} ${PREFIX}/share/doc/hfsplus/
Index: patches/patch-libhfsp_src_apple_h
===================================================================
RCS file: patches/patch-libhfsp_src_apple_h
diff -N patches/patch-libhfsp_src_apple_h
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ patches/patch-libhfsp_src_apple_h   12 Feb 2021 05:29:54 -0000
@@ -0,0 +1,21 @@
+$OpenBSD$
+
+Fix LP64_ARCHS: change UInt32 and like types from long to int, so each
+type has exactly 32 bits; change printf()s to match.
+
+Index: libhfsp/src/apple.h
+--- libhfsp/src/apple.h.orig
++++ libhfsp/src/apple.h
+@@ -33,9 +33,9 @@ typedef signed char      SInt8;
+ typedef unsigned char     UInt8;
+ typedef signed short      SInt16;
+ typedef unsigned short            UInt16;
+-typedef signed long       SInt32;
+-typedef unsigned long     UInt32;
+-typedef unsigned long     OSType;
++typedef signed int        SInt32;
++typedef unsigned int      UInt32;
++typedef unsigned int      OSType;
+ typedef unsigned long long  UInt64;
+ 
+ #define PARTITION_SIG     0x504d   /* 'PM' */
Index: patches/patch-libhfsp_src_btreecheck_c
===================================================================
RCS file: /cvs/ports/misc/hfsplus/patches/patch-libhfsp_src_btreecheck_c,v
retrieving revision 1.1
diff -u -p -r1.1 patch-libhfsp_src_btreecheck_c
--- patches/patch-libhfsp_src_btreecheck_c      6 Feb 2011 16:03:55 -0000       
1.1
+++ patches/patch-libhfsp_src_btreecheck_c      12 Feb 2021 05:29:54 -0000
@@ -1,6 +1,124 @@
 $OpenBSD: patch-libhfsp_src_btreecheck_c,v 1.1 2011/02/06 16:03:55 fgsch Exp $
---- libhfsp/src/btreecheck.c.orig      Tue Mar  5 19:50:29 2002
-+++ libhfsp/src/btreecheck.c   Fri Jan 28 07:34:59 2011
+
+Fix LP64_ARCHS: change UInt32 and like types from long to int, so each
+type has exactly 32 bits; change printf()s to match.
+
+Other changes unbreak the build.
+
+Index: libhfsp/src/btreecheck.c
+--- libhfsp/src/btreecheck.c.orig
++++ libhfsp/src/btreecheck.c
+@@ -57,7 +57,7 @@ static void record_print_key(hfsp_cat_key* key)
+ {
+     char buf[255]; // mh this _might_ overflow 
+     unicode_uni2asc(buf, &key->name, 255);   
+-    printf("parent cnid         : %ld\n",   key->parent_cnid);
++    printf("parent cnid         : %d\n",   key->parent_cnid);
+     printf("name                : %s\n", buf);
+ }
+ 
+@@ -87,19 +87,19 @@ static int fscheck_checkbtree(btree* bt)
+     */
+     if (head->root >= node_count)
+     {
+-      printf("root node out of range %lX >= %lX\n",
++      printf("root node out of range %X >= %X\n",
+               head->root, node_count);
+       result |= FSCK_ERR; // This is really evil
+     }
+     if (head->leaf_head >= node_count)
+     {
+-      printf("leaf_head out of range %lX >= %lX\n", 
++      printf("leaf_head out of range %X >= %X\n", 
+               head->leaf_head, node_count);
+       result |= FSCK_ERR; // dont know how to fix that by now
+     }
+     if (head->leaf_tail >= node_count)
+     {
+-      printf("leaf_head out of range %lX >= %lX\n", 
++      printf("leaf_head out of range %X >= %X\n", 
+               head->leaf_tail, node_count);
+       result |= FSCK_ERR; // dont know how to fix that by now
+     }
+@@ -117,14 +117,14 @@ static int fscheck_checkbtree(btree* bt)
+     }
+     if (head->free_nodes >= node_count)
+     {
+-      printf("free_nodes out of range %lX >= %lX\n", 
++      printf("free_nodes out of range %X >= %X\n", 
+               head->free_nodes, node_count);
+       result |= FSCK_ERR; // dont know how to fix that by now
+     }
+     // head->reserved1        nothing to check here
+     if (head->clump_size % blocksize)
+     {
+-      printf("clump_size %ld not a multiple of blocksize %ld\n", 
++      printf("clump_size %d not a multiple of blocksize %d\n", 
+               head->free_nodes, blocksize);
+       result |= FSCK_ERR; // dont know how to fix that by now
+     }
+@@ -136,7 +136,7 @@ static int fscheck_checkbtree(btree* bt)
+     // head->reserved2  nothing to check here
+     if (head->attributes & HFSPLUS_TREE_RESERVED)
+     {
+-      printf("Unexpected bits in btree header node attributes %lX\n",
++      printf("Unexpected bits in btree header node attributes %X\n",
+           head->attributes);
+       result |= FSCK_ERR; // dont know how to fix that by now
+     }
+@@ -149,16 +149,16 @@ static void btree_printhead(btree_head* head)
+ {
+     UInt32 attr;
+     printf("  depth       : %#X\n",  head->depth);
+-    printf("  root        : %#lX\n", head->root);
+-    printf("  leaf_count  : %#lX\n", head->leaf_count);
+-    printf("  leaf_head   : %#lX\n", head->leaf_head);
+-    printf("  leaf_tail   : %#lX\n", head->leaf_tail);
++    printf("  root        : %#X\n",  head->root);
++    printf("  leaf_count  : %#X\n",  head->leaf_count);
++    printf("  leaf_head   : %#X\n",  head->leaf_head);
++    printf("  leaf_tail   : %#X\n",  head->leaf_tail);
+     printf("  node_size   : %#X\n",  head->node_size);
+     printf("  max_key_len : %#X\n",  head->max_key_len);
+-    printf("  node_count  : %#lX\n", head->node_count);
+-    printf("  free_nodes  : %#lX\n", head->free_nodes);
++    printf("  node_count  : %#X\n",  head->node_count);
++    printf("  free_nodes  : %#X\n",  head->free_nodes);
+     printf("  reserved1   : %#X\n",  head->reserved1);
+-    printf("  clump_size  : %#lX\n", head->clump_size);
++    printf("  clump_size  : %#X\n",  head->clump_size);
+     printf("  btree_type  : %#X\n",  head->btree_type);
+     attr = head->attributes;
+     printf("  reserved2   : %#X\n",  head->reserved2);
+@@ -183,9 +183,9 @@ static void btree_printhead(btree_head* head)
+ 
+ static void print_node_desc(UInt32 nodeIndex, btree_node_desc* node)
+ {
+-    printf("Node descriptor for Node %ld\n", nodeIndex);
+-    printf("next     : %#lX\n", node->next);
+-    printf("prev     : %#lX\n", node->prev);
++    printf("Node descriptor for Node %d\n", nodeIndex);
++    printf("next     : %#X\n",  node->next);
++    printf("prev     : %#X\n",  node->prev);
+     printf("height   : %#X\n",  node->height);
+     printf("num_rec  : %d\n",   node->num_rec);
+     printf("reserved : %#X\n",  node->reserved);
+@@ -225,13 +225,13 @@ static int fscheck_btree_init(btree* bt, volume* vol, 
+                HFSP_EXTENT_DATA, bt->cnid);
+     if (!p)
+     {
+-      printf("Unable to read block 1 of b*tree for cnid:%ld\n", bt->cnid);
++      printf("Unable to read block 1 of b*tree for cnid:%d\n", bt->cnid);
+       return FSCK_ERR;
+     }
+     p = btree_readnode(node, p);
+     if (node->prev != 0)
+     {
+-      printf("Backlink of header node is not zero (%lX) \n", node->prev);
++      printf("Backlink of header node is not zero (%X) \n", node->prev);
+       return FSCK_ERR; // ToDo: We might ignore it but ???
+     }
+     if (node->kind != HFSP_NODE_HEAD)
 @@ -264,7 +264,7 @@ static int fscheck_btree_init(btree* bt, volume* vol, 
        {
            p = volume_readfromfork(vol, nodebuf, fork, 0, bt->blkpernode,
@@ -10,7 +128,13 @@ $OpenBSD: patch-libhfsp_src_btreecheck_c
        }
        
        bt->alloc_bits = malloc(alloc_size);
-@@ -368,7 +368,7 @@ static void* checkbtree_key_by_index(btree* bt, UInt32
+@@ -363,12 +363,12 @@ static void* checkbtree_key_by_index(btree* bt, UInt32
+     }
+     if (fsck_data.verbose)
+     {
+-      printf("Node %4ld, Record %2d is at pos %04X,"
++      printf("Node %4d, Record %2d is at pos %04X,"
+              "Backptr is at offset %04X\n", node, index, offset, off_pos);
      }
      // now we have the offset and can read the key ...
  #if BYTE_ORDER == LITTLE_ENDIAN
@@ -19,3 +143,198 @@ $OpenBSD: patch-libhfsp_src_btreecheck_c
  #else
      return buf->node + offset;
  #endif
+@@ -392,7 +392,7 @@ static int fscheck_fix_node(btree* bt, UInt32 nodeInde
+     void*          current = node->node + 0x0E; // sizeof (btree_node_desc)
+     char           kbuf[bt->head.max_key_len]; // dummy key to skip over
+     char           buf[bt->max_rec_size]; 
+-    fprintf(stderr, "Node %lu with %u records is damaged trying to fix ***\n",
++    fprintf(stderr, "Node %u with %u records is damaged trying to fix ***\n",
+               nodeIndex, num_rec);
+     for (i=0; i < num_rec; i++)
+     {
+@@ -402,7 +402,7 @@ static int fscheck_fix_node(btree* bt, UInt32 nodeInde
+       if (p != current)
+       {
+           fprintf(stderr, 
+-              "Key %u in Node %lu is damaged "
++              "Key %u in Node %u is damaged "
+               "rest of keys will be droppend ***\n", i,nodeIndex);
+           break;
+       }
+@@ -450,7 +450,7 @@ static int fscheck_btree_node(btree* bt, UInt32 nodeIn
+       if (p < previous)
+       {   // This may happen when the cache entry was flushed, but per
+           // design of the cache this should not happen, mmh
+-          printf("Backpointers in Node %ld index %d out of order "
++          printf("Backpointers in Node %d index %d out of order "
+                  "(%p >= %p)\n", nodeIndex, i, p, previous);
+           result |= FSCK_FSCORR;      // Hope we can correct that later
+       }
+@@ -471,7 +471,7 @@ static int fscheck_btree_node(btree* bt, UInt32 nodeIn
+           int comp = bt->kcomp(*key1, *key2);
+           if (comp > 0)
+           {
+-              printf("Invalid key order in node %ld record %d\n key1=",
++              printf("Invalid key order in node %d record %d\n key1=",
+                       nodeIndex, i);
+               record_print_key((hfsp_cat_key*) *key1);
+               printf("Invalid key order key2=\n");
+@@ -480,7 +480,7 @@ static int fscheck_btree_node(btree* bt, UInt32 nodeIn
+           }
+           if (comp == 0 && i > 0) // equal to key in parent node is ok
+           {
+-              printf("Duplicate key in node %ld record %d key1=\n",
++              printf("Duplicate key in node %d record %d key1=\n",
+                       nodeIndex, i);
+               record_print_key((hfsp_cat_key*) *key1);
+               printf("Duplicate key key2=\n");
+@@ -535,10 +535,10 @@ static void record_print_Rect(Rect* r)
+ /* print permissions */
+ static void record_print_perm(hfsp_perm* perm)
+ {
+-    printf("owner               : %ld\n",  perm->owner);
+-    printf("group               : %ld\n",  perm->group);
+-    printf("perm                : 0x%lX\n",perm->mode);
+-    printf("dev                 : %ld\n",  perm->dev);
++    printf("owner               : %d\n",   perm->owner);
++    printf("group               : %d\n",   perm->group);
++    printf("perm                : 0x%X\n", perm->mode);
++    printf("dev                 : %d\n",   perm->dev);
+ }
+ 
+ /* print Directory info */
+@@ -554,17 +554,17 @@ static void record_print_DInfo(DInfo* dinfo)
+ static void record_print_DXInfo(DXInfo* xinfo)
+ {
+     printf(  "frScroll            : ");    
record_print_Point(&xinfo->frScroll);
+-    printf("\nfrOpenChain         : %ld\n",  xinfo->frOpenChain);
++    printf("\nfrOpenChain         : %d\n",   xinfo->frOpenChain);
+     printf(  "frUnused            : %d\n",   xinfo->frUnused);
+     printf(  "frComment           : %d\n",   xinfo->frComment);
+-    printf(  "frPutAway           : %ld\n",  xinfo->frPutAway);
++    printf(  "frPutAway           : %d\n",   xinfo->frPutAway);
+ }
+ 
+ static void record_print_folder(hfsp_cat_folder* folder)
+ {
+     printf("flags               : 0x%X\n",    folder->flags);
+-    printf("valence             : 0x%lX\n",   folder->valence);
+-    printf("id                  : %ld\n",     folder->id);
++    printf("valence             : 0x%X\n",    folder->valence);
++    printf("id                  : %d\n",      folder->id);
+     printf("create_date         : %s",        get_atime(folder->create_date));
+     printf("content_mod_date    : %s",        
get_atime(folder->content_mod_date));
+     printf("attribute_mod_date  : %s",        
get_atime(folder->attribute_mod_date));
+@@ -573,8 +573,8 @@ static void record_print_folder(hfsp_cat_folder* folde
+     record_print_perm (&folder->permissions);
+     record_print_DInfo        (&folder->user_info);
+     record_print_DXInfo       (&folder->finder_info);
+-    printf("text_encoding       : 0x%lX\n",   folder->text_encoding);
+-    printf("reserved            : 0x%lX\n",   folder->reserved);
++    printf("text_encoding       : 0x%X\n",    folder->text_encoding);
++    printf("reserved            : 0x%X\n",    folder->reserved);
+ }
+ 
+ /* print File info */
+@@ -593,15 +593,15 @@ static void record_print_FXInfo(FXInfo* xinfo)
+     printf(  "fdIconID            : %d\n",   xinfo->fdIconID);
+     // xinfo -> fdUnused;
+     printf(  "fdComment           : %d\n",   xinfo->fdComment);
+-    printf(  "fdPutAway           : %ld\n",  xinfo->fdPutAway);
++    printf(  "fdPutAway           : %d\n",  xinfo->fdPutAway);
+ } 
+ 
+ /* print file entry */
+ static void record_print_file(hfsp_cat_file* file)
+ {
+     printf("flags               : 0x%X\n",    file->flags);
+-    printf("reserved1           : 0x%lX\n",   file->reserved1);
+-    printf("id                  : %ld\n",     file->id);
++    printf("reserved1           : 0x%X\n",    file->reserved1);
++    printf("id                  : %d\n",      file->id);
+     printf("create_date         : %s",        get_atime(file->create_date));
+     printf("content_mod_date    : %s",        
get_atime(file->content_mod_date));
+     printf("attribute_mod_date  : %s",        
get_atime(file->attribute_mod_date));
+@@ -610,8 +610,8 @@ static void record_print_file(hfsp_cat_file* file)
+     record_print_perm (&file->permissions);
+     record_print_FInfo        (&file->user_info);
+     record_print_FXInfo       (&file->finder_info);
+-    printf("text_encoding       : 0x%lX\n",   file->text_encoding);
+-    printf("reserved            : 0x%lX\n",   file->reserved2);
++    printf("text_encoding       : 0x%X\n",    file->text_encoding);
++    printf("reserved            : 0x%X\n",    file->reserved2);
+     printf("Datafork:\n");
+     print_fork (&file->data_fork);
+     printf("Rsrcfork:\n");
+@@ -623,7 +623,7 @@ static void record_print_thread(hfsp_cat_thread* entry
+ {
+     char buf[255]; // mh this _might_ overflow 
+     unicode_uni2asc(buf, &entry->nodeName, 255);   
+-    printf("parent cnid         : %ld\n", entry->parentID);
++    printf("parent cnid         : %d\n",  entry->parentID);
+     printf("name                : %s\n" , buf);
+ }
+ 
+@@ -691,7 +691,7 @@ static int fscheck_cat_key(record* r)
+ 
+     if (key->parent_cnid >= cnid)
+     {
+-      printf("parent_cnid %ld >= volume next cnid %ld\n", 
++      printf("parent_cnid %d >= volume next cnid %d\n", 
+                   key->parent_cnid, cnid);
+       result |= FSCK_FSCORR; // hope we can fix that some time
+     }
+@@ -710,7 +710,7 @@ static int fscheck_mactime(UInt32 time, char* errname)
+       printf("Warning %s is 0\n", errname);
+     */
+     if (time > fsck_data.macNow)
+-      printf("Warning %21.21s is in the future: (%lX) %s", 
++      printf("Warning %21.21s is in the future: (%X) %s", 
+               errname, time, get_atime(time));
+ 
+     return FSCK_NOERR;        // Those are not really bad, just annoying
+@@ -732,7 +732,7 @@ static int fscheck_file(btree* tree, hfsp_cat_file* fi
+     // file->reserved1        // Nothing to check here
+     if (file->id >= cnid)
+     {
+-      printf("file id %ld >= volume next cnid %ld\n", 
++      printf("file id %d >= volume next cnid %d\n", 
+                   file->id, cnid);
+       result |= FSCK_FSCORR; // hope we can fix that some time
+     }
+@@ -769,7 +769,7 @@ static int fscheck_folder(btree* tree, hfsp_cat_folder
+     // folder->valence        // to be checked later
+     if (folder->id >= cnid)
+     {
+-      printf("Folder id %ld >= volume next cnid %ld\n", 
++      printf("Folder id %d >= volume next cnid %d\n", 
+                   folder->id, cnid);
+       result |= FSCK_FSCORR; // hope we can fix that some time
+     }
+@@ -798,7 +798,7 @@ static int fscheck_thread(btree* tree, hfsp_cat_thread
+ 
+     if (thread->parentID >= cnid)
+     {
+-      printf("Thread parentID %ld >= volume next cnid %ld\n", 
++      printf("Thread parentID %d >= volume next cnid %d\n", 
+                   thread->parentID, cnid);
+       result |= FSCK_FSCORR; // hope we can fix that some time
+     }
+@@ -899,7 +899,7 @@ int fscheck_record_init(record* r, btree* bt, node_buf
+     {         // structure (should happen while debugging only)
+       fprintf(stderr, 
+           "Unexpected difference in Node %d, Record %d "
+-          ": %d (%d/%d) (%p,%p)\n",
++          ": %d (%zd/%zd) (%p,%p)\n",
+           r->node_index, index, diff , p - p1, p2 - p1, p, p2);
+       record_print(r);
+     }
+@@ -947,7 +947,7 @@ int fscheck_files(volume* vol)
+ 
+     if (!btree_check_nodealloc(catalog, catalog->head.leaf_head))
+     {
+-      printf("leaf_head %ld not allocated in node Map\n",
++      printf("leaf_head %d not allocated in node Map\n",
+               catalog->head.leaf_head);
+       result |= FSCK_FSCORR; /* Maybe we can correct that one time */
+     }
Index: patches/patch-libhfsp_src_fscheck_c
===================================================================
RCS file: /cvs/ports/misc/hfsplus/patches/patch-libhfsp_src_fscheck_c,v
retrieving revision 1.1
diff -u -p -r1.1 patch-libhfsp_src_fscheck_c
--- patches/patch-libhfsp_src_fscheck_c 6 Feb 2011 16:03:55 -0000       1.1
+++ patches/patch-libhfsp_src_fscheck_c 12 Feb 2021 05:29:54 -0000
@@ -1,7 +1,136 @@
 $OpenBSD: patch-libhfsp_src_fscheck_c,v 1.1 2011/02/06 16:03:55 fgsch Exp $
---- libhfsp/src/fscheck.c.orig Mon Mar 25 15:48:37 2002
-+++ libhfsp/src/fscheck.c      Sat Jan 29 06:01:31 2011
-@@ -204,7 +204,8 @@ static int fscheck_volume_header(volume * vol, hfsp_vh
+
+Fix -fno-common by moving fsck_data, from Gentoo
+https://gitweb.gentoo.org/repo/gentoo.git/tree/sys-fs/hfsplusutils/files/hfsplusutils-1.0.4-fno-common-gcc10.patch
+
+Fix LP64_ARCHS: change UInt32 and like types from long to int, so each
+type has exactly 32 bits; change printf()s to match.
+
+Fix hpfsck of newer HFS+ volumes: set vol->maxblocks when volume is
+without HFS wrapper, so we can find the backup volume header.
+
+Other changes unbreak the build.
+
+Index: libhfsp/src/fscheck.c
+--- libhfsp/src/fscheck.c.orig
++++ libhfsp/src/fscheck.c
+@@ -47,19 +47,21 @@
+ # include "os.h"
+ # include "swab.h"
+ 
++struct fsck_data_t fsck_data;
++
+ /* Dump all raw fork information to stdout */
+ void print_fork(hfsp_fork_raw* f)
+ {
+     int                   i;
+     hfsp_extent*    e;
+     printf("total_size          : %#LX\n"  , f->total_size);
+-    printf("clump_size          : %#lX\n"  , f->clump_size);
+-    printf("total_blocks        : %#lX\n"  , f->total_blocks);
++    printf("clump_size          : %#X\n"   , f->clump_size);
++    printf("total_blocks        : %#X\n"   , f->total_blocks);
+     printf("extents             : ");
+     for (i=0; i < 8; i++)
+     {
+       e = &f->extents[i];
+-      printf("(%#lX+%#lX) " , e->start_block,e->block_count);
++      printf("(%#X+%#X) " , e->start_block,e->block_count);
+     }
+     printf("\n");
+ }
+@@ -78,24 +80,24 @@ void volume_print(hfsp_vh* vh)
+     printf("signature       : %c%c\n" , ((char*)&vh->signature)[0], 
+                                       ((char*)&vh->signature)[1]);
+     printf("version         : %u\n"     , vh->version);
+-    printf("attributes      : %#lX\n"   , vh->attributes);
++    printf("attributes      : %#X\n"    , vh->attributes);
+     printf("last_mount_vers : "); print_sig(vh->last_mount_vers);
+-    printf("\nreserved        : %lu\n"          , vh->reserved);
++    printf("\nreserved        : %u\n"   , vh->reserved);
+       /* Hmm this is in local, apple time ... */
+     printf("create_date     : %s"       , get_atime(vh->create_date));
+     printf("modify_date     : %s"       , get_atime(vh->modify_date));
+     printf("backup_date     : %s"       , get_atime(vh->backup_date));
+     printf("checked_date    : %s"       , get_atime(vh->checked_date));
+-    printf("file_count      : %lu\n"    , vh->file_count);
+-    printf("folder_count    : %lu\n"    , vh->folder_count);
+-    printf("blocksize       : %lX\n"    , vh->blocksize);
+-    printf("total_blocks    : %lu\n"    , vh->total_blocks);
+-    printf("free_blocks     : %lu\n"    , vh->free_blocks);
+-    printf("next_alloc      : %lu\n"    , vh->next_alloc);
+-    printf("rsrc_clump_sz   : %lu\n"    , vh->rsrc_clump_sz);
+-    printf("data_clump_sz   : %lu\n"    , vh->data_clump_sz);
+-    printf("next_cnid       : %lu\n"    , vh->next_cnid);
+-    printf("write_count     : %lu\n"    , vh->write_count);
++    printf("file_count      : %u\n"     , vh->file_count);
++    printf("folder_count    : %u\n"     , vh->folder_count);
++    printf("blocksize       : %X\n"     , vh->blocksize);
++    printf("total_blocks    : %u\n"     , vh->total_blocks);
++    printf("free_blocks     : %u\n"     , vh->free_blocks);
++    printf("next_alloc      : %u\n"     , vh->next_alloc);
++    printf("rsrc_clump_sz   : %u\n"     , vh->rsrc_clump_sz);
++    printf("data_clump_sz   : %u\n"     , vh->data_clump_sz);
++    printf("next_cnid       : %u\n"     , vh->next_cnid);
++    printf("write_count     : %u\n"     , vh->write_count);
+     printf("encodings_bmp   : %#LX\n"   , vh->encodings_bmp);
+     /* vv->finder_info, p, 32); */
+     printf("                  Allocation file\n");
+@@ -119,7 +121,7 @@ static int fscheck_volume_header(volume * vol, hfsp_vh
+     // vh->signature // already checked in read
+     // vh->version    // Current is 4 but I wont check that
+     if (attributes & HFSPLUS_VOL_RESERVED1)
+-      printf("Reserved attribute in use: %lX\n", 
++      printf("Reserved attribute in use: %X\n", 
+                           vh->attributes & HFSPLUS_VOL_RESERVED1);
+     if (! (attributes & HFSPLUS_VOL_UNMNT))
+       printf("Volume was not cleanly unmounted\n");
+@@ -130,12 +132,12 @@ static int fscheck_volume_header(volume * vol, hfsp_vh
+     if (attributes & HFSPLUS_VOL_INCNSTNT)
+       printf("Volume is inconsistent\n");
+     if (attributes & HFSPLUS_VOL_RESERVED2)
+-      printf("Reserved attribute in use: %lX\n", 
++      printf("Reserved attribute in use: %X\n", 
+                           vh->attributes & HFSPLUS_VOL_RESERVED2);
+     if (fsck_data.verbose && (attributes & HFSPLUS_VOL_SOFTLOCK))
+       printf("Volume is soft locked");
+     if (attributes & HFSPLUS_VOL_RESERVED3)
+-      printf("Reserved attribute in use: %lX\n", 
++      printf("Reserved attribute in use: %X\n", 
+                           vh->attributes & HFSPLUS_VOL_RESERVED3);
+     switch (vh->last_mount_vers)
+     {
+@@ -169,25 +171,25 @@ static int fscheck_volume_header(volume * vol, hfsp_vh
+     // vh->folder_count       // To be checked later
+     if (0 != (vh->blocksize % HFSP_BLOCKSZ)) // must be multiple of BLKSZ
+     {
+-      printf("Invalid Blocksize %lX\n", vh->blocksize);
++      printf("Invalid Blocksize %X\n", vh->blocksize);
+       result = FSCK_ERR; // Wont try to correct that, yet.
+     }
+     {
+       UInt64 totalbytes    = vh->total_blocks * vh->blocksize;
+       UInt64 expectedbytes = vol->maxblocks << vol->blksize_bits;
+       if (totalbytes > expectedbytes)
+-          printf("\nInvalid total blocks %lX, expected %lX", 
++          printf("\nInvalid total blocks %X, expected %X", 
+               vh->total_blocks, (UInt32)(expectedbytes / vh->blocksize));
+     }
+     if (vh->free_blocks       > vh->total_blocks)
+-      printf("More free blocks (%lX) than total (%lX) ?\n", 
++      printf("More free blocks (%X) than total (%X) ?\n", 
+                   vh->free_blocks, vh->total_blocks);
+       // Check more later
+     // vh->next_alloc // to be checked later
+     // vh->rsrc_clump_sz  // no check needed, is a hint only
+     // vh->data_clump_sz  // no check needed, is a hint only
+     if (vh->next_cnid <= HFSP_MIN_CNID) // wil hopefully be fixed later
+-      printf("Invalid next_cnid: %ld\n", vh->next_cnid);
++      printf("Invalid next_cnid: %d\n", vh->next_cnid);
+       // Check more later
+     // vh->write_count            // no check possible
+     // vh->encodings_bmp    // no check needed, is a hint only
+@@ -204,7 +206,8 @@ static int fscheck_volume_header(volume * vol, hfsp_vh
   */
  static int fscheck_volume_readbuf(volume * vol, hfsp_vh* vh, void* p)
  {
@@ -11,7 +140,7 @@ $OpenBSD: patch-libhfsp_src_fscheck_c,v 
      {
        printf("Unexpected Volume signature '%2s' expected 'H+'\n",
                (char*) &vh->signature);
-@@ -230,7 +231,7 @@ static int fscheck_volume_readbuf(volume * vol, hfsp_v
+@@ -230,7 +233,7 @@ static int fscheck_volume_readbuf(volume * vol, hfsp_v
      vh->write_count   = bswabU32_inc(p);
      vh->encodings_bmp = bswabU64_inc(p);
      memcpy(vh->finder_info, p, 32); 
@@ -20,7 +149,7 @@ $OpenBSD: patch-libhfsp_src_fscheck_c,v 
      p = volume_readfork(p, &vh->alloc_file );
      p = volume_readfork(p, &vh->ext_file   );
      p = volume_readfork(p, &vh->cat_file   );
-@@ -277,12 +278,12 @@ static int fscheck_read_wrapper(volume * vol, hfsp_vh*
+@@ -277,12 +280,12 @@ static int fscheck_read_wrapper(volume * vol, hfsp_vh*
            printf("Volume is wrapped in HFS volume "
                   " (use hfsck to check this)\n");
  
@@ -36,3 +165,43 @@ $OpenBSD: patch-libhfsp_src_fscheck_c,v 
        signature = bswabU16_inc(p);    /* offset 0x7C, drEmbedSigWord */
        if (signature != HFSP_VOLHEAD_SIG)
            HFSP_ERROR(-1, "This looks like a normal HFS volume");
+@@ -291,7 +294,7 @@ static int fscheck_read_wrapper(volume * vol, hfsp_vh*
+       sect_per_block =  (drAlBlkSiz / HFSP_BLOCKSZ);  
+       if ((sect_per_block * HFSP_BLOCKSZ) != drAlBlkSiz)
+       {
+-          printf("HFS Blocksize %lX is not multiple of %X\n", 
++          printf("HFS Blocksize %X is not multiple of %X\n", 
+                   drAlBlkSiz, HFSP_BLOCKSZ);
+           return FSCK_ERR; // Cant help it (for now)
+       }
+@@ -301,7 +304,7 @@ static int fscheck_read_wrapper(volume * vol, hfsp_vh*
+                   << HFS_BLOCKSZ_BITS;
+       /* Now we can try to read the embedded HFS+ volume header */
+       if (fsck_data.verbose)
+-          printf("Embedded HFS+ volume at 0x%LX (0x%lX) of 0x%X sized 
Blocks\n",
++          printf("Embedded HFS+ volume at 0x%LX (0x%X) of 0x%X sized 
Blocks\n",
+                   os_offset, vol->maxblocks, HFSP_BLOCKSZ);
+       return fscheck_volume_read(vol,vh,2);
+     }
+@@ -310,7 +313,11 @@ static int fscheck_read_wrapper(volume * vol, hfsp_vh*
+       if (fsck_data.verbose)
+           printf("This HFS+ volume is not wrapped.\n");
+       p = buf; // Restore to begin of block
+-      return fscheck_volume_readbuf(vol, vh, p);
++      if (fscheck_volume_readbuf(vol, vh, p))
++          return -1;
++      // Need maxblocks in sectors
++      vol->maxblocks = vh->total_blocks * (vh->blocksize / HFSP_BLOCKSZ);
++      return 0;
+     } else
+        HFSP_ERROR(-1, "Neither Wrapper nor native HFS+ volume header found");
+     
+@@ -339,7 +346,7 @@ int check_forkalloc(volume* vol, hfsp_fork_raw* fork)
+       {
+           if (!volume_allocated(vol, block))
+           {
+-              printf("Warning block %lX not marked as allocated\n",block);
++              printf("Warning block %X not marked as allocated\n",block);
+               errcount++;
+           }
+           count --;
Index: patches/patch-libhfsp_src_fscheck_h
===================================================================
RCS file: patches/patch-libhfsp_src_fscheck_h
diff -N patches/patch-libhfsp_src_fscheck_h
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ patches/patch-libhfsp_src_fscheck_h 12 Feb 2021 05:29:54 -0000
@@ -0,0 +1,22 @@
+$OpenBSD$
+
+Fix -fno-common by moving fsck_data, from Gentoo
+https://gitweb.gentoo.org/repo/gentoo.git/tree/sys-fs/hfsplusutils/files/hfsplusutils-1.0.4-fno-common-gcc10.patch
+
+Index: libhfsp/src/fscheck.h
+--- libhfsp/src/fscheck.h.orig
++++ libhfsp/src/fscheck.h
+@@ -100,10 +100,11 @@ int fscheck_btree(btree *bt);
+ int fscheck_files(volume* vol);
+ 
+ /** global data used during fsck */
+-struct {
++struct fsck_data_t {
+     UInt32  maxCnid;
+     UInt32  macNow; // current date in mac-offset
+     int           verbose;
+     int           ignoreErr;
+-} fsck_data;
++};
+ 
++extern struct fsck_data_t fsck_data;
Index: patches/patch-libhfsp_src_record_c
===================================================================
RCS file: /cvs/ports/misc/hfsplus/patches/patch-libhfsp_src_record_c,v
retrieving revision 1.1
diff -u -p -r1.1 patch-libhfsp_src_record_c
--- patches/patch-libhfsp_src_record_c  6 Feb 2011 16:03:55 -0000       1.1
+++ patches/patch-libhfsp_src_record_c  12 Feb 2021 05:29:54 -0000
@@ -1,6 +1,13 @@
 $OpenBSD: patch-libhfsp_src_record_c,v 1.1 2011/02/06 16:03:55 fgsch Exp $
---- libhfsp/src/record.c.orig  Sun Mar 17 17:20:01 2002
-+++ libhfsp/src/record.c       Sat Jan 29 06:22:42 2011
+
+Fix LP64_ARCHS: change UInt32 and like types from long to int, so each
+type has exactly 32 bits; change printf()s to match.
+
+Other changes unbreak the build.
+
+Index: libhfsp/src/record.c
+--- libhfsp/src/record.c.orig
++++ libhfsp/src/record.c
 @@ -32,6 +32,8 @@
  
  #include <errno.h>
@@ -22,3 +29,12 @@ $OpenBSD: patch-libhfsp_src_record_c,v 1
      switch (type)
      {
        case HFSP_FOLDER:
+@@ -1269,7 +1271,7 @@ int record_insert(record* r)
+     len = p - buf;
+     if (len > bt->max_rec_size) // Emergency bail out, sorry
+     {
+-      fprintf(stderr,"Unexpected Buffer overflow in record_insert %d > %d",
++      fprintf(stderr,"Unexpected Buffer overflow in record_insert %d > %zu",
+               len, sizeof(bt->max_rec_size));
+       exit(-1);
+     } 
Index: patches/patch-libhfsp_src_volume_c
===================================================================
RCS file: /cvs/ports/misc/hfsplus/patches/patch-libhfsp_src_volume_c,v
retrieving revision 1.1
diff -u -p -r1.1 patch-libhfsp_src_volume_c
--- patches/patch-libhfsp_src_volume_c  6 Feb 2011 16:03:55 -0000       1.1
+++ patches/patch-libhfsp_src_volume_c  12 Feb 2021 05:29:54 -0000
@@ -1,6 +1,13 @@
 $OpenBSD: patch-libhfsp_src_volume_c,v 1.1 2011/02/06 16:03:55 fgsch Exp $
---- libhfsp/src/volume.c.orig  Tue Mar 26 18:00:29 2002
-+++ libhfsp/src/volume.c       Sat Jan 29 06:01:51 2011
+
+Fix hpmount of newer HFS+ volumes: set vol->maxblocks when volume is
+without HFS wrapper, so we can find the backup volume header.
+
+Other changes unbreak the build.
+
+Index: libhfsp/src/volume.c
+--- libhfsp/src/volume.c.orig
++++ libhfsp/src/volume.c
 @@ -323,7 +323,8 @@ void* volume_writefork(void *p, hfsp_fork_raw* f)
   */
  static int volume_readbuf(hfsp_vh* vh, void* p)
@@ -45,3 +52,16 @@ $OpenBSD: patch-libhfsp_src_volume_c,v 1
        signature = bswabU16_inc(p);    /* offset 0x7C, drEmbedSigWord */
        if (signature != HFSP_VOLHEAD_SIG)
            HFSP_ERROR(-1, "This looks like a normal HFS volume");
+@@ -439,7 +440,11 @@ static int volume_read_wrapper(volume * vol, hfsp_vh* 
+     else if (signature == HFSP_VOLHEAD_SIG) /* Native HFS+ volume */
+     {
+       p = buf; // Restore to begin of block
+-      return volume_readbuf(vh, p);
++      if (volume_readbuf(vh, p))
++          return -1;
++      // Need maxblocks in sectors
++      vol->maxblocks = vh->total_blocks * (vh->blocksize / HFSP_BLOCKSZ);
++      return 0;
+     } else
+        HFSP_ERROR(-1, "Neither Wrapper nor native HFS+ volume header found");
+     
Index: patches/patch-src_copyout_c
===================================================================
RCS file: patches/patch-src_copyout_c
diff -N patches/patch-src_copyout_c
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ patches/patch-src_copyout_c 12 Feb 2021 05:29:54 -0000
@@ -0,0 +1,16 @@
+$OpenBSD$
+
+Fix passing &size to int *lenptr
+
+Index: src/copyout.c
+--- src/copyout.c.orig
++++ src/copyout.c
+@@ -365,7 +365,7 @@ int do_text(volume* vol, hfsp_fork_raw *fork, UInt8 fo
+     {
+         UInt32  block   = blockiter_curr(&iter);
+         int     result  = volume_readinbuf(vol, buf, block);
+-        size_t        size    = total > blksize ? blksize : total;
++        int     size    = total > blksize ? blksize : total;
+       size_t  bytes;
+       char    *latin1, *ptr, *ptrend;
+         if (result)
Index: patches/patch-src_hpcache_c
===================================================================
RCS file: patches/patch-src_hpcache_c
diff -N patches/patch-src_hpcache_c
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ patches/patch-src_hpcache_c 12 Feb 2021 05:29:54 -0000
@@ -0,0 +1,26 @@
+$OpenBSD$
+
+Fix LP64_ARCHS: change UInt32 and like types from long to int, so each
+type has exactly 32 bits; change printf()s to match.
+
+Index: src/hpcache.c
+--- src/hpcache.c.orig
++++ src/hpcache.c
+@@ -102,7 +102,7 @@ static int hpcache_read()
+       return -1;
+     }
+ 
+-    params = fscanf(fd, "%255[^:]:%lu:%u",
++    params = fscanf(fd, "%255[^:]:%u:%u",
+               volume_cache.vname, &volume_cache.cnid, 
&volume_cache.partition);
+     if (params < 2)
+     {
+@@ -128,7 +128,7 @@ static int hpcache_write()
+       return -1;
+     }
+ 
+-    fprintf(fd, "%s:%lu:%u", 
++    fprintf(fd, "%s:%u:%u", 
+           volume_cache.vname, volume_cache.cnid, volume_cache.partition);
+ 
+     return 0;
Index: patches/patch-src_hpls_c
===================================================================
RCS file: /cvs/ports/misc/hfsplus/patches/patch-src_hpls_c,v
retrieving revision 1.3
diff -u -p -r1.3 patch-src_hpls_c
--- patches/patch-src_hpls_c    21 Nov 2007 14:30:36 -0000      1.3
+++ patches/patch-src_hpls_c    12 Feb 2021 05:29:54 -0000
@@ -1,7 +1,23 @@
 $OpenBSD: patch-src_hpls_c,v 1.3 2007/11/21 14:30:36 ajacoutot Exp $
---- src/hpls.c.orig    Sun Mar 17 18:20:39 2002
-+++ src/hpls.c Wed Nov 21 13:55:02 2007
-@@ -417,7 +417,7 @@ void showmisc(record *ent, int flags)
+
+Fix LP64_ARCHS: change UInt32 and like types from long to int, so each
+type has exactly 32 bits; change printf()s to match.
+
+Index: src/hpls.c
+--- src/hpls.c.orig
++++ src/hpls.c
+@@ -408,16 +408,16 @@ void showmisc(record *ent, int flags)
+     if (flags & HPLS_CATIDS)
+     {
+         if (ent->record.type < HFSP_FOLDER_THREAD)
+-          printf("%7lu ", ent->record.u.file.id);
++          printf("%7u ", ent->record.u.file.id);
+       else
+-          printf("%7lu ", ent->record.u.thread.parentID);
++          printf("%7u ", ent->record.u.thread.parentID);
+     }
+     if (flags & HPLS_SIZE && 
+       ent->record.type == HFSP_FILE)
      {
        size = ent->record.u.file.data_fork.total_size + 
               ent->record.u.file.res_fork.total_size;
@@ -10,6 +26,15 @@ $OpenBSD: patch-src_hpls_c,v 1.3 2007/11
      }
  }
  
+@@ -476,7 +476,7 @@ void show_long(int sz, queueent *ents, char **strs,
+         if (ent->record.type == HFSP_FOLDER)
+       {
+           hfsp_cat_folder* f = &ent->record.u.folder;
+-          printf("d%c %9lu item%c               %s %s\n",
++          printf("d%c %9u item%c               %s %s\n",
+              f->user_info.frFlags & HFS_FNDR_ISINVISIBLE ? 'i' : ' ',
+              f->valence, f->valence == 1 ? ' ' : 's',
+              timebuf + 4, strs[i]);
 @@ -484,7 +484,7 @@ void show_long(int sz, queueent *ents, char **strs,
        else if (ent->record.type == HFSP_FILE)
        {

Reply via email to