ports/misc/hfsplus/patches/patch-libhfsp_src_fscheck_c

205 lines
9.1 KiB
Text

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)
{
- if ( (vh->signature = bswabU16_inc(p)) != HFSP_VOLHEAD_SIG)
+ vh->signature = bswabU16_inc(p);
+ if (vh->signature != HFSP_VOLHEAD_SIG)
{
printf("Unexpected Volume signature '%2s' expected 'H+'\n",
(char*) &vh->signature);
@@ -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);
- ((char*) p) += 32; // So finderinfo must be swapped later, ***
+ p = (((char *) p) + 32); // So finderinfo must be swapped later, ***
p = volume_readfork(p, &vh->alloc_file );
p = volume_readfork(p, &vh->ext_file );
p = volume_readfork(p, &vh->cat_file );
@@ -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");
- ((char*) p) += 0x12; /* skip unneded HFS vol fields */
+ p = (((char *)p) + 0x12); /* skip unneded HFS vol fields */
drAlBlkSiz = bswabU32_inc(p); /* offset 0x14 */
- ((char*) p) += 0x4; /* skip unneded HFS vol fields */
+ p = (((char *)p) + 0x4); /* skip unneded HFS vol fields */
drAlBlSt = bswabU16_inc(p); /* offset 0x1C */
- ((char*) p) += 0x5E; /* skip unneded HFS vol fields */
+ p = (((char *)p) + 0x5E); /* skip unneded HFS vol fields */
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 --;