]> git.saurik.com Git - apple/hfs.git/blob - newfs_hfs/newfs_hfs.h
2dc3216c9cd2f912cf5f3ebf3a1129fc8c386e9b
[apple/hfs.git] / newfs_hfs / newfs_hfs.h
1 /*
2 * Copyright (c) 1999-2015 Apple Computer, Inc. All rights reserved.
3 *
4 * @APPLE_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. Please obtain a copy of the License at
10 * http://www.opensource.apple.com/apsl/ and read it before using this
11 * file.
12 *
13 * The Original Code and all software distributed under the License are
14 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
15 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
16 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
18 * Please see the License for the specific language governing rights and
19 * limitations under the License.
20 *
21 * @APPLE_LICENSE_HEADER_END@
22 */
23
24 #include <CoreFoundation/CFBase.h>
25
26 /*
27 * Mac OS Finder flags
28 */
29 enum {
30 kHasBeenInited = 0x0100, /* Files only */
31 /* Clear if the file contains desktop database */
32 /* bit 0x0200 was the letter bit for AOCE, but is now reserved for future use */
33 kHasCustomIcon = 0x0400, /* Files and folders */
34 kIsStationery = 0x0800, /* Files only */
35 kNameLocked = 0x1000, /* Files and folders */
36 kHasBundle = 0x2000, /* Files only */
37 kIsInvisible = 0x4000, /* Files and folders */
38 kIsAlias = 0x8000 /* Files only */
39 };
40
41
42 /* Finder types (mostly opaque in our usage) */
43 struct FInfo {
44 uint32_t fileType; /* The type of the file */
45 uint32_t fileCreator; /* The file's creator */
46 UInt16 finderFlags; /* ex: kHasBundle, kIsInvisible... */
47 UInt8 opaque[6]; /* If set to {0, 0}, the Finder will place the item automatically */
48 };
49 typedef struct FInfo FInfo;
50
51 struct FXInfo {
52 UInt8 opaque[16];
53 };
54 typedef struct FXInfo FXInfo;
55
56 struct DInfo {
57 UInt8 opaque[16];
58 };
59 typedef struct DInfo DInfo;
60
61 struct DXInfo {
62 UInt8 opaque[16];
63 };
64 typedef struct DXInfo DXInfo;
65
66
67 enum {
68 kMinHFSPlusVolumeSize = (512 * 1024),
69
70 kBytesPerSector = 512,
71 kBitsPerSector = 4096,
72 kBTreeHeaderUserBytes = 128,
73 kLog2SectorSize = 9,
74 kHFSNodeSize = 512,
75 kHFSMaxAllocationBlks = 65536,
76
77 kHFSPlusDataClumpFactor = 16,
78 kHFSPlusRsrcClumpFactor = 16,
79
80 kWriteSeqNum = 2,
81 kHeaderBlocks = 3,
82 kTailBlocks = 2,
83 kMDBStart = 2,
84 kVolBitMapStart = kHeaderBlocks,
85
86 /* Desktop DB, Desktop DF, Finder, System, ReadMe */
87 kWapperFileCount = 5,
88 /* Maximum wrapper size is 32MB */
89 kMaxWrapperSize = 1024 * 1024 * 32,
90 /* Maximum volume that can be wrapped is 256GB */
91 kMaxWrapableSectors = (kMaxWrapperSize/8) * (65536/512)
92 };
93
94 /* B-tree key descriptor */
95 #define KD_SKIP 0
96 #define KD_BYTE 1
97 #define KD_SIGNBYTE 2
98 #define KD_STRING 3
99 #define KD_WORD 4
100 #define KD_SIGNWORD 5
101 #define KD_LONG 6
102 #define KD_SIGNLONG 7
103 #define KD_FIXLENSTR 8
104 #define KD_DTDBSTR 9
105 #define KD_USEPROC 10
106
107
108 enum {
109 kTextEncodingMacRoman = 0L,
110 kTextEncodingMacJapanese = 1
111 };
112
113
114 /*
115 * The following constant sets the default block size.
116 * This constant must be a power of 2 and meet the following constraints:
117 * MINBSIZE <= DFL_BLKSIZE <= MAXBSIZE
118 * sectorsize <= DFL_BLKSIZE
119 */
120 #define HFSOPTIMALBLKSIZE 4096
121 #define HFSMINBSIZE 512
122 #define HFSMAXBSIZE 2147483648U
123 #define DFL_BLKSIZE HFSOPTIMALBLKSIZE
124
125
126 #define kDTDF_FileID 16
127 #define kDTDF_Name "Desktop DF"
128 #define kDTDF_Chars 10
129 #define kDTDF_Type 'DTFL'
130 #define kDTDF_Creator 'DMGR'
131
132 #define kDTDB_FileID 17
133 #define kDTDB_Name "Desktop DB"
134 #define kDTDB_Chars 10
135 #define kDTDB_Type 'BTFL'
136 #define kDTDB_Creator 'DMGR'
137 #define kDTDB_Size 1024
138
139 #define kReadMe_FileID 18
140 #define kReadMe_Name "ReadMe"
141 #define kReadMe_Chars 6
142 #define kReadMe_Type 'ttro'
143 #define kReadMe_Creator 'ttxt'
144
145 #define kFinder_FileID 19
146 #define kFinder_Name "Finder"
147 #define kFinder_Chars 6
148 #define kFinder_Type 'FNDR'
149 #define kFinder_Creator 'MACS'
150
151 #define kSystem_FileID 20
152 #define kSystem_Name "System"
153 #define kSystem_Chars 6
154 #define kSystem_Type 'zsys'
155 #define kSystem_Creator 'MACS'
156
157
158
159 #if !defined(FALSE) && !defined(TRUE)
160 enum {
161 FALSE = 0,
162 TRUE = 1
163 };
164 #endif
165
166
167 #define kDefaultVolumeNameStr "untitled"
168
169 /*
170 * This is the straight GMT conversion constant:
171 *
172 * 00:00:00 January 1, 1970 - 00:00:00 January 1, 1904
173 * (3600 * 24 * ((365 * (1970 - 1904)) + (((1970 - 1904) / 4) + 1)))
174 */
175 #define MAC_GMT_FACTOR 2082844800UL
176
177 /*
178 * Maximum number of bytes in an HFS+ filename.
179 * It's 255 characters; a UTF16 character may translate
180 * to 3 bytes. Plus one for NUL.
181 */
182
183 #define kHFSPlusMaxFileNameBytes (3 * 255 + 1)
184
185 /* sectorSize = kBytesPerSector = 512
186 sectorOffset and totalSectors are in terms of 512-byte sector size.
187 */
188 struct DriveInfo {
189 int fd;
190 uint32_t sectorSize;
191 uint32_t sectorOffset;
192 uint64_t totalSectors;
193
194 /* actual device info. physSectorSize is necessary to de-block
195 * while using the raw device.
196 */
197 uint32_t physSectorSize;
198 uint64_t physSectorsPerIO;
199 uint64_t physTotalSectors;
200 };
201 typedef struct DriveInfo DriveInfo;
202
203 enum {
204 kMakeHFSWrapper = 0x01,
205 kMakeMaxHFSBitmap = 0x02,
206 kMakeStandardHFS = 0x04,
207 kMakeCaseSensitive = 0x08,
208 kUseAccessPerms = 0x10,
209 kMakeContentProtect= 0x20,
210 };
211
212
213 struct hfsparams {
214 uint32_t flags; /* kMakeHFSWrapper, ... */
215 uint32_t blockSize;
216 uint32_t rsrcClumpSize;
217 uint32_t dataClumpSize;
218 uint32_t nextFreeFileID;
219
220 uint32_t catalogClumpSize;
221 uint32_t catalogInitialSize;
222 uint32_t catalogNodeSize;
223 uint32_t catalogExtsCount;
224 uint32_t catalogStartBlock;
225
226 uint32_t extentsClumpSize;
227 uint32_t extentsInitialSize;
228 uint32_t extentsNodeSize;
229 uint32_t extentsExtsCount;
230 uint32_t extentsStartBlock;
231
232 uint32_t attributesClumpSize;
233 uint32_t attributesInitialSize;
234 uint32_t attributesNodeSize;
235 uint32_t attributesExtsCount;
236 uint32_t attributesStartBlock;
237
238 uint32_t allocationClumpSize;
239 uint32_t allocationExtsCount;
240 uint32_t allocationStartBlock;
241
242 uint32_t createDate; /* in UTC */
243 uint32_t hfsAlignment;
244 unsigned char *volumeName; /* In UTF8, but we need to allocate space for it. */
245 uint32_t encodingHint;
246 uint32_t journaledHFS;
247 uint32_t journalSize;
248 uint32_t journalInfoBlock;
249 uint32_t journalBlock;
250 char *journalDevice;
251 uid_t owner;
252 gid_t group;
253 mode_t mask;
254 #ifdef DEBUG_BUILD
255 uint16_t protectlevel;
256 #endif
257 uint32_t fsStartBlock; /* allocation block offset where the btree allocaiton should start */
258 uint32_t nextAllocBlock; /* Set VH nextAllocationBlock */
259 };
260 typedef struct hfsparams hfsparams_t;
261
262 extern int make_hfsplus(const DriveInfo *driveInfo, hfsparams_t *defaults);
263
264
265 #if __STDC__
266 void fatal(const char *fmt, ...);
267 #else
268 void fatal();
269 #endif