lf_hfs_endian.h   [plain text]


/*  Copyright © 2017-2018 Apple Inc. All rights reserved.
 *
 *  lf_hfs_endian.h
 *  livefiles_hfs
 *
 *  Created by Or Haimovich on 18/3/18.
 */

#ifndef lf_hfs_endian_h
#define lf_hfs_endian_h

#include <stdio.h>
#include "lf_hfs_btrees_internal.h"


/*********************/
/* BIG ENDIAN Macros */
/*********************/
#define SWAP_BE16(__a)                             OSSwapBigToHostInt16 (__a)
#define SWAP_BE32(__a)                             OSSwapBigToHostInt32 (__a)
#define SWAP_BE64(__a)                             OSSwapBigToHostInt64 (__a)


/*
 * Constants for the "unswap" argument to hfs_swap_BTNode:
 */
enum HFSBTSwapDirection {
    kSwapBTNodeBigToHost        =    0,
    kSwapBTNodeHostToBig        =    1,

    /*
     * kSwapBTNodeHeaderRecordOnly is used to swap just the header record
     * of a header node from big endian (on disk) to host endian (in memory).
     * It does not swap the node descriptor (forward/backward links, record
     * count, etc.).  It assumes the header record is at offset 0x000E.
     *
     * Since HFS Plus doesn't have fixed B-tree node sizes, we have to read
     * the header record to determine the actual node size for that tree
     * before we can set up the B-tree control block.  We read it initially
     * as 512 bytes, then re-read it once we know the correct node size.  Since
     * we may not have read the entire header node the first time, we can't
     * swap the record offsets, other records, or do most sanity checks.
     */
    kSwapBTNodeHeaderRecordOnly    =    3
};

int  hfs_swap_BTNode (BlockDescriptor *src, vnode_t vp, enum HFSBTSwapDirection direction, u_int8_t allow_empty_node);


#endif /* lf_hfs_endian_h */