1/* 2 * Copyright (c) 2000-2013 Apple Inc. All rights reserved. 3 * 4 * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ 5 * 6 * This file contains Original Code and/or Modifications of Original Code 7 * as defined in and that are subject to the Apple Public Source License 8 * Version 2.0 (the 'License'). You may not use this file except in 9 * compliance with the License. The rights granted to you under the License 10 * may not be used to create, or enable the creation or redistribution of, 11 * unlawful or unlicensed copies of an Apple operating system, or to 12 * circumvent, violate, or enable the circumvention or violation of, any 13 * terms of an Apple operating system software license agreement. 14 * 15 * Please obtain a copy of the License at 16 * http://www.opensource.apple.com/apsl/ and read it before using this file. 17 * 18 * The Original Code and all software distributed under the License are 19 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 20 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, 21 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, 22 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 23 * Please see the License for the specific language governing rights and 24 * limitations under the License. 25 * 26 * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ 27 */ 28/* 29 File: FilesInternal.h 30 31 Contains: IPI for File Manager (HFS Plus) 32 33 Version: HFS Plus 1.0 34 35 Copyright: � 1996-2001 by Apple Computer, Inc., all rights reserved. 36 37*/ 38#ifndef __FILEMGRINTERNAL__ 39#define __FILEMGRINTERNAL__ 40 41#include <sys/appleapiopts.h> 42 43#ifdef KERNEL 44#ifdef __APPLE_API_PRIVATE 45 46#include <sys/param.h> 47#include <sys/vnode.h> 48 49#include "../../hfs.h" 50#include "../../hfs_macos_defs.h" 51#include "../../hfs_format.h" 52#include "../../hfs_cnode.h" 53 54 55#ifdef __cplusplus 56extern "C" { 57#endif 58 59/* CatalogNodeID is used to track catalog objects */ 60typedef u_int32_t HFSCatalogNodeID; 61 62/* internal error codes*/ 63 64#if TARGET_API_MACOS_X 65 #define ERR_BASE -32767 66#else 67 #define ERR_BASE 0 68#endif 69 70enum { 71 /* FXM errors*/ 72 fxRangeErr = ERR_BASE + 16, /* file position beyond mapped range*/ 73 fxOvFlErr = ERR_BASE + 17, /* extents file overflow*/ 74 /* Unicode errors*/ 75 uniTooLongErr = ERR_BASE + 24, /* Unicode string too long to convert to Str31*/ 76 uniBufferTooSmallErr = ERR_BASE + 25, /* Unicode output buffer too small*/ 77 uniNotMappableErr = ERR_BASE + 26, /* Unicode string can't be mapped to given script*/ 78 /* BTree Manager errors*/ 79 btNotFound = ERR_BASE + 32, /* record not found*/ 80 btExists = ERR_BASE + 33, /* record already exists*/ 81 btNoSpaceAvail = ERR_BASE + 34, /* no available space*/ 82 btNoFit = ERR_BASE + 35, /* record doesn't fit in node */ 83 btBadNode = ERR_BASE + 36, /* bad node detected*/ 84 btBadHdr = ERR_BASE + 37, /* bad BTree header record detected*/ 85 dsBadRotate = ERR_BASE + 64, /* bad BTree rotate*/ 86 /* Catalog Manager errors*/ 87 cmNotFound = ERR_BASE + 48, /* CNode not found*/ 88 cmExists = ERR_BASE + 49, /* CNode already exists*/ 89 cmNotEmpty = ERR_BASE + 50, /* directory CNode not empty (valence = 0)*/ 90 cmRootCN = ERR_BASE + 51, /* invalid reference to root CNode*/ 91 cmBadNews = ERR_BASE + 52, /* detected bad catalog structure*/ 92 cmFThdDirErr = ERR_BASE + 53, /* thread belongs to a directory not a file*/ 93 cmFThdGone = ERR_BASE + 54, /* file thread doesn't exist*/ 94 cmParentNotFound = ERR_BASE + 55, /* CNode for parent ID does not exist*/ 95 /* TFS internal errors*/ 96 fsDSIntErr = -127 /* Internal file system error*/ 97}; 98 99 100/* internal flags*/ 101 102enum { 103 kEFAllMask = 0x01, /* allocate all requested bytes or none */ 104 kEFContigMask = 0x02, /* force contiguous allocation */ 105 kEFReserveMask = 0x04, /* keep block reserve */ 106 kEFDeferMask = 0x08, /* defer file block allocations */ 107 kEFNoClumpMask = 0x10, /* don't round up to clump size */ 108 kEFMetadataMask = 0x20, /* metadata allocation */ 109 110 kTFTrunExtBit = 0, /* truncate to the extent containing new PEOF*/ 111 kTFTrunExtMask = 1 112}; 113 114enum { 115 kUndefinedStrLen = 0, /* Unknown string length */ 116 kNoHint = 0, 117 118 /* FileIDs variables*/ 119 kNumExtentsToCache = 4 /* just guessing for ExchangeFiles*/ 120}; 121 122 123/* Universal Extent Key */ 124 125union ExtentKey { 126 HFSExtentKey hfs; 127 HFSPlusExtentKey hfsPlus; 128}; 129typedef union ExtentKey ExtentKey; 130/* Universal extent descriptor */ 131 132union ExtentDescriptor { 133 HFSExtentDescriptor hfs; 134 HFSPlusExtentDescriptor hfsPlus; 135}; 136typedef union ExtentDescriptor ExtentDescriptor; 137/* Universal extent record */ 138 139union ExtentRecord { 140 HFSExtentRecord hfs; 141 HFSPlusExtentRecord hfsPlus; 142}; 143typedef union ExtentRecord ExtentRecord; 144 145 146enum { 147 CMMaxCName = kHFSMaxFileNameChars 148}; 149 150 151 152/* Universal catalog name*/ 153 154union CatalogName { 155 Str31 pstr; 156 HFSUniStr255 ustr; 157}; 158typedef union CatalogName CatalogName; 159 160 161/* 162 * MacOS accessor routines 163 */ 164#define GetFileControlBlock(fref) VTOF((fref)) 165#define GetFileRefNumFromFCB(fcb) FTOV((fcb)) 166 167/* Test for error and return if error occurred*/ 168EXTERN_API_C( void ) 169ReturnIfError (OSErr result); 170 171#define ReturnIfError(result) do { if ( (result) != noErr ) return (result); } while(0) 172 173/* Exit function on error*/ 174EXTERN_API_C( void ) 175ExitOnError (OSErr result); 176 177#define ExitOnError( result ) do { if ( ( result ) != noErr ) goto ErrorExit; } while(0) 178 179 180 181/* Catalog Manager Routines (IPI)*/ 182 183EXTERN_API_C( OSErr ) 184ExchangeFileIDs (ExtendedVCB * volume, 185 ConstUTF8Param srcName, 186 ConstUTF8Param destName, 187 HFSCatalogNodeID srcID, 188 HFSCatalogNodeID destID, 189 u_int32_t srcHint, 190 u_int32_t destHint ); 191 192EXTERN_API_C( OSErr ) 193MoveData( ExtendedVCB *vcb, HFSCatalogNodeID srcID, HFSCatalogNodeID destID, int rsrc); 194 195/* BTree Manager Routines*/ 196 197typedef CALLBACK_API_C( int32_t , KeyCompareProcPtr )(void *a, void *b); 198 199 200EXTERN_API_C( OSErr ) 201ReplaceBTreeRecord (FileReference refNum, 202 const void * key, 203 u_int32_t hint, 204 void * newData, 205 u_int16_t dataSize, 206 u_int32_t * newHint); 207 208 209/* Prototypes for exported routines in VolumeAllocation.c*/ 210 211/* 212 * Flags for BlockAllocate() and BlockDeallocate() 213 */ 214#define HFS_ALLOC_FORCECONTIG 0x1 //force contiguous block allocation; minblocks must be allocated 215#define HFS_ALLOC_METAZONE 0x2 //can use metazone blocks 216#define HFS_ALLOC_SKIPFREEBLKS 0x4 //skip checking/updating freeblocks during alloc/dealloc 217#define HFS_ALLOC_FLUSHTXN 0x8 //pick best fit for allocation, even if a jnl flush is req'd 218 219EXTERN_API_C( OSErr ) 220BlockAllocate (ExtendedVCB * vcb, 221 u_int32_t startingBlock, 222 u_int32_t minBlocks, 223 u_int32_t maxBlocks, 224 u_int32_t flags, 225 u_int32_t * startBlock, 226 u_int32_t * actualBlocks); 227 228EXTERN_API_C( OSErr ) 229BlockDeallocate (ExtendedVCB * vcb, 230 u_int32_t firstBlock, 231 u_int32_t numBlocks, 232 u_int32_t flags); 233 234EXTERN_API_C ( void ) 235ResetVCBFreeExtCache(struct hfsmount *hfsmp); 236 237EXTERN_API_C( OSErr ) 238BlockMarkAllocated(ExtendedVCB *vcb, u_int32_t startingBlock, u_int32_t numBlocks); 239 240EXTERN_API_C( OSErr ) 241BlockMarkFree( ExtendedVCB *vcb, u_int32_t startingBlock, u_int32_t numBlocks); 242 243EXTERN_API_C( OSErr ) 244BlockMarkFreeUnused( ExtendedVCB *vcb, u_int32_t startingBlock, u_int32_t numBlocks); 245 246EXTERN_API_C( u_int32_t ) 247MetaZoneFreeBlocks(ExtendedVCB *vcb); 248 249EXTERN_API_C( u_int32_t ) 250UpdateAllocLimit (struct hfsmount *hfsmp, u_int32_t new_end_block); 251 252EXTERN_API_C( u_int32_t ) 253ScanUnmapBlocks(struct hfsmount *hfsmp); 254 255EXTERN_API_C( int ) 256hfs_init_summary (struct hfsmount *hfsmp); 257 258/* File Extent Mapping routines*/ 259EXTERN_API_C( OSErr ) 260FlushExtentFile (ExtendedVCB * vcb); 261 262#if CONFIG_HFS_STD 263EXTERN_API_C( int32_t ) 264CompareExtentKeys (const HFSExtentKey * searchKey, 265 const HFSExtentKey * trialKey); 266#endif 267 268EXTERN_API_C( int32_t ) 269CompareExtentKeysPlus (const HFSPlusExtentKey *searchKey, 270 const HFSPlusExtentKey *trialKey); 271 272EXTERN_API_C( OSErr ) 273TruncateFileC (ExtendedVCB *vcb, FCB *fcb, int64_t peof, int deleted, 274 int rsrc, uint32_t fileid, Boolean truncateToExtent); 275 276EXTERN_API_C( OSErr ) 277ExtendFileC (ExtendedVCB * vcb, 278 FCB * fcb, 279 int64_t bytesToAdd, 280 u_int32_t blockHint, 281 u_int32_t flags, 282 int64_t * actualBytesAdded); 283 284EXTERN_API_C( OSErr ) 285MapFileBlockC (ExtendedVCB * vcb, 286 FCB * fcb, 287 size_t numberOfBytes, 288 off_t offset, 289 daddr64_t * startBlock, 290 size_t * availableBytes); 291 292OSErr HeadTruncateFile(ExtendedVCB *vcb, FCB *fcb, u_int32_t headblks); 293 294EXTERN_API_C( int ) 295AddFileExtent (ExtendedVCB *vcb, FCB *fcb, u_int32_t startBlock, u_int32_t blockCount); 296 297#if TARGET_API_MACOS_X 298EXTERN_API_C( Boolean ) 299NodesAreContiguous (ExtendedVCB * vcb, 300 FCB * fcb, 301 u_int32_t nodeSize); 302#endif 303 304 305 306/* Get the current time in UTC (GMT)*/ 307EXTERN_API_C( u_int32_t ) 308GetTimeUTC (void); 309 310EXTERN_API_C( u_int32_t ) 311LocalToUTC (u_int32_t localTime); 312 313EXTERN_API_C( u_int32_t ) 314UTCToLocal (u_int32_t utcTime); 315 316 317#ifdef __cplusplus 318} 319#endif 320 321#endif /* __APPLE_API_PRIVATE */ 322#endif /* KERNEL */ 323#endif /* __FILEMGRINTERNAL__ */ 324 325