lede-packages-rs

git clone git://archive.git.mtrnord.blog/MTRNord/lede-packages-rs.git
Log | Files | Refs | README | LICENSE

0002-Add-exclude-Darwin-specific-code.patch (36824B)


      1 From: =?UTF-8?q?Rog=C3=A9rio=20Brito?= <rbrito@ime.usp.br>
      2 Date: Thu, 24 Oct 2013 01:11:21 -0200
      3 Subject: Add/exclude Darwin-specific code
      4 
      5 Modify some of the files so that they can be compiled without the
      6 Apple owned frameworks in a Debian system (and possibly others).
      7 ---
      8  fsck_hfs.tproj/cache.c              |   4 ++
      9  fsck_hfs.tproj/dfalib/BTree.c       |   2 +
     10  fsck_hfs.tproj/dfalib/BlockCache.c  |   3 +
     11  fsck_hfs.tproj/dfalib/SBTree.c      |   2 +
     12  fsck_hfs.tproj/dfalib/SDevice.c     |  92 ++++++++++++++++++++---------
     13  fsck_hfs.tproj/dfalib/SKeyCompare.c |   2 +
     14  fsck_hfs.tproj/dfalib/SRepair.c     |   2 +
     15  fsck_hfs.tproj/dfalib/SRuntime.h    |   7 ++-
     16  fsck_hfs.tproj/dfalib/SUtils.c      |   5 +-
     17  fsck_hfs.tproj/dfalib/SVerify2.c    |   7 +++
     18  fsck_hfs.tproj/dfalib/Scavenger.h   |  11 +++-
     19  fsck_hfs.tproj/dfalib/hfs_endian.c  |   4 ++
     20  fsck_hfs.tproj/dfalib/hfs_endian.h  |   7 ++-
     21  fsck_hfs.tproj/fsck_hfs.c           |  61 +++++++++++++++----
     22  fsck_hfs.tproj/utilities.c          |   8 ++-
     23  include/missing.h                   | 115 ++++++++++++++++++++++++++++++++++++
     24  newfs_hfs.tproj/hfs_endian.c        |   5 ++
     25  newfs_hfs.tproj/hfs_endian.h        |   5 ++
     26  newfs_hfs.tproj/makehfs.c           |  72 ++++++++++++++++------
     27  newfs_hfs.tproj/newfs_hfs.c         |  74 ++++++++++++++++++++---
     28  newfs_hfs.tproj/newfs_hfs.h         |  26 ++++----
     29  21 files changed, 429 insertions(+), 85 deletions(-)
     30  create mode 100644 include/missing.h
     31 
     32 diff --git a/fsck_hfs.tproj/cache.c b/fsck_hfs.tproj/cache.c
     33 index be46195..527088a 100644
     34 --- a/fsck_hfs.tproj/cache.c
     35 +++ b/fsck_hfs.tproj/cache.c
     36 @@ -26,7 +26,11 @@
     37  #include <stdlib.h>
     38  #include <sys/mman.h>
     39  #include <sys/stat.h>
     40 +#if LINUX
     41 +#include "missing.h"
     42 +#else
     43  #include <sys/types.h>
     44 +#endif /* __LINUX__ */
     45  #include <sys/uio.h>
     46  #include <unistd.h>
     47  #include <string.h>
     48 diff --git a/fsck_hfs.tproj/dfalib/BTree.c b/fsck_hfs.tproj/dfalib/BTree.c
     49 index edd8301..7ad9fe0 100644
     50 --- a/fsck_hfs.tproj/dfalib/BTree.c
     51 +++ b/fsck_hfs.tproj/dfalib/BTree.c
     52 @@ -1705,7 +1705,9 @@ OSStatus	BTGetInformation	(SFCB					*filePtr,
     53  								 UInt16					 version,
     54  								 BTreeInfoRec			*info )
     55  {
     56 +#if !LINUX
     57  #pragma unused (version)
     58 +#endif
     59  
     60  	BTreeControlBlockPtr	btreePtr;
     61  
     62 diff --git a/fsck_hfs.tproj/dfalib/BlockCache.c b/fsck_hfs.tproj/dfalib/BlockCache.c
     63 index 1bb952f..e3a28a2 100644
     64 --- a/fsck_hfs.tproj/dfalib/BlockCache.c
     65 +++ b/fsck_hfs.tproj/dfalib/BlockCache.c
     66 @@ -20,6 +20,9 @@
     67   * @APPLE_LICENSE_HEADER_END@
     68   */
     69  
     70 +#if LINUX
     71 +#include "missing.h"
     72 +#endif
     73  #include "SRuntime.h"
     74  #include "Scavenger.h"
     75  #include "../cache.h"
     76 diff --git a/fsck_hfs.tproj/dfalib/SBTree.c b/fsck_hfs.tproj/dfalib/SBTree.c
     77 index 2fbcd1d..cd81b13 100644
     78 --- a/fsck_hfs.tproj/dfalib/SBTree.c
     79 +++ b/fsck_hfs.tproj/dfalib/SBTree.c
     80 @@ -322,7 +322,9 @@ ErrorExit:
     81  OSStatus
     82  SetEndOfForkProc ( SFCB *filePtr, FSSize minEOF, FSSize maxEOF )
     83  {
     84 +#if !LINUX
     85  #pragma unused (maxEOF)
     86 +#endif
     87  
     88  	OSStatus	result;
     89  	UInt32		actualSectorsAdded;
     90 diff --git a/fsck_hfs.tproj/dfalib/SDevice.c b/fsck_hfs.tproj/dfalib/SDevice.c
     91 index bf6f61c..9a46023 100644
     92 --- a/fsck_hfs.tproj/dfalib/SDevice.c
     93 +++ b/fsck_hfs.tproj/dfalib/SDevice.c
     94 @@ -2,7 +2,7 @@
     95   * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
     96   *
     97   * @APPLE_LICENSE_HEADER_START@
     98 - * 
     99 + *
    100   * "Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
    101   * Reserved.  This file contains Original Code and/or Modifications of
    102   * Original Code as defined in and that are subject to the Apple Public
    103 @@ -10,7 +10,7 @@
    104   * except in compliance with the License.  Please obtain a copy of the
    105   * License at http://www.apple.com/publicsource and read it before using
    106   * this file.
    107 - * 
    108 + *
    109   * The Original Code and all software distributed under the License are
    110   * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
    111   * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
    112 @@ -18,7 +18,7 @@
    113   * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
    114   * License for the specific language governing rights and limitations
    115   * under the License."
    116 - * 
    117 + *
    118   * @APPLE_LICENSE_HEADER_END@
    119   */
    120  #include "SRuntime.h"
    121 @@ -28,33 +28,71 @@
    122  #include <unistd.h>
    123  #include <errno.h>
    124  #include <sys/ioctl.h>
    125 -
    126 +#if LINUX
    127 +#include <fcntl.h>
    128 +#include <sys/stat.h>
    129 +#else
    130  #include <IOKit/storage/IOMediaBSDClient.h>
    131 -
    132 +#endif /* LINUX */
    133  #else
    134 -
    135  #include <Files.h>
    136  #include <Device.h>
    137  #include <Disks.h>
    138  
    139  #endif
    140  
    141 -
    142  OSErr GetDeviceSize(int driveRefNum, UInt64 *numBlocks, UInt32 *blockSize)
    143  {
    144  #if BSD
    145  	UInt64 devBlockCount = 0;
    146  	int devBlockSize = 0;
    147 +#if LINUX
    148 +	struct stat stbuf;
    149 +
    150 +	devBlockSize = 512;
    151  
    152 +#ifndef BLKGETSIZE
    153 +#define BLKGETSIZE              _IO(0x12,96)
    154 +#endif
    155 +#ifndef BLKGETSIZE64
    156 +#define BLKGETSIZE64            _IOR(0x12,114,size_t)
    157 +#endif
    158 +	if (fstat(driveRefNum, &stbuf) < 0){
    159 +		printf("Error: %s\n", strerror(errno));
    160 +		return(-1);
    161 +	}
    162 +
    163 +        if (S_ISREG(stbuf.st_mode)) {
    164 +                devBlockCount = stbuf.st_size / 512;
    165 +        }
    166 +        else if (S_ISBLK(stbuf.st_mode)) {
    167 +                unsigned long size;
    168 +                u_int64_t size64;
    169 +                if (!ioctl(driveRefNum, BLKGETSIZE64, &size64))
    170 +                        devBlockCount = size64 / 512;
    171 +                else if (!ioctl(driveRefNum, BLKGETSIZE, &size))
    172 +                        devBlockCount = size;
    173 +                else{
    174 +                        printf("Error: %s\n", strerror(errno));
    175 +			return(-1);
    176 +		}
    177 +
    178 +        }
    179 +        else{
    180 +                printf("Device is not a block device");
    181 +		return(-1);
    182 +	}
    183 +#elif BSD
    184  	if (ioctl(driveRefNum, DKIOCGETBLOCKCOUNT, &devBlockCount) < 0) {
    185  		printf("ioctl(DKIOCGETBLOCKCOUNT) for fd %d: %s\n", driveRefNum, strerror(errno));
    186  		return (-1);
    187  	}
    188 -	
    189 +
    190  	if (ioctl(driveRefNum, DKIOCGETBLOCKSIZE, &devBlockSize) < 0) {
    191  		printf("ioctl(DKIOCGETBLOCKSIZE) for fd %d: %s\n", driveRefNum, strerror(errno));
    192  		return (-1);
    193  	}
    194 +#endif /* BSD */
    195  
    196  	if (devBlockSize != 512) {
    197  		*numBlocks = (devBlockCount * (UInt64)devBlockSize) / 512;
    198 @@ -70,24 +108,24 @@ OSErr GetDeviceSize(int driveRefNum, UInt64 *numBlocks, UInt32 *blockSize)
    199  	{
    200  		/* return format list status code */
    201  		kFmtLstCode = 6,
    202 -		
    203 +
    204  		/* reference number of .SONY driver */
    205  		kSonyRefNum = 0xfffb,
    206 -		
    207 +
    208  		/* values returned by DriveStatus in DrvSts.twoSideFmt */
    209  		kSingleSided = 0,
    210  		kDoubleSided = -1,
    211  		kSingleSidedSize = 800,		/* 400K */
    212  		kDoubleSidedSize = 1600,	/* 800K */
    213 -		
    214 +
    215  		/* values in DrvQEl.qType */
    216  		kWordDrvSiz = 0,
    217  		kLongDrvSiz = 1,
    218 -		
    219 +
    220  		/* more than enough formatListRecords */
    221  		kMaxFormatListRecs = 16
    222  	};
    223 -	
    224 +
    225  	ParamBlockRec	pb;
    226  	FormatListRec	formatListRecords[kMaxFormatListRecs];
    227  	DrvSts			status;
    228 @@ -95,22 +133,22 @@ OSErr GetDeviceSize(int driveRefNum, UInt64 *numBlocks, UInt32 *blockSize)
    229  	OSErr			result;
    230  	unsigned long	blocks			= 0;
    231  
    232 -	
    233 +
    234  	/* Attempt to get the drive's format list. */
    235  	/* (see the Technical Note "What Your Sony Drives For You") */
    236 -	
    237 +
    238  	pb.cntrlParam.ioVRefNum = driveQElementPtr->dQDrive;
    239  	pb.cntrlParam.ioCRefNum = driveQElementPtr->dQRefNum;
    240  	pb.cntrlParam.csCode = kFmtLstCode;
    241  	pb.cntrlParam.csParam[0] = kMaxFormatListRecs;
    242  	*(long *)&pb.cntrlParam.csParam[1] = (long)&formatListRecords[0];
    243 -	
    244 +
    245  	result = PBStatusSync(&pb);
    246 -	
    247 +
    248  	if ( result == noErr )
    249  	{
    250  		/* The drive supports ReturnFormatList status call. */
    251 -		
    252 +
    253  		/* Get the current disk's size. */
    254  		for( formatListRecIndex = 0;
    255  			 formatListRecIndex < pb.cntrlParam.csParam[0];
    256 @@ -131,7 +169,7 @@ OSErr GetDeviceSize(int driveRefNum, UInt64 *numBlocks, UInt32 *blockSize)
    257  	else if ( driveQElementPtr->dQRefNum == (short)kSonyRefNum )
    258  	{
    259  		/* The drive is a non-SuperDrive floppy which only supports 400K and 800K disks */
    260 -		
    261 +
    262  		result = DriveStatus(driveQElementPtr->dQDrive, &status);
    263  		if ( result == noErr )
    264  		{
    265 @@ -140,11 +178,11 @@ OSErr GetDeviceSize(int driveRefNum, UInt64 *numBlocks, UInt32 *blockSize)
    266  				case kSingleSided:
    267  					blocks = kSingleSidedSize;
    268  					break;
    269 -					
    270 +
    271  				case kDoubleSided:
    272  					blocks = kDoubleSidedSize;
    273  					break;
    274 -					
    275 +
    276  				default:		//	This should never happen
    277  					result = paramErr;
    278  					break;
    279 @@ -155,20 +193,20 @@ OSErr GetDeviceSize(int driveRefNum, UInt64 *numBlocks, UInt32 *blockSize)
    280  	{
    281  		/* The drive is not a floppy and it doesn't support ReturnFormatList */
    282  		/* so use the dQDrvSz field(s) */
    283 -		
    284 +
    285  		result = noErr;	/* reset result */
    286 -		
    287 +
    288  		switch ( driveQElementPtr->qType )
    289  		{
    290  			case kWordDrvSiz:
    291  				blocks = driveQElementPtr->dQDrvSz;
    292  				break;
    293 -				
    294 +
    295  			case kLongDrvSiz:
    296  				blocks = ((unsigned long)driveQElementPtr->dQDrvSz2 << 16) +
    297  						 driveQElementPtr->dQDrvSz;
    298  				break;
    299 -				
    300 +
    301  			default:		//	This should never happen
    302  				result = paramErr;
    303  				break;
    304 @@ -177,7 +215,7 @@ OSErr GetDeviceSize(int driveRefNum, UInt64 *numBlocks, UInt32 *blockSize)
    305  
    306  	*numBlocks = blocks;
    307  	*blockSize = 512;
    308 -	
    309 +
    310  	return( result );
    311  #endif
    312  }
    313 @@ -188,7 +226,7 @@ OSErr DeviceRead(int device, int drive, void* buffer, SInt64 offset, UInt32 reqB
    314  #if BSD
    315  	off_t seek_off;
    316  	ssize_t	nbytes;
    317 -	
    318 +
    319  	*actBytes = 0;
    320  
    321  	seek_off = lseek(device, offset, SEEK_SET);
    322 diff --git a/fsck_hfs.tproj/dfalib/SKeyCompare.c b/fsck_hfs.tproj/dfalib/SKeyCompare.c
    323 index 46e145f..18d99c5 100644
    324 --- a/fsck_hfs.tproj/dfalib/SKeyCompare.c
    325 +++ b/fsck_hfs.tproj/dfalib/SKeyCompare.c
    326 @@ -454,7 +454,9 @@ SInt32 CompareExtentKeysPlus( const HFSPlusExtentKey *searchKey, const HFSPlusEx
    327   * The name portion of the key is compared using a 16-bit binary comparison. 
    328   * This is called from the b-tree code.
    329   */
    330 +#if !LINUX
    331  __private_extern__
    332 +#endif
    333  SInt32
    334  CompareAttributeKeys(const AttributeKey *searchKey, const AttributeKey *trialKey)
    335  {
    336 diff --git a/fsck_hfs.tproj/dfalib/SRepair.c b/fsck_hfs.tproj/dfalib/SRepair.c
    337 index 01c1a10..8eb759c 100644
    338 --- a/fsck_hfs.tproj/dfalib/SRepair.c
    339 +++ b/fsck_hfs.tproj/dfalib/SRepair.c
    340 @@ -1617,7 +1617,9 @@ Output:
    341  
    342  static	OSErr	FixWrapperExtents( SGlobPtr GPtr, RepairOrderPtr p )
    343  {
    344 +#if !LINUX
    345  #pragma unused (p)
    346 +#endif
    347  
    348  	OSErr						err;
    349  	HFSMasterDirectoryBlock		*mdb;
    350 diff --git a/fsck_hfs.tproj/dfalib/SRuntime.h b/fsck_hfs.tproj/dfalib/SRuntime.h
    351 index 646917b..770e3ef 100644
    352 --- a/fsck_hfs.tproj/dfalib/SRuntime.h
    353 +++ b/fsck_hfs.tproj/dfalib/SRuntime.h
    354 @@ -27,8 +27,11 @@
    355  #define __SRUNTIME__
    356  
    357  #if BSD
    358 -
    359 +#if LINUX
    360 +#include "missing.h"
    361 +#else
    362  #include <sys/types.h>
    363 +#endif
    364  #include <stdlib.h>
    365  #include <string.h>
    366  #include <stdio.h>
    367 @@ -91,10 +94,12 @@ typedef const unsigned char *	ConstStr255Param;
    368  
    369  typedef u_int32_t	HFSCatalogNodeID;
    370  
    371 +#if !LINUX
    372  enum {
    373  	false		= 0,
    374  	true		= 1
    375  };
    376 +#endif
    377  
    378  /* OS error codes */
    379  enum {
    380 diff --git a/fsck_hfs.tproj/dfalib/SUtils.c b/fsck_hfs.tproj/dfalib/SUtils.c
    381 index 72035f0..6e9253e 100644
    382 --- a/fsck_hfs.tproj/dfalib/SUtils.c
    383 +++ b/fsck_hfs.tproj/dfalib/SUtils.c
    384 @@ -380,7 +380,8 @@ void	InvalidateCalculatedVolumeBitMap( SGlobPtr GPtr )
    385  //				GPtr->realVCB			Real in-memory vcb
    386  //------------------------------------------------------------------------------
    387  
    388 -#if !BSD	
    389 +#if BSD
    390 +#if !LINUX
    391  OSErr GetVolumeFeatures( SGlobPtr GPtr )
    392  {
    393  	OSErr					err;
    394 @@ -418,7 +419,7 @@ OSErr GetVolumeFeatures( SGlobPtr GPtr )
    395  	return( noErr );
    396  }
    397  #endif
    398 -
    399 +#endif
    400  
    401  
    402  /*-------------------------------------------------------------------------------
    403 diff --git a/fsck_hfs.tproj/dfalib/SVerify2.c b/fsck_hfs.tproj/dfalib/SVerify2.c
    404 index 6a47935..c68f3d8 100644
    405 --- a/fsck_hfs.tproj/dfalib/SVerify2.c
    406 +++ b/fsck_hfs.tproj/dfalib/SVerify2.c
    407 @@ -32,7 +32,9 @@
    408  */
    409  
    410  #include <sys/ioctl.h>
    411 +#if !LINUX
    412  #include <sys/disk.h>
    413 +#endif
    414  
    415  #include "BTree.h"
    416  #include "BTreePrivate.h"
    417 @@ -1354,8 +1356,13 @@ OSErr CompareVolumeHeader( SGlobPtr GPtr, HFSPlusVolumeHeader *volumeHeader )
    418  	 * clump size for read-only media is irrelevant we skip the clump size 
    419  	 * check to avoid non useful warnings. 
    420  	 */
    421 +#if LINUX
    422 +	// FIXME
    423 +	isWriteable = 1;
    424 +#else
    425  	isWriteable = 0;
    426  	ioctl( GPtr->DrvNum, DKIOCISWRITABLE, &isWriteable );
    427 +#endif
    428  	if ( isWriteable != 0 && 
    429  		 volumeHeader->catalogFile.clumpSize != vcb->vcbCatalogFile->fcbClumpSize ) {
    430  		PrintError(GPtr, E_InvalidClumpSize, 0);
    431 diff --git a/fsck_hfs.tproj/dfalib/Scavenger.h b/fsck_hfs.tproj/dfalib/Scavenger.h
    432 index cf53970..edb3a80 100644
    433 --- a/fsck_hfs.tproj/dfalib/Scavenger.h
    434 +++ b/fsck_hfs.tproj/dfalib/Scavenger.h
    435 @@ -37,11 +37,16 @@
    436  #include "../fsck_debug.h"
    437  
    438  #include <assert.h>
    439 +#if LINUX
    440 +#define XATTR_MAXNAMELEN 127
    441 +#include <limits.h>
    442 +#else
    443  #include <sys/xattr.h>
    444  #include <sys/acl.h>
    445  #include <sys/kauth.h>
    446 -#include <sys/errno.h>
    447  #include <sys/syslimits.h>
    448 +#endif
    449 +#include <sys/errno.h>
    450  
    451  #ifdef __cplusplus
    452  extern	"C" {
    453 @@ -1465,4 +1470,8 @@ extern int 	AllocateContigBitmapBits (SVCB *vcb, UInt32 numBlocks, UInt32 *actua
    454  };
    455  #endif
    456  
    457 +/* #if LINUX
    458 +#undef XATTR_MAXNAMELEN
    459 +#endif */
    460 +
    461  #endif /* __SCAVENGER__ */
    462 diff --git a/fsck_hfs.tproj/dfalib/hfs_endian.c b/fsck_hfs.tproj/dfalib/hfs_endian.c
    463 index 7fa5385..69500c1 100755
    464 --- a/fsck_hfs.tproj/dfalib/hfs_endian.c
    465 +++ b/fsck_hfs.tproj/dfalib/hfs_endian.c
    466 @@ -31,7 +31,11 @@
    467  #include <sys/types.h>
    468  #include <sys/stat.h>
    469  
    470 +#if LINUX
    471 +#include "missing.h"
    472 +#else
    473  #include <architecture/byte_order.h>
    474 +#endif
    475  #include <hfs/hfs_format.h>
    476  
    477  #include "Scavenger.h"
    478 diff --git a/fsck_hfs.tproj/dfalib/hfs_endian.h b/fsck_hfs.tproj/dfalib/hfs_endian.h
    479 index 52d0c3a..0763d9d 100755
    480 --- a/fsck_hfs.tproj/dfalib/hfs_endian.h
    481 +++ b/fsck_hfs.tproj/dfalib/hfs_endian.h
    482 @@ -27,9 +27,14 @@
    483   *
    484   * This file prototypes endian swapping routines for the HFS/HFS Plus
    485   * volume format.
    486 - */
    487 +*/
    488  #include <hfs/hfs_format.h>
    489 +#if LINUX
    490 +#include <endian.h>
    491 +#include <byteswap.h>
    492 +#else
    493  #include <architecture/byte_order.h>
    494 +#endif
    495  #include "SRuntime.h"
    496  
    497  /*********************/
    498 diff --git a/fsck_hfs.tproj/fsck_hfs.c b/fsck_hfs.tproj/fsck_hfs.c
    499 index 90532fd..f1a18bd 100644
    500 --- a/fsck_hfs.tproj/fsck_hfs.c
    501 +++ b/fsck_hfs.tproj/fsck_hfs.c
    502 @@ -24,10 +24,14 @@
    503  #include <sys/types.h>
    504  #include <sys/stat.h>
    505  #include <sys/param.h>
    506 +#if !LINUX
    507  #include <sys/ucred.h>
    508 +#endif
    509  #include <sys/mount.h>
    510  #include <sys/ioctl.h>
    511 +#if !LINUX
    512  #include <sys/disk.h>
    513 +#endif
    514  
    515  #include <hfs/hfs_mount.h>
    516  
    517 @@ -195,8 +199,12 @@ main(argc, argv)
    518  	if (guiControl)
    519  		debug = 0; /* debugging is for command line only */
    520  
    521 +#if LINUX
    522 +// FIXME
    523 +#else
    524  	if (signal(SIGINT, SIG_IGN) != SIG_IGN)
    525  		(void)signal(SIGINT, catch);
    526 +#endif
    527  
    528  	if (argc < 1) {
    529  		(void) fprintf(stderr, "%s: missing special-device\n", progname);
    530 @@ -218,7 +226,9 @@ checkfilesys(char * filesys)
    531  	int chkLev, repLev, logLev;
    532  	int blockDevice_fd, canWrite;
    533  	char *unraw, *mntonname;
    534 +#if !LINUX
    535  	struct statfs *fsinfo;
    536 +#endif
    537  	int fs_fd=-1;  // fd to the root-dir of the fs we're checking (only w/lfag == 1)
    538  
    539  	flags = 0;
    540 @@ -227,7 +237,9 @@ checkfilesys(char * filesys)
    541  	canWrite = 0;
    542  	unraw = NULL;
    543  	mntonname = NULL;
    544 -
    545 +#if LINUX
    546 +	// FIXME
    547 +#else
    548  	if (lflag) {
    549  		result = getmntinfo(&fsinfo, MNT_NOWAIT);
    550  
    551 @@ -257,10 +269,10 @@ checkfilesys(char * filesys)
    552  		    }
    553  		}
    554  	}
    555 -
    556 +#endif
    557  	if (debug && preen)
    558  		pwarn("starting\n");
    559 -	
    560 +
    561  	if (setup( filesys, &blockDevice_fd, &canWrite ) == 0) {
    562  		if (preen)
    563  			pfatal("CAN'T CHECK FILE SYSTEM.");
    564 @@ -278,7 +290,7 @@ checkfilesys(char * filesys)
    565  	repLev = kMajorRepairs;
    566  	logLev = kVerboseLog;
    567  
    568 -	if (yflag)	
    569 +	if (yflag)
    570  		repLev = kMajorRepairs;
    571  
    572  	if (quick) {
    573 @@ -298,16 +310,16 @@ checkfilesys(char * filesys)
    574  
    575  	if (nflag)
    576  		repLev = kNeverRepair;
    577 -		
    578 +
    579  	if ( rebuildCatalogBtree ) {
    580  		chkLev = kPartialCheck;
    581  		repLev = kForceRepairs;  // this will force rebuild of catalog B-Tree file
    582  	}
    583 -		
    584 +
    585  	/*
    586  	 * go check HFS volume...
    587  	 */
    588 -	result = CheckHFS(	fsreadfd, fswritefd, chkLev, repLev, logLev, 
    589 +	result = CheckHFS(	fsreadfd, fswritefd, chkLev, repLev, logLev,
    590  						guiControl, lostAndFoundMode, canWrite, &fsmodified );
    591  	if (!hotroot) {
    592  		ckfini(1);
    593 @@ -330,6 +342,9 @@ checkfilesys(char * filesys)
    594  			}
    595  		}
    596  	} else {
    597 +#if LINUX
    598 +	// FIXME
    599 +#else
    600  		struct statfs stfs_buf;
    601  		/*
    602  		 * Check to see if root is mounted read-write.
    603 @@ -339,19 +354,25 @@ checkfilesys(char * filesys)
    604  		else
    605  			flags = 0;
    606  		ckfini(flags & MNT_RDONLY);
    607 +#endif
    608  	}
    609  
    610  	/* XXX free any allocated memory here */
    611  
    612  	if (hotroot && fsmodified) {
    613 +#if !LINUX
    614  		struct hfs_mount_args args;
    615 +#endif
    616  		/*
    617  		 * We modified the root.  Do a mount update on
    618  		 * it, unless it is read-write, so we can continue.
    619  		 */
    620  		if (!preen)
    621  			printf("\n***** FILE SYSTEM WAS MODIFIED *****\n");
    622 -		if (flags & MNT_RDONLY) {		
    623 +#if LINUX
    624 +		// FIXME
    625 +#else
    626 +		if (flags & MNT_RDONLY) {
    627  			bzero(&args, sizeof(args));
    628  			flags |= MNT_UPDATE | MNT_RELOAD;
    629  			if (mount("hfs", "/", flags, &args) == 0) {
    630 @@ -359,6 +380,7 @@ checkfilesys(char * filesys)
    631  				goto ExitThisRoutine;
    632  			}
    633  		}
    634 +#endif
    635  		if (!preen)
    636  			printf("\n***** REBOOT NOW *****\n");
    637  		sync();
    638 @@ -367,7 +389,7 @@ checkfilesys(char * filesys)
    639  	}
    640  
    641  	result = (result == 0) ? 0 : EEXIT;
    642 -	
    643 +
    644  ExitThisRoutine:
    645  	if (lflag) {
    646  	    fcntl(fs_fd, F_THAW_FS, NULL);
    647 @@ -401,16 +423,18 @@ setup( char *dev, int *blockDevice_fdPtr, int *canWritePtr )
    648  	fswritefd = -1;
    649  	*blockDevice_fdPtr = -1;
    650  	*canWritePtr = 0;
    651 -	
    652 +
    653  	if (stat(dev, &statb) < 0) {
    654  		printf("Can't stat %s: %s\n", dev, strerror(errno));
    655  		return (0);
    656  	}
    657 +#if !LINUX
    658  	if ((statb.st_mode & S_IFMT) != S_IFCHR) {
    659  		pfatal("%s is not a character device", dev);
    660  		if (reply("CONTINUE") == 0)
    661  			return (0);
    662  	}
    663 +#endif
    664  	if ((fsreadfd = open(dev, O_RDONLY)) < 0) {
    665  		printf("Can't open %s: %s\n", dev, strerror(errno));
    666  		return (0);
    667 @@ -419,7 +443,7 @@ setup( char *dev, int *blockDevice_fdPtr, int *canWritePtr )
    668  	/* attempt to get write access to the block device and if not check if volume is */
    669  	/* mounted read-only.  */
    670  	getWriteAccess( dev, blockDevice_fdPtr, canWritePtr );
    671 -	
    672 +
    673  	if (preen == 0 && !guiControl)
    674  		printf("** %s", dev);
    675  	if (nflag || (fswritefd = open(dev, O_WRONLY)) < 0) {
    676 @@ -433,10 +457,14 @@ setup( char *dev, int *blockDevice_fdPtr, int *canWritePtr )
    677  		printf("\n");
    678  
    679  	/* Get device block size to initialize cache */
    680 +#if LINUX
    681 +	devBlockSize = 512;
    682 +#else
    683  	if (ioctl(fsreadfd, DKIOCGETBLOCKSIZE, &devBlockSize) < 0) {
    684  		pfatal ("Can't get device block size\n");
    685  		return (0);
    686  	}
    687 +#endif
    688  
    689  	 /* calculate the cache block size and total blocks */
    690  	if (CalculateCacheSize(userCacheSize, &cacheBlockSize, &cacheTotalBlocks, debug) != 0) {
    691 @@ -463,11 +491,15 @@ setup( char *dev, int *blockDevice_fdPtr, int *canWritePtr )
    692  
    693  static void getWriteAccess( char *dev, int *blockDevice_fdPtr, int *canWritePtr )
    694  {
    695 +#if !LINUX
    696  	int					i;
    697  	int					myMountsCount;
    698 +#endif
    699  	void *				myPtr;
    700  	char *				myCharPtr;
    701 +#if !LINUX
    702  	struct statfs *		myBufPtr;
    703 +#endif
    704  	void *				myNamePtr;
    705  
    706  	myPtr = NULL;
    707 @@ -490,6 +522,9 @@ static void getWriteAccess( char *dev, int *blockDevice_fdPtr, int *canWritePtr
    708  	}
    709  	
    710  	// get count of mounts then get the info for each 
    711 +#if LINUX
    712 +	// FIXME
    713 +#else
    714  	myMountsCount = getfsstat( NULL, 0, MNT_NOWAIT );
    715  	if ( myMountsCount < 0 )
    716  		goto ExitThisRoutine;
    717 @@ -513,8 +548,8 @@ static void getWriteAccess( char *dev, int *blockDevice_fdPtr, int *canWritePtr
    718  		}
    719  		myBufPtr++;
    720  	}
    721 -	*canWritePtr = 1;  // single user will get us here, f_mntfromname is not /dev/diskXXXX 
    722 -	
    723 +#endif
    724 +	*canWritePtr = 1;  // single user will get us here, f_mntfromname is not /dev/diskXXXX
    725  ExitThisRoutine:
    726  	if ( myPtr != NULL )
    727  		free( myPtr );
    728 diff --git a/fsck_hfs.tproj/utilities.c b/fsck_hfs.tproj/utilities.c
    729 index ee41bef..8e1cd77 100644
    730 --- a/fsck_hfs.tproj/utilities.c
    731 +++ b/fsck_hfs.tproj/utilities.c
    732 @@ -183,12 +183,14 @@ retry:
    733  			printf("Can't stat %s\n", raw);
    734  			return (origname);
    735  		}
    736 +#if !LINUX
    737  		if ((stchar.st_mode & S_IFMT) == S_IFCHR) {
    738  			return (raw);
    739  		} else {
    740  			printf("%s is not a character device\n", raw);
    741  			return (origname);
    742  		}
    743 +#endif
    744  	} else if ((stblock.st_mode & S_IFMT) == S_IFCHR && !retried) {
    745  		newname = unrawname(newname);
    746  		retried++;
    747 @@ -214,7 +216,11 @@ rawname(char *name)
    748  	*dp = 0;
    749  	(void)strcpy(rawbuf, name);
    750  	*dp = '/';
    751 -	(void)strcat(rawbuf, "/r");
    752 +#if LINUX
    753 +	(void)strcat(rawbuf, "/");
    754 +#else
    755 +	(void)strcat(rawbuf,"/r");
    756 +#endif
    757  	(void)strcat(rawbuf, &dp[1]);
    758  
    759  	return (rawbuf);
    760 diff --git a/include/missing.h b/include/missing.h
    761 new file mode 100644
    762 index 0000000..0a859c4
    763 --- /dev/null
    764 +++ b/include/missing.h
    765 @@ -0,0 +1,114 @@
    766 +#ifndef _MISSING_H_
    767 +#define _MISSING_H_
    768 +
    769 +#include <endian.h>
    770 +#include <byteswap.h>
    771 +#include <errno.h>
    772 +#include <stdint.h>
    773 +#include <string.h>
    774 +
    775 +#define MAXBSIZE		(256 * 4096)
    776 +
    777 +#ifndef true
    778 +#define true			1
    779 +#endif
    780 +#ifndef false
    781 +#define false			0
    782 +#endif
    783 +
    784 +/* Mac types */
    785 +
    786 +/* 8 Bit */
    787 +#ifndef UInt8
    788 +#define UInt8			uint8_t
    789 +#endif
    790 +#ifndef u_int8_t
    791 +#define u_int8_t		UInt8
    792 +#endif
    793 +#ifndef SInt8
    794 +#define SInt8			int8_t
    795 +#endif
    796 +
    797 +/* 16 Bit */
    798 +#ifndef UInt16
    799 +#define UInt16			uint16_t
    800 +#endif
    801 +#ifndef u_int16_t
    802 +#define u_int16_t		UInt16
    803 +#endif
    804 +#ifndef SInt16
    805 +#define SInt16			int16_t
    806 +#endif
    807 +
    808 +/* 32 Bit */
    809 +#ifndef UInt32
    810 +#define UInt32			uint32_t
    811 +#endif
    812 +#ifndef u_int32_t
    813 +#define u_int32_t		UInt32
    814 +#endif
    815 +#ifndef SInt32
    816 +#define SInt32			int32_t
    817 +#endif
    818 +
    819 +/* 64 Bit */
    820 +#ifndef UInt64
    821 +#define UInt64			uint64_t
    822 +#endif
    823 +#ifndef u_int64_t
    824 +#define u_int64_t		UInt64
    825 +#endif
    826 +#ifndef SInt64
    827 +#define SInt64			int64_t
    828 +#endif
    829 +
    830 +#define UniChar			u_int16_t
    831 +#define Boolean			u_int8_t
    832 +
    833 +#define UF_NODUMP	0x00000001
    834 +
    835 +/* syslimits.h */
    836 +#define NAME_MAX	255
    837 +
    838 +/* Byteswap stuff */
    839 +#define NXSwapHostLongToBig(x)		cpu_to_be64(x)
    840 +#define NXSwapBigShortToHost(x) 	be16_to_cpu(x)
    841 +#define OSSwapBigToHostInt16(x)		be16_to_cpu(x)
    842 +#define NXSwapBigLongToHost(x)		be32_to_cpu(x)
    843 +#define OSSwapBigToHostInt32(x)		be32_to_cpu(x)
    844 +#define NXSwapBigLongLongToHost(x) 	be64_to_cpu(x)
    845 +#define OSSwapBigToHostInt64(x)		be64_to_cpu(x)
    846 +
    847 +#if __BYTE_ORDER == __LITTLE_ENDIAN
    848 +/* Big Endian Swaps */
    849 +#ifndef be16_to_cpu
    850 +#define be16_to_cpu(x) bswap_16(x)
    851 +#endif
    852 +#ifndef be32_to_cpu
    853 +#define be32_to_cpu(x) bswap_32(x)
    854 +#endif
    855 +#ifndef be64_to_cpu
    856 +#define be64_to_cpu(x) bswap_64(x)
    857 +#endif
    858 +#ifndef cpu_to_be64
    859 +#define cpu_to_be64(x) bswap_64(x)
    860 +#endif
    861 +#elif __BYTE_ORDER == __BIG_ENDIAN
    862 +/* Big endian doesn't swap */
    863 +#ifndef be16_to_cpu
    864 +#define be16_to_cpu(x)	(x)
    865 +#endif
    866 +#ifndef be32_to_cpu
    867 +#define be32_to_cpu(x)	(x)
    868 +#endif
    869 +#ifndef be64_to_cpu
    870 +#define be64_to_cpu(x)	(x)
    871 +#endif
    872 +#ifndef cpu_to_be64
    873 +#define cpu_to_be64(x) 	(x)
    874 +#endif
    875 +#endif
    876 +
    877 +#define KAUTH_FILESEC_XATTR "com.apple.system.Security"
    878 +
    879 +#endif
    880 diff --git a/newfs_hfs.tproj/hfs_endian.c b/newfs_hfs.tproj/hfs_endian.c
    881 index 117b7f8..fdf7353 100644
    882 --- a/newfs_hfs.tproj/hfs_endian.c
    883 +++ b/newfs_hfs.tproj/hfs_endian.c
    884 @@ -30,7 +30,12 @@
    885  #include <sys/types.h>
    886  #include <sys/stat.h>
    887  
    888 +#if LINUX
    889 +#include "missing.h"
    890 +#else
    891  #include <architecture/byte_order.h>
    892 +#endif
    893 +
    894  #include <hfs/hfs_format.h>
    895  
    896  #include "hfs_endian.h"
    897 diff --git a/newfs_hfs.tproj/hfs_endian.h b/newfs_hfs.tproj/hfs_endian.h
    898 index 8d9d01d..5c7ff57 100644
    899 --- a/newfs_hfs.tproj/hfs_endian.h
    900 +++ b/newfs_hfs.tproj/hfs_endian.h
    901 @@ -29,7 +29,12 @@
    902   * volume format.
    903   */
    904  #include <hfs/hfs_format.h>
    905 +#if LINUX
    906 +#include <endian.h>
    907 +#include <byteswap.h>
    908 +#else
    909  #include <architecture/byte_order.h>
    910 +#endif
    911  
    912  /*********************/
    913  /* BIG ENDIAN Macros */
    914 diff --git a/newfs_hfs.tproj/makehfs.c b/newfs_hfs.tproj/makehfs.c
    915 index 085222f..7609779 100644
    916 --- a/newfs_hfs.tproj/makehfs.c
    917 +++ b/newfs_hfs.tproj/makehfs.c
    918 @@ -31,10 +31,16 @@
    919  #include <sys/param.h>
    920  #include <sys/types.h>
    921  #include <sys/time.h>
    922 +#if LINUX
    923 +#include <time.h>
    924 +#include "missing.h"
    925 +#endif
    926  #include <sys/errno.h>
    927  #include <sys/stat.h>
    928  #include <sys/sysctl.h>
    929 +#if !LINUX
    930  #include <sys/vmmeter.h>
    931 +#endif
    932  
    933  #include <err.h>
    934  #include <errno.h>
    935 @@ -47,13 +53,14 @@
    936  
    937  #include <openssl/sha.h>
    938  
    939 +#if !LINUX
    940  #include <architecture/byte_order.h>
    941  
    942  #include <CoreFoundation/CFString.h>
    943  #include <CoreFoundation/CFStringEncodingExt.h>
    944  
    945  extern Boolean _CFStringGetFileSystemRepresentation(CFStringRef string, UInt8 *buffer, CFIndex maxBufLen);
    946 -
    947 +#endif
    948  
    949  #include <hfs/hfs_format.h>
    950  #include <hfs/hfs_mount.h>
    951 @@ -129,7 +136,9 @@ static UInt32 Largest __P((UInt32 a, UInt32 b, UInt32 c, UInt32 d ));
    952  static void MarkBitInAllocationBuffer __P((HFSPlusVolumeHeader *header,
    953  		UInt32 allocationBlock, void* sectorBuffer, UInt32 *sector));
    954  
    955 +#if !LINUX
    956  static UInt32 GetDefaultEncoding();
    957 +#endif
    958  
    959  static UInt32 UTCToLocal __P((UInt32 utcTime));
    960  
    961 @@ -158,11 +167,14 @@ void SETOFFSET (void *buffer, UInt16 btNodeSize, SInt16 recOffset, SInt16 vecOff
    962  
    963  #define ROUNDUP(x, u)	(((x) % (u) == 0) ? (x) : ((x)/(u) + 1) * (u))
    964  
    965 -#define ENCODING_TO_BIT(e)                               \
    966 +#if LINUX
    967 +#define ENCODING_TO_BIT(e)       (e)
    968 +#else
    969 +#define ENCODING_TO_BIT(e)
    970            ((e) < 48 ? (e) :                              \
    971            ((e) == kCFStringEncodingMacUkrainian ? 48 :   \
    972            ((e) == kCFStringEncodingMacFarsi ? 49 : 0)))
    973 -
    974 +#endif
    975  /*
    976   * make_hfs
    977   *	
    978 @@ -528,6 +540,7 @@ InitMDB(hfsparams_t *defaults, UInt32 driveBlocks, HFS_MDB *mdbp)
    979  	 * Map UTF-8 input into a Mac encoding.
    980  	 * On conversion errors "untitled" is used as a fallback.
    981  	 */
    982 +#if !LINUX
    983  	{
    984  		UniChar unibuf[kHFSMaxVolumeNameChars];
    985  		CFStringRef cfstr;
    986 @@ -553,7 +566,11 @@ InitMDB(hfsparams_t *defaults, UInt32 driveBlocks, HFS_MDB *mdbp)
    987  		bcopy(&mdbp->drVN[1], defaults->volumeName, mdbp->drVN[0]);
    988  		defaults->volumeName[mdbp->drVN[0]] = '\0';
    989  	}
    990 +#endif
    991  	/* Save the encoding hint in the Finder Info (field 4). */
    992 +	mdbp->drVN[0] = strlen(defaults->volumeName);
    993 +	bcopy(defaults->volumeName,&mdbp->drVN[1],mdbp->drVN[0]);
    994 +
    995  	mdbp->drFndrInfo[4] = SET_HFS_TEXT_ENCODING(defaults->encodingHint);
    996  
    997  	mdbp->drWrCnt = kWriteSeqNum;
    998 @@ -1100,9 +1117,11 @@ InitCatalogRoot_HFSPlus(const hfsparams_t *dp, const HFSPlusVolumeHeader *header
    999  	UInt16					nodeSize;
   1000  	SInt16					offset;
   1001  	UInt32					unicodeBytes;
   1002 +#if !LINUX
   1003  	UInt8 canonicalName[256];
   1004  	CFStringRef cfstr;
   1005  	Boolean	cfOK;
   1006 +#endif
   1007  	int index = 0;
   1008  
   1009  	nodeSize = dp->catalogNodeSize;
   1010 @@ -1122,7 +1141,9 @@ InitCatalogRoot_HFSPlus(const hfsparams_t *dp, const HFSPlusVolumeHeader *header
   1011  	 * First record is always the root directory...
   1012  	 */
   1013  	ckp = (HFSPlusCatalogKey *)((UInt8 *)buffer + offset);
   1014 -	
   1015 +#if LINUX
   1016 +	ConvertUTF8toUnicode(dp->volumeName, sizeof(ckp->nodeName.unicode), ckp->nodeName.unicode, &ckp->nodeName.length);
   1017 +#else
   1018  	/* Use CFString functions to get a HFSPlus Canonical name */
   1019  	cfstr = CFStringCreateWithCString(kCFAllocatorDefault, (char *)dp->volumeName, kCFStringEncodingUTF8);
   1020  	cfOK = _CFStringGetFileSystemRepresentation(cfstr, canonicalName, sizeof(canonicalName));
   1021 @@ -1139,6 +1160,7 @@ InitCatalogRoot_HFSPlus(const hfsparams_t *dp, const HFSPlusVolumeHeader *header
   1022  		      dp->volumeName, kDefaultVolumeNameStr);
   1023  	}
   1024  	CFRelease(cfstr);
   1025 +#endif
   1026  	ckp->nodeName.length = SWAP_BE16 (ckp->nodeName.length);
   1027  
   1028  	unicodeBytes = sizeof(UniChar) * SWAP_BE16 (ckp->nodeName.length);
   1029 @@ -1821,15 +1843,15 @@ WriteBuffer(const DriveInfo *driveInfo, UInt64 startingSector, UInt32 byteCount,
   1030  	off_t sector;
   1031  
   1032  	if ((byteCount % driveInfo->sectorSize) != 0)
   1033 -		errx(1, "WriteBuffer: byte count %ld is not sector size multiple", byteCount);
   1034 +		errx(1, "WriteBuffer: byte count %i is not sector size multiple", byteCount);
   1035  
   1036  	sector = driveInfo->sectorOffset + startingSector;
   1037  
   1038  	if (lseek(driveInfo->fd, sector * driveInfo->sectorSize, SEEK_SET) < 0)
   1039 -		err(1, "seek (sector %qd)", sector);
   1040 +		err(1, "seek (sector %lld)", sector);
   1041  
   1042  	if (write(driveInfo->fd, buffer, byteCount) != byteCount)
   1043 -		err(1, "write (sector %qd, %ld bytes)", sector, byteCount);
   1044 +		err(1, "write (sector %lld, %i bytes)", sector, byteCount);
   1045  }
   1046  
   1047  
   1048 @@ -1913,7 +1935,7 @@ DivideAndRoundUp(UInt32 numerator, UInt32 denominator)
   1049  	return quotient;
   1050  }
   1051  
   1052 -
   1053 +#if !LINUX
   1054  #define __kCFUserEncodingFileName ("/.CFUserTextEncoding")
   1055  
   1056  static UInt32
   1057 @@ -1939,7 +1961,7 @@ GetDefaultEncoding()
   1058      }
   1059      return 0;
   1060  }
   1061 -
   1062 +#endif
   1063  
   1064  static int
   1065  ConvertUTF8toUnicode(const UInt8* source, UInt32 bufsize, UniChar* unibuf,
   1066 @@ -2006,6 +2028,9 @@ ConvertUTF8toUnicode(const UInt8* source, UInt32 bufsize, UniChar* unibuf,
   1067  static int
   1068  getencodinghint(unsigned char *name)
   1069  {
   1070 +#if LINUX
   1071 +	return(0);
   1072 +#else
   1073          int mib[3];
   1074          size_t buflen = sizeof(int);
   1075          struct vfsconf vfc;
   1076 @@ -2023,7 +2048,8 @@ getencodinghint(unsigned char *name)
   1077  	return (hint);
   1078  error:
   1079  	hint = GetDefaultEncoding();
   1080 -	return (hint);
   1081 +	return (0);
   1082 +#endif
   1083  }
   1084  
   1085  
   1086 @@ -2034,12 +2060,14 @@ void GenerateVolumeUUID(VolumeUUID *newVolumeID) {
   1087  	unsigned char digest[20];
   1088  	time_t now;
   1089  	clock_t uptime;
   1090 -	int mib[2];
   1091 -	int sysdata;
   1092 -	char sysctlstring[128];
   1093  	size_t datalen;
   1094  	double sysloadavg[3];
   1095 +#if !LINUX
   1096 +	int sysdata;
   1097 +	int mib[2];
   1098 +	char sysctlstring[128];
   1099  	struct vmtotal sysvmtotal;
   1100 +#endif
   1101  	
   1102  	do {
   1103  		/* Initialize the SHA-1 context for processing: */
   1104 @@ -2052,52 +2080,58 @@ void GenerateVolumeUUID(VolumeUUID *newVolumeID) {
   1105  		SHA1_Update(&context, &uptime, sizeof(uptime));
   1106  		
   1107  		/* The kernel's boot time: */
   1108 +#if !LINUX
   1109  		mib[0] = CTL_KERN;
   1110  		mib[1] = KERN_BOOTTIME;
   1111  		datalen = sizeof(sysdata);
   1112  		sysctl(mib, 2, &sysdata, &datalen, NULL, 0);
   1113  		SHA1_Update(&context, &sysdata, datalen);
   1114 -		
   1115 +#endif
   1116  		/* The system's host id: */
   1117 +#if !LINUX
   1118  		mib[0] = CTL_KERN;
   1119  		mib[1] = KERN_HOSTID;
   1120  		datalen = sizeof(sysdata);
   1121  		sysctl(mib, 2, &sysdata, &datalen, NULL, 0);
   1122  		SHA1_Update(&context, &sysdata, datalen);
   1123 -
   1124 +#endif
   1125  		/* The system's host name: */
   1126 +#if !LINUX
   1127  		mib[0] = CTL_KERN;
   1128  		mib[1] = KERN_HOSTNAME;
   1129  		datalen = sizeof(sysctlstring);
   1130  		sysctl(mib, 2, sysctlstring, &datalen, NULL, 0);
   1131  		SHA1_Update(&context, sysctlstring, datalen);
   1132 -
   1133 +#endif
   1134  		/* The running kernel's OS release string: */
   1135 +#if !LINUX
   1136  		mib[0] = CTL_KERN;
   1137  		mib[1] = KERN_OSRELEASE;
   1138  		datalen = sizeof(sysctlstring);
   1139  		sysctl(mib, 2, sysctlstring, &datalen, NULL, 0);
   1140  		SHA1_Update(&context, sysctlstring, datalen);
   1141 -
   1142 +#endif
   1143  		/* The running kernel's version string: */
   1144 +#if !LINUX
   1145  		mib[0] = CTL_KERN;
   1146  		mib[1] = KERN_VERSION;
   1147  		datalen = sizeof(sysctlstring);
   1148  		sysctl(mib, 2, sysctlstring, &datalen, NULL, 0);
   1149  		SHA1_Update(&context, sysctlstring, datalen);
   1150 -
   1151 +#endif
   1152  		/* The system's load average: */
   1153  		datalen = sizeof(sysloadavg);
   1154  		getloadavg(sysloadavg, 3);
   1155  		SHA1_Update(&context, &sysloadavg, datalen);
   1156  
   1157  		/* The system's VM statistics: */
   1158 +#if !LINUX
   1159  		mib[0] = CTL_VM;
   1160  		mib[1] = VM_METER;
   1161  		datalen = sizeof(sysvmtotal);
   1162  		sysctl(mib, 2, &sysvmtotal, &datalen, NULL, 0);
   1163  		SHA1_Update(&context, &sysvmtotal, datalen);
   1164 -
   1165 +#endif
   1166  		/* The current GMT (26 ASCII characters): */
   1167  		time(&now);
   1168  		strncpy(randomInputBuffer, asctime(gmtime(&now)), 26);	/* "Mon Mar 27 13:46:26 2000" */
   1169 diff --git a/newfs_hfs.tproj/newfs_hfs.c b/newfs_hfs.tproj/newfs_hfs.c
   1170 index c4176a9..bf2ed21 100644
   1171 --- a/newfs_hfs.tproj/newfs_hfs.c
   1172 +++ b/newfs_hfs.tproj/newfs_hfs.c
   1173 @@ -38,8 +38,13 @@
   1174  #include <sys/mount.h>
   1175  #include <sys/param.h>
   1176  #include <sys/stat.h>
   1177 +#if LINUX
   1178 +#include <time.h>
   1179 +#endif
   1180  
   1181 +#if !LINUX
   1182  #include <IOKit/storage/IOMediaBSDClient.h>
   1183 +#endif
   1184  
   1185  #include <hfs/hfs_format.h>
   1186  #include "newfs_hfs.h"
   1187 @@ -73,7 +78,9 @@ static void usage __P((void));
   1188  
   1189  char	*progname;
   1190  char	gVolumeName[kHFSPlusMaxFileNameChars + 1] = {kDefaultVolumeNameStr};
   1191 +#if !LINUX
   1192  char	rawdevice[MAXPATHLEN];
   1193 +#endif
   1194  char	blkdevice[MAXPATHLEN];
   1195  UInt32	gBlockSize = 0;
   1196  UInt32	gNextCNID = kHFSFirstUserCatalogNodeID;
   1197 @@ -158,8 +165,10 @@ main(argc, argv)
   1198  	extern int optind;
   1199  	int ch;
   1200  	int forceHFS;
   1201 +#if !LINUX
   1202  	char *cp, *special;
   1203  	struct statfs *mp;
   1204 +#endif
   1205  	int n;
   1206  	
   1207  	if ((progname = strrchr(*argv, '/')))
   1208 @@ -260,16 +269,19 @@ main(argc, argv)
   1209  			usage();
   1210  		}
   1211  
   1212 -	argc -= optind;
   1213 -	argv += optind;
   1214 +		argc -= optind;
   1215 +		argv += optind;
   1216  
   1217 -	if (gPartitionSize != 0) {
   1218 -		if (argc != 0)
   1219 -			usage();
   1220 -	} else {
   1221 -		if (argc != 1)
   1222 -			usage();
   1223 +		if (gPartitionSize != 0) {
   1224 +			if (argc != 0)
   1225 +				usage();
   1226 +		} else {
   1227 +			if (argc != 1)
   1228 +				usage();
   1229  
   1230 +#if LINUX
   1231 +		(void) sprintf(blkdevice, "%s", argv[0]);
   1232 +#else
   1233  		special = argv[0];
   1234  		cp = strrchr(special, '/');
   1235  		if (cp != 0)
   1236 @@ -278,6 +290,7 @@ main(argc, argv)
   1237  			special++;
   1238  		(void) sprintf(rawdevice, "%sr%s", _PATH_DEV, special);
   1239  		(void) sprintf(blkdevice, "%s%s", _PATH_DEV, special);
   1240 +#endif
   1241  	}
   1242  
   1243  	if (forceHFS && gJournaled) {
   1244 @@ -301,6 +314,9 @@ main(argc, argv)
   1245  		/*
   1246  		 * Check if target device is aready mounted
   1247  		 */
   1248 +#if LINUX
   1249 +	// FIXME
   1250 +#else
   1251  		n = getmntinfo(&mp, MNT_NOWAIT);
   1252  		if (n == 0)
   1253  			fatal("%s: getmntinfo: %s", blkdevice, strerror(errno));
   1254 @@ -310,15 +326,20 @@ main(argc, argv)
   1255  				fatal("%s is mounted on %s", blkdevice, mp->f_mntonname);
   1256  			++mp;
   1257  		}
   1258 +#endif
   1259  	}
   1260  
   1261 -	if (hfs_newfs(rawdevice, forceHFS, true) < 0) {
   1262 +	if (hfs_newfs(blkdevice, forceHFS, true) < 0) {
   1263 +#if LINUX
   1264 +		err(1, NULL);
   1265 +#else
   1266  		/* On ENXIO error use the block device (to get de-blocking) */
   1267  		if (errno == ENXIO) {
   1268  			if (hfs_newfs(blkdevice, forceHFS, false) < 0)
   1269  				err(1, NULL);
   1270  		} else
   1271  			err(1, NULL);
   1272 +#endif
   1273  	}
   1274  
   1275  	exit(0);
   1276 @@ -506,7 +527,9 @@ hfs_newfs(char *device, int forceHFS, int isRaw)
   1277  	int fso = 0;
   1278  	int retval = 0;
   1279  	hfsparams_t defaults = {0};
   1280 +#if !LINUX
   1281  	u_int64_t maxSectorsPerIO;
   1282 +#endif
   1283  
   1284  	if (gPartitionSize) {
   1285  			dip.sectorSize = kBytesPerSector;
   1286 @@ -526,6 +549,34 @@ hfs_newfs(char *device, int forceHFS, int isRaw)
   1287  	
   1288  		if (fstat( fso, &stbuf) < 0)
   1289  			fatal("%s: %s", device, strerror(errno));
   1290 +#if LINUX
   1291 +		dip.sectorSize = 512;
   1292 +		dip.sectorsPerIO = 256;
   1293 +
   1294 +#	ifndef	BLKGETSIZE
   1295 +#	define	BLKGETSIZE		_IO(0x12,96)
   1296 +#	endif
   1297 +
   1298 +#	ifndef	BLKGETSIZE64
   1299 +#	define BLKGETSIZE64		_IOR(0x12,114,size_t)
   1300 +#	endif
   1301 +
   1302 +		if (S_ISREG(stbuf.st_mode)) {
   1303 +		        dip.totalSectors = stbuf.st_size / 512;
   1304 +	        }
   1305 +		else if (S_ISBLK(stbuf.st_mode)) {
   1306 +	                unsigned long size;
   1307 +	                u_int64_t size64;
   1308 +			if (!ioctl(fso, BLKGETSIZE64, &size64))
   1309 +				dip.totalSectors = size64 / 512;
   1310 +			else if (!ioctl(fso, BLKGETSIZE, &size))
   1311 +				dip.totalSectors = size;
   1312 +			else
   1313 +				fatal("%s: %s", device, strerror(errno));
   1314 +		}
   1315 +		else
   1316 +			fatal("%s: is not a block device", device);
   1317 +#else
   1318  	
   1319  		if (ioctl(fso, DKIOCGETBLOCKCOUNT, &dip.totalSectors) < 0)
   1320  			fatal("%s: %s", device, strerror(errno));
   1321 @@ -537,11 +588,14 @@ hfs_newfs(char *device, int forceHFS, int isRaw)
   1322  			dip.sectorsPerIO = (128 * 1024) / dip.sectorSize;  /* use 128K as default */
   1323  		else
   1324  			dip.sectorsPerIO = MIN(maxSectorsPerIO, (1024 * 1024) / dip.sectorSize);
   1325 +#endif
   1326 +
   1327  		/*
   1328  		 * The make_hfs code currentlydoes 512 byte sized I/O.
   1329  		 * If the sector size is bigger than 512, start over
   1330  		 * using the block device (to get de-blocking).
   1331  		 */       
   1332 +#if !LINUX
   1333  		if (dip.sectorSize != kBytesPerSector) {
   1334  			if (isRaw) {
   1335  				close(fso);
   1336 @@ -556,7 +610,9 @@ hfs_newfs(char *device, int forceHFS, int isRaw)
   1337  				dip.sectorSize = kBytesPerSector;
   1338  			}
   1339  		}
   1340 +#endif
   1341  	}
   1342 +
   1343  	dip.sectorOffset = 0;
   1344  	time(&createtime);
   1345  
   1346 diff --git a/newfs_hfs.tproj/newfs_hfs.h b/newfs_hfs.tproj/newfs_hfs.h
   1347 index 968ff10..5680a34 100644
   1348 --- a/newfs_hfs.tproj/newfs_hfs.h
   1349 +++ b/newfs_hfs.tproj/newfs_hfs.h
   1350 @@ -19,8 +19,12 @@
   1351   * 
   1352   * @APPLE_LICENSE_HEADER_END@
   1353   */
   1354 - 
   1355 +
   1356 +#if LINUX
   1357 +#include "missing.h"
   1358 +#else
   1359  #include <CoreFoundation/CFBase.h>
   1360 +#endif
   1361  
   1362  /*
   1363   * Mac OS Finder flags
   1364 @@ -122,33 +126,33 @@ enum {
   1365  #define kDTDF_FileID	16
   1366  #define kDTDF_Name	"Desktop DF"
   1367  #define kDTDF_Chars	10
   1368 -#define kDTDF_Type	'DTFL'
   1369 -#define kDTDF_Creator	'DMGR'
   1370 +#define kDTDF_Type	0x4454464C /* 'DTFL' */
   1371 +#define kDTDF_Creator	0x444D4752 /* 'DMGR' */
   1372  
   1373  #define kDTDB_FileID	17
   1374  #define kDTDB_Name	"Desktop DB"
   1375  #define kDTDB_Chars	10
   1376 -#define kDTDB_Type	'BTFL'
   1377 -#define kDTDB_Creator	'DMGR'
   1378 +#define kDTDB_Type	0x4254464C /* 'BTFL' */
   1379 +#define kDTDB_Creator	0x444D4752 /* 'DMGR' */
   1380  #define kDTDB_Size	1024
   1381  
   1382  #define kReadMe_FileID	18
   1383  #define kReadMe_Name	"ReadMe"
   1384  #define kReadMe_Chars	6
   1385 -#define kReadMe_Type	'ttro'
   1386 -#define kReadMe_Creator	'ttxt'
   1387 +#define kReadMe_Type	0x7474726F /* 'ttro' */
   1388 +#define kReadMe_Creator	0x74747974 /* 'ttxt' */
   1389  
   1390  #define kFinder_FileID	19
   1391  #define kFinder_Name	"Finder"
   1392  #define kFinder_Chars	6
   1393 -#define kFinder_Type	'FNDR'
   1394 -#define kFinder_Creator	'MACS'
   1395 +#define kFinder_Type	0x464E4452 /* 'FNDR' */
   1396 +#define kFinder_Creator	0x4D414353 /* 'MACS' */
   1397  
   1398  #define kSystem_FileID	20
   1399  #define kSystem_Name	"System"
   1400  #define kSystem_Chars	6
   1401 -#define kSystem_Type	'zsys'
   1402 -#define kSystem_Creator	'MACS'
   1403 +#define kSystem_Type	0x7A737973 /* 'zsys' */
   1404 +#define kSystem_Creator	0x4D414353 /* 'MACS' */
   1405  
   1406  
   1407