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