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' */
|
|
|
|
|
|
|