|
|
- 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
-
- --- 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>
- --- a/fsck_hfs.tproj/dfalib/BTree.c
- +++ b/fsck_hfs.tproj/dfalib/BTree.c
- @@ -1705,7 +1705,9 @@ OSStatus BTGetInformation (SFCB *fil
- UInt16 version,
- BTreeInfoRec *info )
- {
- +#if !LINUX
- #pragma unused (version)
- +#endif
-
- BTreeControlBlockPtr btreePtr;
-
- --- 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"
- --- 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;
- --- 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, UIn
- {
- /* 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, UIn
- 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, UIn
- 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, UIn
- 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, UIn
- {
- /* 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, UIn
-
- *numBlocks = blocks;
- *blockSize = 512;
- -
- +
- return( result );
- #endif
- }
- @@ -188,7 +226,7 @@ OSErr DeviceRead(int device, int drive,
- #if BSD
- off_t seek_off;
- ssize_t nbytes;
- -
- +
- *actBytes = 0;
-
- seek_off = lseek(device, offset, SEEK_SET);
- --- a/fsck_hfs.tproj/dfalib/SKeyCompare.c
- +++ b/fsck_hfs.tproj/dfalib/SKeyCompare.c
- @@ -454,7 +454,9 @@ SInt32 CompareExtentKeysPlus( const HFSP
- * 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)
- {
- --- 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;
- --- 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 * ConstStr25
-
- typedef u_int32_t HFSCatalogNodeID;
-
- +#if !LINUX
- enum {
- false = 0,
- true = 1
- };
- +#endif
-
- /* OS error codes */
- enum {
- --- a/fsck_hfs.tproj/dfalib/SUtils.c
- +++ b/fsck_hfs.tproj/dfalib/SUtils.c
- @@ -380,7 +380,8 @@ void InvalidateCalculatedVolumeBitMap( S
- // 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
-
-
- /*-------------------------------------------------------------------------------
- --- 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
- * 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);
- --- 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 (SV
- };
- #endif
-
- +/* #if LINUX
- +#undef XATTR_MAXNAMELEN
- +#endif */
- +
- #endif /* __SCAVENGER__ */
- --- 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"
- --- 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"
-
- /*********************/
- --- 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
- 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
- /* 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
- 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
-
- 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, i
- }
-
- // 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, i
- }
- 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 );
- --- 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);
- --- /dev/null
- +++ b/include/missing.h
- @@ -0,0 +1,114 @@
- +#ifndef _MISSING_H_
- +#define _MISSING_H_
- +
- +#include <endian.h>
- +#include <byteswap.h>
- +#include <errno.h>
- +#include <stdint.h>
- +#include <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
- --- 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"
- --- 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 */
- --- 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, UIn
- 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 btN
-
- #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 dr
- * 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 dr
- 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_
- 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_
- * 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_
- 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,
- 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, UInt3
- 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
- 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 *newV
- 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 *newV
- 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" */
- --- 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, in
- 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, in
-
- 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, in
- 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, in
- dip.sectorSize = kBytesPerSector;
- }
- }
- +#endif
- }
- +
- dip.sectorOffset = 0;
- time(&createtime);
-
- --- 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' */
-
-
-
|