aboutsummaryrefslogtreecommitdiff
path: root/system/hfsprogs/patches/0002-Add-exclude-Darwin-specific-code.patch
diff options
context:
space:
mode:
Diffstat (limited to 'system/hfsprogs/patches/0002-Add-exclude-Darwin-specific-code.patch')
-rw-r--r--system/hfsprogs/patches/0002-Add-exclude-Darwin-specific-code.patch1408
1 files changed, 1408 insertions, 0 deletions
diff --git a/system/hfsprogs/patches/0002-Add-exclude-Darwin-specific-code.patch b/system/hfsprogs/patches/0002-Add-exclude-Darwin-specific-code.patch
new file mode 100644
index 0000000000000..a6dc6b54c834f
--- /dev/null
+++ b/system/hfsprogs/patches/0002-Add-exclude-Darwin-specific-code.patch
@@ -0,0 +1,1408 @@
+From: =?UTF-8?q?Rog=C3=A9rio=20Brito?= <rbrito@ime.usp.br>
+Date: Thu, 24 Oct 2013 01:11:21 -0200
+Subject: Add/exclude Darwin-specific code
+
+Modify some of the files so that they can be compiled without the
+Apple owned frameworks in a Debian system (and possibly others).
+---
+ fsck_hfs.tproj/cache.c | 4 ++
+ fsck_hfs.tproj/dfalib/BTree.c | 2 +
+ fsck_hfs.tproj/dfalib/BlockCache.c | 3 +
+ fsck_hfs.tproj/dfalib/SBTree.c | 2 +
+ fsck_hfs.tproj/dfalib/SDevice.c | 92 ++++++++++++++++++++---------
+ fsck_hfs.tproj/dfalib/SKeyCompare.c | 2 +
+ fsck_hfs.tproj/dfalib/SRepair.c | 2 +
+ fsck_hfs.tproj/dfalib/SRuntime.h | 7 ++-
+ fsck_hfs.tproj/dfalib/SUtils.c | 5 +-
+ fsck_hfs.tproj/dfalib/SVerify2.c | 7 +++
+ fsck_hfs.tproj/dfalib/Scavenger.h | 11 +++-
+ fsck_hfs.tproj/dfalib/hfs_endian.c | 4 ++
+ fsck_hfs.tproj/dfalib/hfs_endian.h | 7 ++-
+ fsck_hfs.tproj/fsck_hfs.c | 61 +++++++++++++++----
+ fsck_hfs.tproj/utilities.c | 8 ++-
+ include/missing.h | 115 ++++++++++++++++++++++++++++++++++++
+ newfs_hfs.tproj/hfs_endian.c | 5 ++
+ newfs_hfs.tproj/hfs_endian.h | 5 ++
+ newfs_hfs.tproj/makehfs.c | 72 ++++++++++++++++------
+ newfs_hfs.tproj/newfs_hfs.c | 74 ++++++++++++++++++++---
+ newfs_hfs.tproj/newfs_hfs.h | 26 ++++----
+ 21 files changed, 429 insertions(+), 85 deletions(-)
+ create mode 100644 include/missing.h
+
+diff --git a/fsck_hfs.tproj/cache.c b/fsck_hfs.tproj/cache.c
+index be46195..527088a 100644
+--- a/fsck_hfs.tproj/cache.c
++++ b/fsck_hfs.tproj/cache.c
+@@ -26,7 +26,11 @@
+ #include <stdlib.h>
+ #include <sys/mman.h>
+ #include <sys/stat.h>
++#if LINUX
++#include "missing.h"
++#else
+ #include <sys/types.h>
++#endif /* __LINUX__ */
+ #include <sys/uio.h>
+ #include <unistd.h>
+ #include <string.h>
+diff --git a/fsck_hfs.tproj/dfalib/BTree.c b/fsck_hfs.tproj/dfalib/BTree.c
+index edd8301..7ad9fe0 100644
+--- a/fsck_hfs.tproj/dfalib/BTree.c
++++ b/fsck_hfs.tproj/dfalib/BTree.c
+@@ -1705,7 +1705,9 @@ OSStatus BTGetInformation (SFCB *filePtr,
+ UInt16 version,
+ BTreeInfoRec *info )
+ {
++#if !LINUX
+ #pragma unused (version)
++#endif
+
+ BTreeControlBlockPtr btreePtr;
+
+diff --git a/fsck_hfs.tproj/dfalib/BlockCache.c b/fsck_hfs.tproj/dfalib/BlockCache.c
+index 1bb952f..e3a28a2 100644
+--- a/fsck_hfs.tproj/dfalib/BlockCache.c
++++ b/fsck_hfs.tproj/dfalib/BlockCache.c
+@@ -20,6 +20,9 @@
+ * @APPLE_LICENSE_HEADER_END@
+ */
+
++#if LINUX
++#include "missing.h"
++#endif
+ #include "SRuntime.h"
+ #include "Scavenger.h"
+ #include "../cache.h"
+diff --git a/fsck_hfs.tproj/dfalib/SBTree.c b/fsck_hfs.tproj/dfalib/SBTree.c
+index 2fbcd1d..cd81b13 100644
+--- a/fsck_hfs.tproj/dfalib/SBTree.c
++++ b/fsck_hfs.tproj/dfalib/SBTree.c
+@@ -322,7 +322,9 @@ ErrorExit:
+ OSStatus
+ SetEndOfForkProc ( SFCB *filePtr, FSSize minEOF, FSSize maxEOF )
+ {
++#if !LINUX
+ #pragma unused (maxEOF)
++#endif
+
+ OSStatus result;
+ UInt32 actualSectorsAdded;
+diff --git a/fsck_hfs.tproj/dfalib/SDevice.c b/fsck_hfs.tproj/dfalib/SDevice.c
+index bf6f61c..9a46023 100644
+--- a/fsck_hfs.tproj/dfalib/SDevice.c
++++ b/fsck_hfs.tproj/dfalib/SDevice.c
+@@ -2,7 +2,7 @@
+ * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+- *
++ *
+ * "Portions Copyright (c) 1999 Apple Computer, Inc. All Rights
+ * Reserved. This file contains Original Code and/or Modifications of
+ * Original Code as defined in and that are subject to the Apple Public
+@@ -10,7 +10,7 @@
+ * except in compliance with the License. Please obtain a copy of the
+ * License at http://www.apple.com/publicsource and read it before using
+ * this file.
+- *
++ *
+ * The Original Code and all software distributed under the License are
+ * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+@@ -18,7 +18,7 @@
+ * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the
+ * License for the specific language governing rights and limitations
+ * under the License."
+- *
++ *
+ * @APPLE_LICENSE_HEADER_END@
+ */
+ #include "SRuntime.h"
+@@ -28,33 +28,71 @@
+ #include <unistd.h>
+ #include <errno.h>
+ #include <sys/ioctl.h>
+-
++#if LINUX
++#include <fcntl.h>
++#include <sys/stat.h>
++#else
+ #include <IOKit/storage/IOMediaBSDClient.h>
+-
++#endif /* LINUX */
+ #else
+-
+ #include <Files.h>
+ #include <Device.h>
+ #include <Disks.h>
+
+ #endif
+
+-
+ OSErr GetDeviceSize(int driveRefNum, UInt64 *numBlocks, UInt32 *blockSize)
+ {
+ #if BSD
+ UInt64 devBlockCount = 0;
+ int devBlockSize = 0;
++#if LINUX
++ struct stat stbuf;
++
++ devBlockSize = 512;
+
++#ifndef BLKGETSIZE
++#define BLKGETSIZE _IO(0x12,96)
++#endif
++#ifndef BLKGETSIZE64
++#define BLKGETSIZE64 _IOR(0x12,114,size_t)
++#endif
++ if (fstat(driveRefNum, &stbuf) < 0){
++ printf("Error: %s\n", strerror(errno));
++ return(-1);
++ }
++
++ if (S_ISREG(stbuf.st_mode)) {
++ devBlockCount = stbuf.st_size / 512;
++ }
++ else if (S_ISBLK(stbuf.st_mode)) {
++ unsigned long size;
++ u_int64_t size64;
++ if (!ioctl(driveRefNum, BLKGETSIZE64, &size64))
++ devBlockCount = size64 / 512;
++ else if (!ioctl(driveRefNum, BLKGETSIZE, &size))
++ devBlockCount = size;
++ else{
++ printf("Error: %s\n", strerror(errno));
++ return(-1);
++ }
++
++ }
++ else{
++ printf("Device is not a block device");
++ return(-1);
++ }
++#elif BSD
+ if (ioctl(driveRefNum, DKIOCGETBLOCKCOUNT, &devBlockCount) < 0) {
+ printf("ioctl(DKIOCGETBLOCKCOUNT) for fd %d: %s\n", driveRefNum, strerror(errno));
+ return (-1);
+ }
+-
++
+ if (ioctl(driveRefNum, DKIOCGETBLOCKSIZE, &devBlockSize) < 0) {
+ printf("ioctl(DKIOCGETBLOCKSIZE) for fd %d: %s\n", driveRefNum, strerror(errno));
+ return (-1);
+ }
++#endif /* BSD */
+
+ if (devBlockSize != 512) {
+ *numBlocks = (devBlockCount * (UInt64)devBlockSize) / 512;
+@@ -70,24 +108,24 @@ OSErr GetDeviceSize(int driveRefNum, UInt64 *numBlocks, UInt32 *blockSize)
+ {
+ /* return format list status code */
+ kFmtLstCode = 6,
+-
++
+ /* reference number of .SONY driver */
+ kSonyRefNum = 0xfffb,
+-
++
+ /* values returned by DriveStatus in DrvSts.twoSideFmt */
+ kSingleSided = 0,
+ kDoubleSided = -1,
+ kSingleSidedSize = 800, /* 400K */
+ kDoubleSidedSize = 1600, /* 800K */
+-
++
+ /* values in DrvQEl.qType */
+ kWordDrvSiz = 0,
+ kLongDrvSiz = 1,
+-
++
+ /* more than enough formatListRecords */
+ kMaxFormatListRecs = 16
+ };
+-
++
+ ParamBlockRec pb;
+ FormatListRec formatListRecords[kMaxFormatListRecs];
+ DrvSts status;
+@@ -95,22 +133,22 @@ OSErr GetDeviceSize(int driveRefNum, UInt64 *numBlocks, UInt32 *blockSize)
+ OSErr result;
+ unsigned long blocks = 0;
+
+-
++
+ /* Attempt to get the drive's format list. */
+ /* (see the Technical Note "What Your Sony Drives For You") */
+-
++
+ pb.cntrlParam.ioVRefNum = driveQElementPtr->dQDrive;
+ pb.cntrlParam.ioCRefNum = driveQElementPtr->dQRefNum;
+ pb.cntrlParam.csCode = kFmtLstCode;
+ pb.cntrlParam.csParam[0] = kMaxFormatListRecs;
+ *(long *)&pb.cntrlParam.csParam[1] = (long)&formatListRecords[0];
+-
++
+ result = PBStatusSync(&pb);
+-
++
+ if ( result == noErr )
+ {
+ /* The drive supports ReturnFormatList status call. */
+-
++
+ /* Get the current disk's size. */
+ for( formatListRecIndex = 0;
+ formatListRecIndex < pb.cntrlParam.csParam[0];
+@@ -131,7 +169,7 @@ OSErr GetDeviceSize(int driveRefNum, UInt64 *numBlocks, UInt32 *blockSize)
+ else if ( driveQElementPtr->dQRefNum == (short)kSonyRefNum )
+ {
+ /* The drive is a non-SuperDrive floppy which only supports 400K and 800K disks */
+-
++
+ result = DriveStatus(driveQElementPtr->dQDrive, &status);
+ if ( result == noErr )
+ {
+@@ -140,11 +178,11 @@ OSErr GetDeviceSize(int driveRefNum, UInt64 *numBlocks, UInt32 *blockSize)
+ case kSingleSided:
+ blocks = kSingleSidedSize;
+ break;
+-
++
+ case kDoubleSided:
+ blocks = kDoubleSidedSize;
+ break;
+-
++
+ default: // This should never happen
+ result = paramErr;
+ break;
+@@ -155,20 +193,20 @@ OSErr GetDeviceSize(int driveRefNum, UInt64 *numBlocks, UInt32 *blockSize)
+ {
+ /* The drive is not a floppy and it doesn't support ReturnFormatList */
+ /* so use the dQDrvSz field(s) */
+-
++
+ result = noErr; /* reset result */
+-
++
+ switch ( driveQElementPtr->qType )
+ {
+ case kWordDrvSiz:
+ blocks = driveQElementPtr->dQDrvSz;
+ break;
+-
++
+ case kLongDrvSiz:
+ blocks = ((unsigned long)driveQElementPtr->dQDrvSz2 << 16) +
+ driveQElementPtr->dQDrvSz;
+ break;
+-
++
+ default: // This should never happen
+ result = paramErr;
+ break;
+@@ -177,7 +215,7 @@ OSErr GetDeviceSize(int driveRefNum, UInt64 *numBlocks, UInt32 *blockSize)
+
+ *numBlocks = blocks;
+ *blockSize = 512;
+-
++
+ return( result );
+ #endif
+ }
+@@ -188,7 +226,7 @@ OSErr DeviceRead(int device, int drive, void* buffer, SInt64 offset, UInt32 reqB
+ #if BSD
+ off_t seek_off;
+ ssize_t nbytes;
+-
++
+ *actBytes = 0;
+
+ seek_off = lseek(device, offset, SEEK_SET);
+diff --git a/fsck_hfs.tproj/dfalib/SKeyCompare.c b/fsck_hfs.tproj/dfalib/SKeyCompare.c
+index 46e145f..18d99c5 100644
+--- a/fsck_hfs.tproj/dfalib/SKeyCompare.c
++++ b/fsck_hfs.tproj/dfalib/SKeyCompare.c
+@@ -454,7 +454,9 @@ SInt32 CompareExtentKeysPlus( const HFSPlusExtentKey *searchKey, const HFSPlusEx
+ * The name portion of the key is compared using a 16-bit binary comparison.
+ * This is called from the b-tree code.
+ */
++#if !LINUX
+ __private_extern__
++#endif
+ SInt32
+ CompareAttributeKeys(const AttributeKey *searchKey, const AttributeKey *trialKey)
+ {
+diff --git a/fsck_hfs.tproj/dfalib/SRepair.c b/fsck_hfs.tproj/dfalib/SRepair.c
+index 01c1a10..8eb759c 100644
+--- a/fsck_hfs.tproj/dfalib/SRepair.c
++++ b/fsck_hfs.tproj/dfalib/SRepair.c
+@@ -1617,7 +1617,9 @@ Output:
+
+ static OSErr FixWrapperExtents( SGlobPtr GPtr, RepairOrderPtr p )
+ {
++#if !LINUX
+ #pragma unused (p)
++#endif
+
+ OSErr err;
+ HFSMasterDirectoryBlock *mdb;
+diff --git a/fsck_hfs.tproj/dfalib/SRuntime.h b/fsck_hfs.tproj/dfalib/SRuntime.h
+index 646917b..770e3ef 100644
+--- a/fsck_hfs.tproj/dfalib/SRuntime.h
++++ b/fsck_hfs.tproj/dfalib/SRuntime.h
+@@ -27,8 +27,11 @@
+ #define __SRUNTIME__
+
+ #if BSD
+-
++#if LINUX
++#include "missing.h"
++#else
+ #include <sys/types.h>
++#endif
+ #include <stdlib.h>
+ #include <string.h>
+ #include <stdio.h>
+@@ -91,10 +94,12 @@ typedef const unsigned char * ConstStr255Param;
+
+ typedef u_int32_t HFSCatalogNodeID;
+
++#if !LINUX
+ enum {
+ false = 0,
+ true = 1
+ };
++#endif
+
+ /* OS error codes */
+ enum {
+diff --git a/fsck_hfs.tproj/dfalib/SUtils.c b/fsck_hfs.tproj/dfalib/SUtils.c
+index 72035f0..6e9253e 100644
+--- a/fsck_hfs.tproj/dfalib/SUtils.c
++++ b/fsck_hfs.tproj/dfalib/SUtils.c
+@@ -380,7 +380,8 @@ void InvalidateCalculatedVolumeBitMap( SGlobPtr GPtr )
+ // GPtr->realVCB Real in-memory vcb
+ //------------------------------------------------------------------------------
+
+-#if !BSD
++#if BSD
++#if !LINUX
+ OSErr GetVolumeFeatures( SGlobPtr GPtr )
+ {
+ OSErr err;
+@@ -418,7 +419,7 @@ OSErr GetVolumeFeatures( SGlobPtr GPtr )
+ return( noErr );
+ }
+ #endif
+-
++#endif
+
+
+ /*-------------------------------------------------------------------------------
+diff --git a/fsck_hfs.tproj/dfalib/SVerify2.c b/fsck_hfs.tproj/dfalib/SVerify2.c
+index 6a47935..c68f3d8 100644
+--- a/fsck_hfs.tproj/dfalib/SVerify2.c
++++ b/fsck_hfs.tproj/dfalib/SVerify2.c
+@@ -32,7 +32,9 @@
+ */
+
+ #include <sys/ioctl.h>
++#if !LINUX
+ #include <sys/disk.h>
++#endif
+
+ #include "BTree.h"
+ #include "BTreePrivate.h"
+@@ -1354,8 +1356,13 @@ OSErr CompareVolumeHeader( SGlobPtr GPtr, HFSPlusVolumeHeader *volumeHeader )
+ * clump size for read-only media is irrelevant we skip the clump size
+ * check to avoid non useful warnings.
+ */
++#if LINUX
++ // FIXME
++ isWriteable = 1;
++#else
+ isWriteable = 0;
+ ioctl( GPtr->DrvNum, DKIOCISWRITABLE, &isWriteable );
++#endif
+ if ( isWriteable != 0 &&
+ volumeHeader->catalogFile.clumpSize != vcb->vcbCatalogFile->fcbClumpSize ) {
+ PrintError(GPtr, E_InvalidClumpSize, 0);
+diff --git a/fsck_hfs.tproj/dfalib/Scavenger.h b/fsck_hfs.tproj/dfalib/Scavenger.h
+index cf53970..edb3a80 100644
+--- a/fsck_hfs.tproj/dfalib/Scavenger.h
++++ b/fsck_hfs.tproj/dfalib/Scavenger.h
+@@ -37,11 +37,16 @@
+ #include "../fsck_debug.h"
+
+ #include <assert.h>
++#if LINUX
++#define XATTR_MAXNAMELEN 127
++#include <limits.h>
++#else
+ #include <sys/xattr.h>
+ #include <sys/acl.h>
+ #include <sys/kauth.h>
+-#include <sys/errno.h>
+ #include <sys/syslimits.h>
++#endif
++#include <sys/errno.h>
+
+ #ifdef __cplusplus
+ extern "C" {
+@@ -1465,4 +1470,8 @@ extern int AllocateContigBitmapBits (SVCB *vcb, UInt32 numBlocks, UInt32 *actua
+ };
+ #endif
+
++/* #if LINUX
++#undef XATTR_MAXNAMELEN
++#endif */
++
+ #endif /* __SCAVENGER__ */
+diff --git a/fsck_hfs.tproj/dfalib/hfs_endian.c b/fsck_hfs.tproj/dfalib/hfs_endian.c
+index 7fa5385..69500c1 100755
+--- a/fsck_hfs.tproj/dfalib/hfs_endian.c
++++ b/fsck_hfs.tproj/dfalib/hfs_endian.c
+@@ -31,7 +31,11 @@
+ #include <sys/types.h>
+ #include <sys/stat.h>
+
++#if LINUX
++#include "missing.h"
++#else
+ #include <architecture/byte_order.h>
++#endif
+ #include <hfs/hfs_format.h>
+
+ #include "Scavenger.h"
+diff --git a/fsck_hfs.tproj/dfalib/hfs_endian.h b/fsck_hfs.tproj/dfalib/hfs_endian.h
+index 52d0c3a..0763d9d 100755
+--- a/fsck_hfs.tproj/dfalib/hfs_endian.h
++++ b/fsck_hfs.tproj/dfalib/hfs_endian.h
+@@ -27,9 +27,14 @@
+ *
+ * This file prototypes endian swapping routines for the HFS/HFS Plus
+ * volume format.
+- */
++*/
+ #include <hfs/hfs_format.h>
++#if LINUX
++#include <endian.h>
++#include <byteswap.h>
++#else
+ #include <architecture/byte_order.h>
++#endif
+ #include "SRuntime.h"
+
+ /*********************/
+diff --git a/fsck_hfs.tproj/fsck_hfs.c b/fsck_hfs.tproj/fsck_hfs.c
+index 90532fd..f1a18bd 100644
+--- a/fsck_hfs.tproj/fsck_hfs.c
++++ b/fsck_hfs.tproj/fsck_hfs.c
+@@ -24,10 +24,14 @@
+ #include <sys/types.h>
+ #include <sys/stat.h>
+ #include <sys/param.h>
++#if !LINUX
+ #include <sys/ucred.h>
++#endif
+ #include <sys/mount.h>
+ #include <sys/ioctl.h>
++#if !LINUX
+ #include <sys/disk.h>
++#endif
+
+ #include <hfs/hfs_mount.h>
+
+@@ -195,8 +199,12 @@ main(argc, argv)
+ if (guiControl)
+ debug = 0; /* debugging is for command line only */
+
++#if LINUX
++// FIXME
++#else
+ if (signal(SIGINT, SIG_IGN) != SIG_IGN)
+ (void)signal(SIGINT, catch);
++#endif
+
+ if (argc < 1) {
+ (void) fprintf(stderr, "%s: missing special-device\n", progname);
+@@ -218,7 +226,9 @@ checkfilesys(char * filesys)
+ int chkLev, repLev, logLev;
+ int blockDevice_fd, canWrite;
+ char *unraw, *mntonname;
++#if !LINUX
+ struct statfs *fsinfo;
++#endif
+ int fs_fd=-1; // fd to the root-dir of the fs we're checking (only w/lfag == 1)
+
+ flags = 0;
+@@ -227,7 +237,9 @@ checkfilesys(char * filesys)
+ canWrite = 0;
+ unraw = NULL;
+ mntonname = NULL;
+-
++#if LINUX
++ // FIXME
++#else
+ if (lflag) {
+ result = getmntinfo(&fsinfo, MNT_NOWAIT);
+
+@@ -257,10 +269,10 @@ checkfilesys(char * filesys)
+ }
+ }
+ }
+-
++#endif
+ if (debug && preen)
+ pwarn("starting\n");
+-
++
+ if (setup( filesys, &blockDevice_fd, &canWrite ) == 0) {
+ if (preen)
+ pfatal("CAN'T CHECK FILE SYSTEM.");
+@@ -278,7 +290,7 @@ checkfilesys(char * filesys)
+ repLev = kMajorRepairs;
+ logLev = kVerboseLog;
+
+- if (yflag)
++ if (yflag)
+ repLev = kMajorRepairs;
+
+ if (quick) {
+@@ -298,16 +310,16 @@ checkfilesys(char * filesys)
+
+ if (nflag)
+ repLev = kNeverRepair;
+-
++
+ if ( rebuildCatalogBtree ) {
+ chkLev = kPartialCheck;
+ repLev = kForceRepairs; // this will force rebuild of catalog B-Tree file
+ }
+-
++
+ /*
+ * go check HFS volume...
+ */
+- result = CheckHFS( fsreadfd, fswritefd, chkLev, repLev, logLev,
++ result = CheckHFS( fsreadfd, fswritefd, chkLev, repLev, logLev,
+ guiControl, lostAndFoundMode, canWrite, &fsmodified );
+ if (!hotroot) {
+ ckfini(1);
+@@ -330,6 +342,9 @@ checkfilesys(char * filesys)
+ }
+ }
+ } else {
++#if LINUX
++ // FIXME
++#else
+ struct statfs stfs_buf;
+ /*
+ * Check to see if root is mounted read-write.
+@@ -339,19 +354,25 @@ checkfilesys(char * filesys)
+ else
+ flags = 0;
+ ckfini(flags & MNT_RDONLY);
++#endif
+ }
+
+ /* XXX free any allocated memory here */
+
+ if (hotroot && fsmodified) {
++#if !LINUX
+ struct hfs_mount_args args;
++#endif
+ /*
+ * We modified the root. Do a mount update on
+ * it, unless it is read-write, so we can continue.
+ */
+ if (!preen)
+ printf("\n***** FILE SYSTEM WAS MODIFIED *****\n");
+- if (flags & MNT_RDONLY) {
++#if LINUX
++ // FIXME
++#else
++ if (flags & MNT_RDONLY) {
+ bzero(&args, sizeof(args));
+ flags |= MNT_UPDATE | MNT_RELOAD;
+ if (mount("hfs", "/", flags, &args) == 0) {
+@@ -359,6 +380,7 @@ checkfilesys(char * filesys)
+ goto ExitThisRoutine;
+ }
+ }
++#endif
+ if (!preen)
+ printf("\n***** REBOOT NOW *****\n");
+ sync();
+@@ -367,7 +389,7 @@ checkfilesys(char * filesys)
+ }
+
+ result = (result == 0) ? 0 : EEXIT;
+-
++
+ ExitThisRoutine:
+ if (lflag) {
+ fcntl(fs_fd, F_THAW_FS, NULL);
+@@ -401,16 +423,18 @@ setup( char *dev, int *blockDevice_fdPtr, int *canWritePtr )
+ fswritefd = -1;
+ *blockDevice_fdPtr = -1;
+ *canWritePtr = 0;
+-
++
+ if (stat(dev, &statb) < 0) {
+ printf("Can't stat %s: %s\n", dev, strerror(errno));
+ return (0);
+ }
++#if !LINUX
+ if ((statb.st_mode & S_IFMT) != S_IFCHR) {
+ pfatal("%s is not a character device", dev);
+ if (reply("CONTINUE") == 0)
+ return (0);
+ }
++#endif
+ if ((fsreadfd = open(dev, O_RDONLY)) < 0) {
+ printf("Can't open %s: %s\n", dev, strerror(errno));
+ return (0);
+@@ -419,7 +443,7 @@ setup( char *dev, int *blockDevice_fdPtr, int *canWritePtr )
+ /* attempt to get write access to the block device and if not check if volume is */
+ /* mounted read-only. */
+ getWriteAccess( dev, blockDevice_fdPtr, canWritePtr );
+-
++
+ if (preen == 0 && !guiControl)
+ printf("** %s", dev);
+ if (nflag || (fswritefd = open(dev, O_WRONLY)) < 0) {
+@@ -433,10 +457,14 @@ setup( char *dev, int *blockDevice_fdPtr, int *canWritePtr )
+ printf("\n");
+
+ /* Get device block size to initialize cache */
++#if LINUX
++ devBlockSize = 512;
++#else
+ if (ioctl(fsreadfd, DKIOCGETBLOCKSIZE, &devBlockSize) < 0) {
+ pfatal ("Can't get device block size\n");
+ return (0);
+ }
++#endif
+
+ /* calculate the cache block size and total blocks */
+ if (CalculateCacheSize(userCacheSize, &cacheBlockSize, &cacheTotalBlocks, debug) != 0) {
+@@ -463,11 +491,15 @@ setup( char *dev, int *blockDevice_fdPtr, int *canWritePtr )
+
+ static void getWriteAccess( char *dev, int *blockDevice_fdPtr, int *canWritePtr )
+ {
++#if !LINUX
+ int i;
+ int myMountsCount;
++#endif
+ void * myPtr;
+ char * myCharPtr;
++#if !LINUX
+ struct statfs * myBufPtr;
++#endif
+ void * myNamePtr;
+
+ myPtr = NULL;
+@@ -490,6 +522,9 @@ static void getWriteAccess( char *dev, int *blockDevice_fdPtr, int *canWritePtr
+ }
+
+ // get count of mounts then get the info for each
++#if LINUX
++ // FIXME
++#else
+ myMountsCount = getfsstat( NULL, 0, MNT_NOWAIT );
+ if ( myMountsCount < 0 )
+ goto ExitThisRoutine;
+@@ -513,8 +548,8 @@ static void getWriteAccess( char *dev, int *blockDevice_fdPtr, int *canWritePtr
+ }
+ myBufPtr++;
+ }
+- *canWritePtr = 1; // single user will get us here, f_mntfromname is not /dev/diskXXXX
+-
++#endif
++ *canWritePtr = 1; // single user will get us here, f_mntfromname is not /dev/diskXXXX
+ ExitThisRoutine:
+ if ( myPtr != NULL )
+ free( myPtr );
+diff --git a/fsck_hfs.tproj/utilities.c b/fsck_hfs.tproj/utilities.c
+index ee41bef..8e1cd77 100644
+--- a/fsck_hfs.tproj/utilities.c
++++ b/fsck_hfs.tproj/utilities.c
+@@ -183,12 +183,14 @@ retry:
+ printf("Can't stat %s\n", raw);
+ return (origname);
+ }
++#if !LINUX
+ if ((stchar.st_mode & S_IFMT) == S_IFCHR) {
+ return (raw);
+ } else {
+ printf("%s is not a character device\n", raw);
+ return (origname);
+ }
++#endif
+ } else if ((stblock.st_mode & S_IFMT) == S_IFCHR && !retried) {
+ newname = unrawname(newname);
+ retried++;
+@@ -214,7 +216,11 @@ rawname(char *name)
+ *dp = 0;
+ (void)strcpy(rawbuf, name);
+ *dp = '/';
+- (void)strcat(rawbuf, "/r");
++#if LINUX
++ (void)strcat(rawbuf, "/");
++#else
++ (void)strcat(rawbuf,"/r");
++#endif
+ (void)strcat(rawbuf, &dp[1]);
+
+ return (rawbuf);
+diff --git a/include/missing.h b/include/missing.h
+new file mode 100644
+index 0000000..0a859c4
+--- /dev/null
++++ b/include/missing.h
+@@ -0,0 +1,115 @@
++#ifndef _MISSING_H_
++#define _MISSING_H_
++
++#include <endian.h>
++#include <byteswap.h>
++#include <errno.h>
++#include <stdint.h>
++#include <string.h>
++#include <bsd/string.h>
++
++#define MAXBSIZE (256 * 4096)
++
++#ifndef true
++#define true 1
++#endif
++#ifndef false
++#define false 0
++#endif
++
++/* Mac types */
++
++/* 8 Bit */
++#ifndef UInt8
++#define UInt8 uint8_t
++#endif
++#ifndef u_int8_t
++#define u_int8_t UInt8
++#endif
++#ifndef SInt8
++#define SInt8 int8_t
++#endif
++
++/* 16 Bit */
++#ifndef UInt16
++#define UInt16 uint16_t
++#endif
++#ifndef u_int16_t
++#define u_int16_t UInt16
++#endif
++#ifndef SInt16
++#define SInt16 int16_t
++#endif
++
++/* 32 Bit */
++#ifndef UInt32
++#define UInt32 uint32_t
++#endif
++#ifndef u_int32_t
++#define u_int32_t UInt32
++#endif
++#ifndef SInt32
++#define SInt32 int32_t
++#endif
++
++/* 64 Bit */
++#ifndef UInt64
++#define UInt64 uint64_t
++#endif
++#ifndef u_int64_t
++#define u_int64_t UInt64
++#endif
++#ifndef SInt64
++#define SInt64 int64_t
++#endif
++
++#define UniChar u_int16_t
++#define Boolean u_int8_t
++
++#define UF_NODUMP 0x00000001
++
++/* syslimits.h */
++#define NAME_MAX 255
++
++/* Byteswap stuff */
++#define NXSwapHostLongToBig(x) cpu_to_be64(x)
++#define NXSwapBigShortToHost(x) be16_to_cpu(x)
++#define OSSwapBigToHostInt16(x) be16_to_cpu(x)
++#define NXSwapBigLongToHost(x) be32_to_cpu(x)
++#define OSSwapBigToHostInt32(x) be32_to_cpu(x)
++#define NXSwapBigLongLongToHost(x) be64_to_cpu(x)
++#define OSSwapBigToHostInt64(x) be64_to_cpu(x)
++
++#if __BYTE_ORDER == __LITTLE_ENDIAN
++/* Big Endian Swaps */
++#ifndef be16_to_cpu
++#define be16_to_cpu(x) bswap_16(x)
++#endif
++#ifndef be32_to_cpu
++#define be32_to_cpu(x) bswap_32(x)
++#endif
++#ifndef be64_to_cpu
++#define be64_to_cpu(x) bswap_64(x)
++#endif
++#ifndef cpu_to_be64
++#define cpu_to_be64(x) bswap_64(x)
++#endif
++#elif __BYTE_ORDER == __BIG_ENDIAN
++/* Big endian doesn't swap */
++#ifndef be16_to_cpu
++#define be16_to_cpu(x) (x)
++#endif
++#ifndef be32_to_cpu
++#define be32_to_cpu(x) (x)
++#endif
++#ifndef be64_to_cpu
++#define be64_to_cpu(x) (x)
++#endif
++#ifndef cpu_to_be64
++#define cpu_to_be64(x) (x)
++#endif
++#endif
++
++#define KAUTH_FILESEC_XATTR "com.apple.system.Security"
++
++#endif
+diff --git a/newfs_hfs.tproj/hfs_endian.c b/newfs_hfs.tproj/hfs_endian.c
+index 117b7f8..fdf7353 100644
+--- a/newfs_hfs.tproj/hfs_endian.c
++++ b/newfs_hfs.tproj/hfs_endian.c
+@@ -30,7 +30,12 @@
+ #include <sys/types.h>
+ #include <sys/stat.h>
+
++#if LINUX
++#include "missing.h"
++#else
+ #include <architecture/byte_order.h>
++#endif
++
+ #include <hfs/hfs_format.h>
+
+ #include "hfs_endian.h"
+diff --git a/newfs_hfs.tproj/hfs_endian.h b/newfs_hfs.tproj/hfs_endian.h
+index 8d9d01d..5c7ff57 100644
+--- a/newfs_hfs.tproj/hfs_endian.h
++++ b/newfs_hfs.tproj/hfs_endian.h
+@@ -29,7 +29,12 @@
+ * volume format.
+ */
+ #include <hfs/hfs_format.h>
++#if LINUX
++#include <endian.h>
++#include <byteswap.h>
++#else
+ #include <architecture/byte_order.h>
++#endif
+
+ /*********************/
+ /* BIG ENDIAN Macros */
+diff --git a/newfs_hfs.tproj/makehfs.c b/newfs_hfs.tproj/makehfs.c
+index 085222f..7609779 100644
+--- a/newfs_hfs.tproj/makehfs.c
++++ b/newfs_hfs.tproj/makehfs.c
+@@ -31,10 +31,16 @@
+ #include <sys/param.h>
+ #include <sys/types.h>
+ #include <sys/time.h>
++#if LINUX
++#include <time.h>
++#include "missing.h"
++#endif
+ #include <sys/errno.h>
+ #include <sys/stat.h>
+ #include <sys/sysctl.h>
++#if !LINUX
+ #include <sys/vmmeter.h>
++#endif
+
+ #include <err.h>
+ #include <errno.h>
+@@ -47,13 +53,14 @@
+
+ #include <openssl/sha.h>
+
++#if !LINUX
+ #include <architecture/byte_order.h>
+
+ #include <CoreFoundation/CFString.h>
+ #include <CoreFoundation/CFStringEncodingExt.h>
+
+ extern Boolean _CFStringGetFileSystemRepresentation(CFStringRef string, UInt8 *buffer, CFIndex maxBufLen);
+-
++#endif
+
+ #include <hfs/hfs_format.h>
+ #include <hfs/hfs_mount.h>
+@@ -129,7 +136,9 @@ static UInt32 Largest __P((UInt32 a, UInt32 b, UInt32 c, UInt32 d ));
+ static void MarkBitInAllocationBuffer __P((HFSPlusVolumeHeader *header,
+ UInt32 allocationBlock, void* sectorBuffer, UInt32 *sector));
+
++#if !LINUX
+ static UInt32 GetDefaultEncoding();
++#endif
+
+ static UInt32 UTCToLocal __P((UInt32 utcTime));
+
+@@ -158,11 +167,14 @@ void SETOFFSET (void *buffer, UInt16 btNodeSize, SInt16 recOffset, SInt16 vecOff
+
+ #define ROUNDUP(x, u) (((x) % (u) == 0) ? (x) : ((x)/(u) + 1) * (u))
+
+-#define ENCODING_TO_BIT(e) \
++#if LINUX
++#define ENCODING_TO_BIT(e) (e)
++#else
++#define ENCODING_TO_BIT(e)
+ ((e) < 48 ? (e) : \
+ ((e) == kCFStringEncodingMacUkrainian ? 48 : \
+ ((e) == kCFStringEncodingMacFarsi ? 49 : 0)))
+-
++#endif
+ /*
+ * make_hfs
+ *
+@@ -528,6 +540,7 @@ InitMDB(hfsparams_t *defaults, UInt32 driveBlocks, HFS_MDB *mdbp)
+ * Map UTF-8 input into a Mac encoding.
+ * On conversion errors "untitled" is used as a fallback.
+ */
++#if !LINUX
+ {
+ UniChar unibuf[kHFSMaxVolumeNameChars];
+ CFStringRef cfstr;
+@@ -553,7 +566,11 @@ InitMDB(hfsparams_t *defaults, UInt32 driveBlocks, HFS_MDB *mdbp)
+ bcopy(&mdbp->drVN[1], defaults->volumeName, mdbp->drVN[0]);
+ defaults->volumeName[mdbp->drVN[0]] = '\0';
+ }
++#endif
+ /* Save the encoding hint in the Finder Info (field 4). */
++ mdbp->drVN[0] = strlen(defaults->volumeName);
++ bcopy(defaults->volumeName,&mdbp->drVN[1],mdbp->drVN[0]);
++
+ mdbp->drFndrInfo[4] = SET_HFS_TEXT_ENCODING(defaults->encodingHint);
+
+ mdbp->drWrCnt = kWriteSeqNum;
+@@ -1100,9 +1117,11 @@ InitCatalogRoot_HFSPlus(const hfsparams_t *dp, const HFSPlusVolumeHeader *header
+ UInt16 nodeSize;
+ SInt16 offset;
+ UInt32 unicodeBytes;
++#if !LINUX
+ UInt8 canonicalName[256];
+ CFStringRef cfstr;
+ Boolean cfOK;
++#endif
+ int index = 0;
+
+ nodeSize = dp->catalogNodeSize;
+@@ -1122,7 +1141,9 @@ InitCatalogRoot_HFSPlus(const hfsparams_t *dp, const HFSPlusVolumeHeader *header
+ * First record is always the root directory...
+ */
+ ckp = (HFSPlusCatalogKey *)((UInt8 *)buffer + offset);
+-
++#if LINUX
++ ConvertUTF8toUnicode(dp->volumeName, sizeof(ckp->nodeName.unicode), ckp->nodeName.unicode, &ckp->nodeName.length);
++#else
+ /* Use CFString functions to get a HFSPlus Canonical name */
+ cfstr = CFStringCreateWithCString(kCFAllocatorDefault, (char *)dp->volumeName, kCFStringEncodingUTF8);
+ cfOK = _CFStringGetFileSystemRepresentation(cfstr, canonicalName, sizeof(canonicalName));
+@@ -1139,6 +1160,7 @@ InitCatalogRoot_HFSPlus(const hfsparams_t *dp, const HFSPlusVolumeHeader *header
+ dp->volumeName, kDefaultVolumeNameStr);
+ }
+ CFRelease(cfstr);
++#endif
+ ckp->nodeName.length = SWAP_BE16 (ckp->nodeName.length);
+
+ unicodeBytes = sizeof(UniChar) * SWAP_BE16 (ckp->nodeName.length);
+@@ -1821,15 +1843,15 @@ WriteBuffer(const DriveInfo *driveInfo, UInt64 startingSector, UInt32 byteCount,
+ off_t sector;
+
+ if ((byteCount % driveInfo->sectorSize) != 0)
+- errx(1, "WriteBuffer: byte count %ld is not sector size multiple", byteCount);
++ errx(1, "WriteBuffer: byte count %i is not sector size multiple", byteCount);
+
+ sector = driveInfo->sectorOffset + startingSector;
+
+ if (lseek(driveInfo->fd, sector * driveInfo->sectorSize, SEEK_SET) < 0)
+- err(1, "seek (sector %qd)", sector);
++ err(1, "seek (sector %lld)", sector);
+
+ if (write(driveInfo->fd, buffer, byteCount) != byteCount)
+- err(1, "write (sector %qd, %ld bytes)", sector, byteCount);
++ err(1, "write (sector %lld, %i bytes)", sector, byteCount);
+ }
+
+
+@@ -1913,7 +1935,7 @@ DivideAndRoundUp(UInt32 numerator, UInt32 denominator)
+ return quotient;
+ }
+
+-
++#if !LINUX
+ #define __kCFUserEncodingFileName ("/.CFUserTextEncoding")
+
+ static UInt32
+@@ -1939,7 +1961,7 @@ GetDefaultEncoding()
+ }
+ return 0;
+ }
+-
++#endif
+
+ static int
+ ConvertUTF8toUnicode(const UInt8* source, UInt32 bufsize, UniChar* unibuf,
+@@ -2006,6 +2028,9 @@ ConvertUTF8toUnicode(const UInt8* source, UInt32 bufsize, UniChar* unibuf,
+ static int
+ getencodinghint(unsigned char *name)
+ {
++#if LINUX
++ return(0);
++#else
+ int mib[3];
+ size_t buflen = sizeof(int);
+ struct vfsconf vfc;
+@@ -2023,7 +2048,8 @@ getencodinghint(unsigned char *name)
+ return (hint);
+ error:
+ hint = GetDefaultEncoding();
+- return (hint);
++ return (0);
++#endif
+ }
+
+
+@@ -2034,12 +2060,14 @@ void GenerateVolumeUUID(VolumeUUID *newVolumeID) {
+ unsigned char digest[20];
+ time_t now;
+ clock_t uptime;
+- int mib[2];
+- int sysdata;
+- char sysctlstring[128];
+ size_t datalen;
+ double sysloadavg[3];
++#if !LINUX
++ int sysdata;
++ int mib[2];
++ char sysctlstring[128];
+ struct vmtotal sysvmtotal;
++#endif
+
+ do {
+ /* Initialize the SHA-1 context for processing: */
+@@ -2052,52 +2080,58 @@ void GenerateVolumeUUID(VolumeUUID *newVolumeID) {
+ SHA1_Update(&context, &uptime, sizeof(uptime));
+
+ /* The kernel's boot time: */
++#if !LINUX
+ mib[0] = CTL_KERN;
+ mib[1] = KERN_BOOTTIME;
+ datalen = sizeof(sysdata);
+ sysctl(mib, 2, &sysdata, &datalen, NULL, 0);
+ SHA1_Update(&context, &sysdata, datalen);
+-
++#endif
+ /* The system's host id: */
++#if !LINUX
+ mib[0] = CTL_KERN;
+ mib[1] = KERN_HOSTID;
+ datalen = sizeof(sysdata);
+ sysctl(mib, 2, &sysdata, &datalen, NULL, 0);
+ SHA1_Update(&context, &sysdata, datalen);
+-
++#endif
+ /* The system's host name: */
++#if !LINUX
+ mib[0] = CTL_KERN;
+ mib[1] = KERN_HOSTNAME;
+ datalen = sizeof(sysctlstring);
+ sysctl(mib, 2, sysctlstring, &datalen, NULL, 0);
+ SHA1_Update(&context, sysctlstring, datalen);
+-
++#endif
+ /* The running kernel's OS release string: */
++#if !LINUX
+ mib[0] = CTL_KERN;
+ mib[1] = KERN_OSRELEASE;
+ datalen = sizeof(sysctlstring);
+ sysctl(mib, 2, sysctlstring, &datalen, NULL, 0);
+ SHA1_Update(&context, sysctlstring, datalen);
+-
++#endif
+ /* The running kernel's version string: */
++#if !LINUX
+ mib[0] = CTL_KERN;
+ mib[1] = KERN_VERSION;
+ datalen = sizeof(sysctlstring);
+ sysctl(mib, 2, sysctlstring, &datalen, NULL, 0);
+ SHA1_Update(&context, sysctlstring, datalen);
+-
++#endif
+ /* The system's load average: */
+ datalen = sizeof(sysloadavg);
+ getloadavg(sysloadavg, 3);
+ SHA1_Update(&context, &sysloadavg, datalen);
+
+ /* The system's VM statistics: */
++#if !LINUX
+ mib[0] = CTL_VM;
+ mib[1] = VM_METER;
+ datalen = sizeof(sysvmtotal);
+ sysctl(mib, 2, &sysvmtotal, &datalen, NULL, 0);
+ SHA1_Update(&context, &sysvmtotal, datalen);
+-
++#endif
+ /* The current GMT (26 ASCII characters): */
+ time(&now);
+ strncpy(randomInputBuffer, asctime(gmtime(&now)), 26); /* "Mon Mar 27 13:46:26 2000" */
+diff --git a/newfs_hfs.tproj/newfs_hfs.c b/newfs_hfs.tproj/newfs_hfs.c
+index c4176a9..bf2ed21 100644
+--- a/newfs_hfs.tproj/newfs_hfs.c
++++ b/newfs_hfs.tproj/newfs_hfs.c
+@@ -38,8 +38,13 @@
+ #include <sys/mount.h>
+ #include <sys/param.h>
+ #include <sys/stat.h>
++#if LINUX
++#include <time.h>
++#endif
+
++#if !LINUX
+ #include <IOKit/storage/IOMediaBSDClient.h>
++#endif
+
+ #include <hfs/hfs_format.h>
+ #include "newfs_hfs.h"
+@@ -73,7 +78,9 @@ static void usage __P((void));
+
+ char *progname;
+ char gVolumeName[kHFSPlusMaxFileNameChars + 1] = {kDefaultVolumeNameStr};
++#if !LINUX
+ char rawdevice[MAXPATHLEN];
++#endif
+ char blkdevice[MAXPATHLEN];
+ UInt32 gBlockSize = 0;
+ UInt32 gNextCNID = kHFSFirstUserCatalogNodeID;
+@@ -158,8 +165,10 @@ main(argc, argv)
+ extern int optind;
+ int ch;
+ int forceHFS;
++#if !LINUX
+ char *cp, *special;
+ struct statfs *mp;
++#endif
+ int n;
+
+ if ((progname = strrchr(*argv, '/')))
+@@ -260,16 +269,19 @@ main(argc, argv)
+ usage();
+ }
+
+- argc -= optind;
+- argv += optind;
++ argc -= optind;
++ argv += optind;
+
+- if (gPartitionSize != 0) {
+- if (argc != 0)
+- usage();
+- } else {
+- if (argc != 1)
+- usage();
++ if (gPartitionSize != 0) {
++ if (argc != 0)
++ usage();
++ } else {
++ if (argc != 1)
++ usage();
+
++#if LINUX
++ (void) sprintf(blkdevice, "%s", argv[0]);
++#else
+ special = argv[0];
+ cp = strrchr(special, '/');
+ if (cp != 0)
+@@ -278,6 +290,7 @@ main(argc, argv)
+ special++;
+ (void) sprintf(rawdevice, "%sr%s", _PATH_DEV, special);
+ (void) sprintf(blkdevice, "%s%s", _PATH_DEV, special);
++#endif
+ }
+
+ if (forceHFS && gJournaled) {
+@@ -301,6 +314,9 @@ main(argc, argv)
+ /*
+ * Check if target device is aready mounted
+ */
++#if LINUX
++ // FIXME
++#else
+ n = getmntinfo(&mp, MNT_NOWAIT);
+ if (n == 0)
+ fatal("%s: getmntinfo: %s", blkdevice, strerror(errno));
+@@ -310,15 +326,20 @@ main(argc, argv)
+ fatal("%s is mounted on %s", blkdevice, mp->f_mntonname);
+ ++mp;
+ }
++#endif
+ }
+
+- if (hfs_newfs(rawdevice, forceHFS, true) < 0) {
++ if (hfs_newfs(blkdevice, forceHFS, true) < 0) {
++#if LINUX
++ err(1, NULL);
++#else
+ /* On ENXIO error use the block device (to get de-blocking) */
+ if (errno == ENXIO) {
+ if (hfs_newfs(blkdevice, forceHFS, false) < 0)
+ err(1, NULL);
+ } else
+ err(1, NULL);
++#endif
+ }
+
+ exit(0);
+@@ -506,7 +527,9 @@ hfs_newfs(char *device, int forceHFS, int isRaw)
+ int fso = 0;
+ int retval = 0;
+ hfsparams_t defaults = {0};
++#if !LINUX
+ u_int64_t maxSectorsPerIO;
++#endif
+
+ if (gPartitionSize) {
+ dip.sectorSize = kBytesPerSector;
+@@ -526,6 +549,34 @@ hfs_newfs(char *device, int forceHFS, int isRaw)
+
+ if (fstat( fso, &stbuf) < 0)
+ fatal("%s: %s", device, strerror(errno));
++#if LINUX
++ dip.sectorSize = 512;
++ dip.sectorsPerIO = 256;
++
++# ifndef BLKGETSIZE
++# define BLKGETSIZE _IO(0x12,96)
++# endif
++
++# ifndef BLKGETSIZE64
++# define BLKGETSIZE64 _IOR(0x12,114,size_t)
++# endif
++
++ if (S_ISREG(stbuf.st_mode)) {
++ dip.totalSectors = stbuf.st_size / 512;
++ }
++ else if (S_ISBLK(stbuf.st_mode)) {
++ unsigned long size;
++ u_int64_t size64;
++ if (!ioctl(fso, BLKGETSIZE64, &size64))
++ dip.totalSectors = size64 / 512;
++ else if (!ioctl(fso, BLKGETSIZE, &size))
++ dip.totalSectors = size;
++ else
++ fatal("%s: %s", device, strerror(errno));
++ }
++ else
++ fatal("%s: is not a block device", device);
++#else
+
+ if (ioctl(fso, DKIOCGETBLOCKCOUNT, &dip.totalSectors) < 0)
+ fatal("%s: %s", device, strerror(errno));
+@@ -537,11 +588,14 @@ hfs_newfs(char *device, int forceHFS, int isRaw)
+ dip.sectorsPerIO = (128 * 1024) / dip.sectorSize; /* use 128K as default */
+ else
+ dip.sectorsPerIO = MIN(maxSectorsPerIO, (1024 * 1024) / dip.sectorSize);
++#endif
++
+ /*
+ * The make_hfs code currentlydoes 512 byte sized I/O.
+ * If the sector size is bigger than 512, start over
+ * using the block device (to get de-blocking).
+ */
++#if !LINUX
+ if (dip.sectorSize != kBytesPerSector) {
+ if (isRaw) {
+ close(fso);
+@@ -556,7 +610,9 @@ hfs_newfs(char *device, int forceHFS, int isRaw)
+ dip.sectorSize = kBytesPerSector;
+ }
+ }
++#endif
+ }
++
+ dip.sectorOffset = 0;
+ time(&createtime);
+
+diff --git a/newfs_hfs.tproj/newfs_hfs.h b/newfs_hfs.tproj/newfs_hfs.h
+index 968ff10..5680a34 100644
+--- a/newfs_hfs.tproj/newfs_hfs.h
++++ b/newfs_hfs.tproj/newfs_hfs.h
+@@ -19,8 +19,12 @@
+ *
+ * @APPLE_LICENSE_HEADER_END@
+ */
+-
++
++#if LINUX
++#include "missing.h"
++#else
+ #include <CoreFoundation/CFBase.h>
++#endif
+
+ /*
+ * Mac OS Finder flags
+@@ -122,33 +126,33 @@ enum {
+ #define kDTDF_FileID 16
+ #define kDTDF_Name "Desktop DF"
+ #define kDTDF_Chars 10
+-#define kDTDF_Type 'DTFL'
+-#define kDTDF_Creator 'DMGR'
++#define kDTDF_Type 0x4454464C /* 'DTFL' */
++#define kDTDF_Creator 0x444D4752 /* 'DMGR' */
+
+ #define kDTDB_FileID 17
+ #define kDTDB_Name "Desktop DB"
+ #define kDTDB_Chars 10
+-#define kDTDB_Type 'BTFL'
+-#define kDTDB_Creator 'DMGR'
++#define kDTDB_Type 0x4254464C /* 'BTFL' */
++#define kDTDB_Creator 0x444D4752 /* 'DMGR' */
+ #define kDTDB_Size 1024
+
+ #define kReadMe_FileID 18
+ #define kReadMe_Name "ReadMe"
+ #define kReadMe_Chars 6
+-#define kReadMe_Type 'ttro'
+-#define kReadMe_Creator 'ttxt'
++#define kReadMe_Type 0x7474726F /* 'ttro' */
++#define kReadMe_Creator 0x74747974 /* 'ttxt' */
+
+ #define kFinder_FileID 19
+ #define kFinder_Name "Finder"
+ #define kFinder_Chars 6
+-#define kFinder_Type 'FNDR'
+-#define kFinder_Creator 'MACS'
++#define kFinder_Type 0x464E4452 /* 'FNDR' */
++#define kFinder_Creator 0x4D414353 /* 'MACS' */
+
+ #define kSystem_FileID 20
+ #define kSystem_Name "System"
+ #define kSystem_Chars 6
+-#define kSystem_Type 'zsys'
+-#define kSystem_Creator 'MACS'
++#define kSystem_Type 0x7A737973 /* 'zsys' */
++#define kSystem_Creator 0x4D414353 /* 'MACS' */
+
+
+