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 --;