1 /*        $NetBSD: libhfs.h,v 1.9 2023/03/01 16:21:14 riastradh Exp $ */
2 
3 /*-
4  * Copyright (c) 2005, 2007 The NetBSD Foundation, Inc.
5  * All rights reserved.
6  *
7  * This code is derived from software contributed to The NetBSD Foundation
8  * by Yevgeny Binder, Dieter Baron, and Pelle Johansson.
9  *
10  * Redistribution and use in source and binary forms, with or without
11  * modification, are permitted provided that the following conditions
12  * are met:
13  * 1. Redistributions of source code must retain the above copyright
14  *    notice, this list of conditions and the following disclaimer.
15  * 2. Redistributions in binary form must reproduce the above copyright
16  *    notice, this list of conditions and the following disclaimer in the
17  *    documentation and/or other materials provided with the distribution.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29  * POSSIBILITY OF SUCH DAMAGE.
30  */
31 
32 #ifndef _FS_HFS_LIBHFS_H_
33 #define _FS_HFS_LIBHFS_H_
34 
35 #include <sys/endian.h>
36 #include <sys/param.h>
37 #include <sys/mount.h>        /* needs to go after sys/param.h or compile fails */
38 #include <sys/types.h>
39 #if defined(_KERNEL)
40 #include <sys/kernel.h>
41 #include <sys/systm.h>
42 #include <sys/fcntl.h>
43 #endif /* defined(_KERNEL) */
44 
45 #if !defined(_KERNEL) && !defined(STANDALONE)
46 #include <fcntl.h>
47 #include <iconv.h>
48 #include <stdarg.h>
49 #include <stdint.h>
50 #include <stdio.h>
51 #include <stdlib.h>
52 #include <unistd.h>
53 #endif /* !defined(_KERNEL) && !defined(STANDALONE) */
54 
55 #define max(A,B) ((A) > (B) ? (A):(B))
56 #define min(A,B) ((A) < (B) ? (A):(B))
57 
58 
59 /* Macros to handle errors in this library. Not recommended outside libhfs.c */
60 #define HFS_LIBERR(format, ...) \
61           do{ hfslib_error(format, __FILE__, __LINE__, ##__VA_ARGS__); \
62                     goto error; } while(/*CONSTCOND*/ 0)
63 
64 #if 0
65 #pragma mark Constants (on-disk)
66 #endif
67 
68 
69 enum {
70           HFS_SIG_HFSP        = 0x482B, /* 'H+' */
71           HFS_SIG_HFSX        = 0x4858, /* 'HX' */
72           HFS_SIG_HFS         = 0x4244  /* 'BD' */
73 }; /* volume signatures */
74 
75 typedef enum {
76                                                                       /* bits 0-6 are reserved */
77           HFS_VOL_HWLOCK                          = 7,
78           HFS_VOL_UNMOUNTED             = 8,
79           HFS_VOL_BADBLOCKS             = 9,
80           HFS_VOL_NOCACHE               = 10,
81           HFS_VOL_DIRTY                           = 11,
82           HFS_VOL_CNIDS_RECYCLED        = 12,
83           HFS_VOL_JOURNALED             = 13,
84                                                                       /* bit 14 is reserved */
85           HFS_VOL_SWLOCK                          = 15
86                                                                       /* bits 16-31 are reserved */
87 } hfs_volume_attribute_bit; /* volume header attribute bits */
88 
89 typedef enum {
90           HFS_LEAFNODE        = -1,
91           HFS_INDEXNODE       = 0,
92           HFS_HEADERNODE      = 1,
93           HFS_MAPNODE         = 2
94 } hfs_node_kind; /* btree node kinds */
95 
96 enum {
97           HFS_BAD_CLOSE_MASK                      = 0x00000001,
98           HFS_BIG_KEYS_MASK                       = 0x00000002,
99           HFS_VAR_INDEX_KEYS_MASK       = 0x00000004
100 }; /* btree header attribute masks */
101 
102 typedef enum {
103           HFS_CNID_ROOT_PARENT          = 1,
104           HFS_CNID_ROOT_FOLDER          = 2,
105           HFS_CNID_EXTENTS              = 3,
106           HFS_CNID_CATALOG              = 4,
107           HFS_CNID_BADBLOCKS            = 5,
108           HFS_CNID_ALLOCATION = 6,
109           HFS_CNID_STARTUP              = 7,
110           HFS_CNID_ATTRIBUTES = 8,
111                                                                                 /* CNIDs 9-13 are reserved */
112           HFS_CNID_REPAIR               = 14,
113           HFS_CNID_TEMP                           = 15,
114           HFS_CNID_USER                           = 16
115 } hfs_special_cnid; /* special CNID values */
116 
117 typedef enum {
118           HFS_REC_FLDR                            = 0x0001,
119           HFS_REC_FILE                            = 0x0002,
120           HFS_REC_FLDR_THREAD = 0x0003,
121           HFS_REC_FILE_THREAD = 0x0004
122 } hfs_catalog_rec_kind; /* catalog record types */
123 
124 enum {
125           HFS_JOURNAL_ON_DISK_MASK                = 0x00000001, /* journal on same volume */
126           HFS_JOURNAL_ON_OTHER_MASK               = 0x00000002, /* journal elsewhere */
127           HFS_JOURNAL_NEEDS_INIT_MASK   = 0x00000004
128 }; /* journal flag masks */
129 
130 enum {
131           HFS_JOURNAL_HEADER_MAGIC      = 0x4a4e4c78,
132           HFS_JOURNAL_ENDIAN_MAGIC      = 0x12345678
133 }; /* journal magic numbers */
134 
135 enum {
136           HFS_DATAFORK        = 0x00,
137           HFS_RSRCFORK        = 0xFF
138 }; /* common fork types */
139 
140 enum {
141           HFS_KEY_CASEFOLD    = 0xCF,
142           HFS_KEY_BINARY                = 0XBC
143 }; /* catalog key comparison method types */
144 
145 enum {
146           HFS_MIN_CAT_KEY_LEN = 6,
147           HFS_MAX_CAT_KEY_LEN = 516,
148           HFS_MAX_EXT_KEY_LEN = 10
149 };
150 
151 enum {
152           HFS_HARD_LINK_FILE_TYPE = 0x686C6E6B,  /* 'hlnk' */
153           HFS_HFSLUS_CREATOR     = 0x6866732B   /* 'hfs+' */
154 };
155 
156 
157 #if 0
158 #pragma mark -
159 #pragma mark Constants (custom)
160 #endif
161 
162 
163 /* number of bytes between start of volume and volume header */
164 #define HFS_VOLUME_HEAD_RESERVE_SIZE    1024
165 
166 typedef enum {
167           HFS_CATALOG_FILE = 1,
168           HFS_EXTENTS_FILE = 2,
169           HFS_ATTRIBUTES_FILE = 3
170 } hfs_btree_file_type; /* btree file kinds */
171 
172 
173 #if 0
174 #pragma mark -
175 #pragma mark On-Disk Types (Mac OS specific)
176 #endif
177 
178 typedef uint32_t    hfs_macos_type_code; /* four 1-byte char field */
179 
180 typedef struct {
181           int16_t   v;
182           int16_t   h;
183 } hfs_macos_point_t;
184 
185 typedef struct {
186           int16_t   t;        /* top */
187           int16_t   l;        /* left */
188           int16_t   b;        /* bottom */
189           int16_t   r;        /* right */
190 } hfs_macos_rect_t;
191 
192 typedef struct {
193           hfs_macos_type_code file_type;
194           hfs_macos_type_code file_creator;
195           uint16_t                                finder_flags;
196           hfs_macos_point_t   location;
197           uint16_t                                reserved;
198 } hfs_macos_file_info_t;
199 
200 typedef struct {
201           int16_t   reserved[4];
202           uint16_t  extended_finder_flags;
203           int16_t   reserved2;
204           int32_t   put_away_folder_cnid;
205 } hfs_macos_extended_file_info_t;
206 
207 typedef struct {
208           hfs_macos_rect_t              window_bounds;
209           uint16_t                                finder_flags;
210           hfs_macos_point_t   location;
211           uint16_t                                reserved;
212 } hfs_macos_folder_info_t;
213 
214 typedef struct {
215           hfs_macos_point_t   scroll_position;
216           int32_t                                 reserved;
217           uint16_t                                extended_finder_flags;
218           int16_t                                 reserved2;
219           int32_t                                 put_away_folder_cnid;
220 } hfs_macos_extended_folder_info_t;
221 
222 
223 #if 0
224 #pragma mark -
225 #pragma mark On-Disk Types
226 #endif
227 
228 typedef uint16_t unichar_t;
229 
230 typedef uint32_t hfs_cnid_t;
231 
232 typedef struct {
233           uint16_t  length;
234           unichar_t unicode[255];
235 } hfs_unistr255_t;
236 
237 typedef struct {
238           uint32_t  start_block;
239           uint32_t  block_count;
240 } hfs_extent_descriptor_t;
241 
242 typedef hfs_extent_descriptor_t hfs_extent_record_t[8];
243 
244 typedef struct hfs_fork_t {
245           uint64_t                                logical_size;
246           uint32_t                                clump_size;
247           uint32_t                                total_blocks;
248           hfs_extent_record_t extents;
249 } hfs_fork_t;
250 
251 typedef struct {
252           uint16_t  signature;
253           uint16_t  version;
254           uint32_t  attributes;
255           uint32_t  last_mounting_version;
256           uint32_t  journal_info_block;
257 
258           uint32_t  date_created;
259           uint32_t  date_modified;
260           uint32_t  date_backedup;
261           uint32_t  date_checked;
262 
263           uint32_t  file_count;
264           uint32_t  folder_count;
265 
266           uint32_t  block_size;
267           uint32_t  total_blocks;
268           uint32_t  free_blocks;
269 
270           uint32_t  next_alloc_block;
271           uint32_t  rsrc_clump_size;
272           uint32_t  data_clump_size;
273           hfs_cnid_t          next_cnid;
274 
275           uint32_t  write_count;
276           uint64_t  encodings;
277 
278           uint32_t  finder_info[8];
279 
280           hfs_fork_t          allocation_file;
281           hfs_fork_t          extents_file;
282           hfs_fork_t          catalog_file;
283           hfs_fork_t          attributes_file;
284           hfs_fork_t          startup_file;
285 } hfs_volume_header_t;
286 
287 typedef struct {
288           uint32_t  flink;
289           uint32_t  blink;
290           int8_t              kind;
291           uint8_t             height;
292           uint16_t  num_recs;
293           uint16_t  reserved;
294 } hfs_node_descriptor_t;
295 
296 typedef struct {
297           uint16_t  tree_depth;
298           uint32_t  root_node;
299           uint32_t  leaf_recs;
300           uint32_t  first_leaf;
301           uint32_t  last_leaf;
302           uint16_t  node_size;
303           uint16_t  max_key_len;
304           uint32_t  total_nodes;
305           uint32_t  free_nodes;
306           uint16_t  reserved;
307           uint32_t  clump_size;                   /* misaligned */
308           uint8_t             btree_type;
309           uint8_t             keycomp_type;
310           uint32_t  attributes;                   /* long aligned again */
311           uint32_t  reserved2[16];
312 } hfs_header_record_t;
313 
314 typedef struct {
315           uint16_t                      key_len;
316           hfs_cnid_t                              parent_cnid;
317           hfs_unistr255_t     name;
318 } hfs_catalog_key_t;
319 
320 typedef struct {
321           uint16_t  key_length;
322           uint8_t             fork_type;
323           uint8_t             padding;
324           hfs_cnid_t          file_cnid;
325           uint32_t  start_block;
326 } hfs_extent_key_t;
327 
328 typedef struct {
329           uint32_t  owner_id;
330           uint32_t  group_id;
331           uint8_t             admin_flags;
332           uint8_t             owner_flags;
333           uint16_t  file_mode;
334           union {
335                     uint32_t  inode_num;
336                     uint32_t  link_count;
337                     uint32_t  raw_device;
338           } special;
339 } hfs_bsd_data_t;
340 
341 typedef struct {
342           int16_t                       rec_type;
343           uint16_t            flags;
344           uint32_t            valence;
345           hfs_cnid_t                    cnid;
346           uint32_t            date_created;
347           uint32_t            date_content_mod;
348           uint32_t            date_attrib_mod;
349           uint32_t            date_accessed;
350           uint32_t            date_backedup;
351           hfs_bsd_data_t                                                        bsd;
352           hfs_macos_folder_info_t                           user_info;
353           hfs_macos_extended_folder_info_t        finder_info;
354           uint32_t            text_encoding;
355           uint32_t            reserved;
356 } hfs_folder_record_t;
357 
358 typedef struct {
359           int16_t                       rec_type;
360           uint16_t            flags;
361           uint32_t            reserved;
362           hfs_cnid_t                    cnid;
363           uint32_t            date_created;
364           uint32_t            date_content_mod;
365           uint32_t            date_attrib_mod;
366           uint32_t            date_accessed;
367           uint32_t            date_backedup;
368           hfs_bsd_data_t                                                        bsd;
369           hfs_macos_file_info_t                                       user_info;
370           hfs_macos_extended_file_info_t                    finder_info;
371           uint32_t            text_encoding;
372           uint32_t            reserved2;
373           hfs_fork_t                    data_fork;
374           hfs_fork_t                    rsrc_fork;
375 } hfs_file_record_t;
376 
377 typedef struct {
378           int16_t                                 rec_type;
379           int16_t                                 reserved;
380           hfs_cnid_t                              parent_cnid;
381           hfs_unistr255_t     name;
382 } hfs_thread_record_t;
383 
384 typedef struct {
385           uint32_t  flags;
386           uint32_t  device_signature[8];
387           uint64_t  offset;
388           uint64_t  size;
389           uint64_t  reserved[32];
390 } hfs_journal_info_t;
391 
392 typedef struct {
393           uint32_t  magic;
394           uint32_t  endian;
395           uint64_t  start;
396           uint64_t  end;
397           uint64_t  size;
398           uint32_t  blocklist_header_size;
399           uint32_t  checksum;
400           uint32_t  journal_header_size;
401 } hfs_journal_header_t;
402 
403 /* plain HFS structures needed for hfs wrapper support */
404 
405 typedef struct {
406           uint16_t        start_block;
407           uint16_t        block_count;
408 } hfs_hfs_extent_descriptor_t;
409 
410 typedef hfs_hfs_extent_descriptor_t hfs_hfs_extent_record_t[3];
411 
412 typedef struct {
413           uint16_t        signature;
414           uint32_t        date_created;
415           uint32_t        date_modified;
416           uint16_t        attributes;
417           uint16_t        root_file_count;
418           uint16_t        volume_bitmap;
419           uint16_t        next_alloc_block;
420           uint16_t        total_blocks;
421           uint32_t        block_size;
422           uint32_t        clump_size;
423           uint16_t        first_block;
424           hfs_cnid_t      next_cnid;
425           uint16_t        free_blocks;
426           unsigned char   volume_name[28];
427           uint32_t        date_backedup;
428           uint16_t        backup_seqnum;
429           uint32_t        write_count;
430           uint32_t        extents_clump_size;
431           uint32_t        catalog_clump_size;
432           uint16_t        root_folder_count;
433           uint32_t        file_count;
434           uint32_t        folder_count;
435           uint32_t        finder_info[8];
436           uint16_t        embedded_signature;
437           hfs_hfs_extent_descriptor_t embedded_extent;
438           uint32_t        extents_size;
439           hfs_hfs_extent_record_t extents_extents;
440           uint32_t        catalog_size;
441           hfs_hfs_extent_record_t catalog_extents;
442 } hfs_hfs_master_directory_block_t;
443 
444 #if 0
445 #pragma mark -
446 #pragma mark Custom Types
447 #endif
448 
449 typedef struct {
450           hfs_volume_header_t vh;                 /* volume header */
451           hfs_header_record_t chr;      /* catalog file header node record*/
452           hfs_header_record_t ehr;      /* extent overflow file header node record*/
453           uint8_t   catkeysizefieldsize;          /* size of catalog file key_len field in
454                                                                                            * bytes (1 or 2); always 2 for HFS+ */
455           uint8_t   extkeysizefieldsize;          /* size of extent file key_len field in
456                                                                                            * bytes (1 or 2); always 2 for HFS+ */
457           hfs_unistr255_t               name;     /* volume name */
458 
459           /* pointer to catalog file key comparison function */
460           int (*keycmp) (const void*, const void*);
461 
462           int                                                         journaled;          /* 1 if volume is journaled, else 0 */
463           hfs_journal_info_t            jib;      /* journal info block */
464           hfs_journal_header_t          jh;                 /* journal header */
465 
466           uint64_t offset;    /* offset, in bytes, of HFS+ volume */
467           int                 readonly; /* 0 if mounted r/w, 1 if mounted r/o */
468           void*     cbdata;             /* application-specific data; allocated, defined and
469                                                              * used (if desired) by the program, usually within
470                                                              * callback routines */
471 } hfs_volume;
472 
473 typedef union {
474           /* for leaf nodes */
475           int16_t                                           type; /* type of record: folder, file, or thread */
476           hfs_folder_record_t folder;
477           hfs_file_record_t             file;
478           hfs_thread_record_t thread;
479 
480           /* for pointer nodes */
481           /* (using this large union for just one tiny field is not memory-efficient,
482            *         so change this if it becomes problematic) */
483           uint32_t  child;    /* node number of this node's child node */
484 } hfs_catalog_keyed_record_t;
485 
486 /*
487  * These arguments are passed among libhfs without any inspection. This struct
488  * is accepted by all public functions of libhfs, and passed to each callback.
489  * An application dereferences each pointer to its own specific struct of
490  * arguments. Callbacks must be prepared to deal with NULL values for any of
491  * these fields (by providing default values to be used in lieu of that
492  * argument). However, a NULL pointer to this struct is an error.
493  *
494  * It was decided to make one unified argument structure, rather than many
495  * separate, operand-specific structures, because, when this structure is passed
496  * to a public function (e.g., hfslib_open_volume()), the function may make
497  * several calls (and subcalls) to various facilities, e.g., read(), malloc(),
498  * and free(), all of which require their own particular arguments. The
499  * facilities to be used are quite impractical to foreshadow, so the application
500  * takes care of all possible calls at once. This also reinforces the idea that
501  * a public call is an umbrella to a set of system calls, and all of these calls
502  * must be passed arguments which do not change within the context of this
503  * umbrella. (E.g., if a public function makes two calls to read(), one call
504  * should not be passed a uid of root and the other passed a uid of daemon.)
505  */
506 typedef struct {
507           /* The 'error' function does not take an argument. All others do. */
508 
509           void*     allocmem;
510           void*     reallocmem;
511           void*     freemem;
512           void*     openvol;
513           void*     closevol;
514           void*     read;
515 } hfs_callback_args;
516 
517 typedef struct {
518           /* error(in_format, in_file, in_line, in_args) */
519           void (*error) (const char*, const char*, int, va_list);
520 
521           /* allocmem(in_size, cbargs) */
522           void* (*allocmem) (size_t, hfs_callback_args*);
523 
524           /* reallocmem(in_ptr, in_size, cbargs) */
525           void* (*reallocmem) (void*, size_t, hfs_callback_args*);
526 
527           /* freemem(in_ptr, cbargs) */
528           void (*freemem) (void*, hfs_callback_args*);
529 
530           /* openvol(in_volume, in_devicepath, cbargs)
531            * returns 0 on success */
532           int (*openvol) (hfs_volume*, const char*, hfs_callback_args*);
533 
534           /* closevol(in_volume, cbargs) */
535           void (*closevol) (hfs_volume*, hfs_callback_args*);
536 
537           /* read(in_volume, out_buffer, in_length, in_offset, cbargs)
538            * returns 0 on success */
539           int (*read) (hfs_volume*, void*, uint64_t, uint64_t,
540                     hfs_callback_args*);
541 } hfs_callbacks;
542 
543 extern hfs_callbacks          hfs_gcb;  /* global callbacks */
544 
545 /*
546  * global case folding table
547  * (lazily initialized; see comments at bottom of hfs_open_volume())
548  */
549 extern unichar_t* hfs_gcft;
550 
551 #if 0
552 #pragma mark -
553 #pragma mark Functions
554 #endif
555 
556 void hfslib_init(hfs_callbacks*);
557 void hfslib_done(void);
558 void hfslib_init_cbargs(hfs_callback_args*);
559 
560 int hfslib_open_volume(const char*, int, hfs_volume*,
561           hfs_callback_args*);
562 void hfslib_close_volume(hfs_volume*, hfs_callback_args*);
563 
564 int hfslib_path_to_cnid(hfs_volume*, hfs_cnid_t, char**, uint16_t*,
565           hfs_callback_args*);
566 hfs_cnid_t hfslib_find_parent_thread(hfs_volume*, hfs_cnid_t,
567           hfs_thread_record_t*, hfs_callback_args*);
568 int hfslib_find_catalog_record_with_cnid(hfs_volume*, hfs_cnid_t,
569           hfs_catalog_keyed_record_t*, hfs_catalog_key_t*, hfs_callback_args*);
570 int hfslib_find_catalog_record_with_key(hfs_volume*, hfs_catalog_key_t*,
571           hfs_catalog_keyed_record_t*, hfs_callback_args*);
572 int hfslib_find_extent_record_with_key(hfs_volume*, hfs_extent_key_t*,
573           hfs_extent_record_t*, hfs_callback_args*);
574 int hfslib_get_directory_contents(hfs_volume*, hfs_cnid_t,
575           hfs_catalog_keyed_record_t**, hfs_unistr255_t**, uint32_t*,
576           hfs_callback_args*);
577 int hfslib_is_journal_clean(hfs_volume*);
578 int hfslib_is_private_file(hfs_catalog_key_t*);
579 
580 int hfslib_get_hardlink(hfs_volume *, uint32_t,
581                                hfs_catalog_keyed_record_t *, hfs_callback_args *);
582 
583 size_t hfslib_read_volume_header(void*, hfs_volume_header_t*);
584 size_t hfslib_read_master_directory_block(void*,
585           hfs_hfs_master_directory_block_t*);
586 size_t hfslib_reada_node(void*, hfs_node_descriptor_t*, void***, uint16_t**,
587           hfs_btree_file_type, hfs_volume*, hfs_callback_args*);
588 size_t hfslib_reada_node_offsets(void*, uint16_t*, uint16_t);
589 size_t hfslib_read_header_node(void**, uint16_t*, uint16_t,
590           hfs_header_record_t*, void*, void*);
591 size_t hfslib_read_catalog_keyed_record(void*, hfs_catalog_keyed_record_t*,
592           int16_t*, hfs_catalog_key_t*, hfs_volume*);
593 size_t hfslib_read_extent_record(void*, hfs_extent_record_t*, hfs_node_kind,
594           hfs_extent_key_t*, hfs_volume*);
595 void hfslib_free_recs(void***, uint16_t**, uint16_t*, hfs_callback_args*);
596 
597 size_t hfslib_read_fork_descriptor(void*, hfs_fork_t*);
598 size_t hfslib_read_extent_descriptors(void*, hfs_extent_record_t*);
599 size_t hfslib_read_unistr255(void*, hfs_unistr255_t*);
600 size_t hfslib_read_bsd_data(void*, hfs_bsd_data_t*);
601 size_t hfslib_read_file_userinfo(void*, hfs_macos_file_info_t*);
602 size_t hfslib_read_file_finderinfo(void*, hfs_macos_extended_file_info_t*);
603 size_t hfslib_read_folder_userinfo(void*, hfs_macos_folder_info_t*);
604 size_t hfslib_read_folder_finderinfo(void*, hfs_macos_extended_folder_info_t*);
605 size_t hfslib_read_journal_info(void*, hfs_journal_info_t*);
606 size_t hfslib_read_journal_header(void*, hfs_journal_header_t*);
607 
608 uint16_t hfslib_make_catalog_key(hfs_cnid_t, uint16_t, unichar_t*,
609           hfs_catalog_key_t*);
610 uint16_t hfslib_make_extent_key(hfs_cnid_t, uint8_t, uint32_t,
611           hfs_extent_key_t*);
612 uint16_t hfslib_get_file_extents(hfs_volume*, hfs_cnid_t, uint8_t,
613           hfs_extent_descriptor_t**, hfs_callback_args*);
614 int hfslib_readd_with_extents(hfs_volume*, void*, uint64_t*, uint64_t,
615           uint64_t, hfs_extent_descriptor_t*, uint16_t, hfs_callback_args*);
616 
617 int hfslib_compare_catalog_keys_cf(const void*, const void*);
618 int hfslib_compare_catalog_keys_bc(const void*, const void*);
619 int hfslib_compare_extent_keys(const void*, const void*);
620 
621 
622 /* callback wrappers */
623 void hfslib_error(const char*, const char*, int, ...) __attribute__ ((format (printf, 1, 4)));
624 void* hfslib_malloc(size_t, hfs_callback_args*);
625 void* hfslib_realloc(void*, size_t, hfs_callback_args*);
626 void hfslib_free(void*, hfs_callback_args*);
627 int hfslib_openvoldevice(hfs_volume*, const char*, hfs_callback_args*);
628 void hfslib_closevoldevice(hfs_volume*, hfs_callback_args*);
629 int hfslib_readd(hfs_volume*, void*, uint64_t, uint64_t, hfs_callback_args*);
630 
631 #endif /* !_FS_HFS_LIBHFS_H_ */
632