开发者

How to print HFS Volume header

开发者 https://www.devze.com 2023-03-04 03:09 出处:网络
Any one please give code s开发者_StackOverflownippet for how to print volume header of HFS+ disk.I’ve written a small program (based on hfs-183.1) that prints some of the information declared in stru

Any one please give code s开发者_StackOverflownippet for how to print volume header of HFS+ disk.


I’ve written a small program (based on hfs-183.1) that prints some of the information declared in struct HFSPlusVolumeHeader. The program must be run as root — for instance, via sudo(8):

#include <fcntl.h>
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/stat.h>
#include <hfs/hfs_format.h>
#include <libkern/OSByteOrder.h>

int main(void) {
    int fd;
    struct stat stat_buf;
    struct HFSPlusVolumeHeader vheader;

    const char *vname = "/dev/rdisk0s2";

    if (lstat(vname, &stat_buf) == -1) {
        fprintf(stderr, "Couldn't stat %s\n", vname);
        perror(NULL);
        exit(1);
    }

    if ((stat_buf.st_mode & S_IFMT) != S_IFCHR) {
        fprintf(stderr, "%s is not a raw char device\n", vname);
        perror(NULL);
        exit(2);
    }

    fd = open(vname, O_RDONLY);
    if (fd == -1) {
        fprintf(stderr, "%s couldn't be opened for reading\n", vname);
        perror(NULL);
        exit(3);
    }

    // The volume header starts at offset 1024

    if (pread(fd, &vheader, sizeof vheader, 1024) != sizeof vheader) {
        fprintf(stderr, "couldn't read %s's volume header\n", vname);
        perror(NULL);
        exit(4);
    }

    printf("fileCount   = %u\n"
           "folderCount = %u\n"
           "blockSize   = %u\n"
           "totalBlocks = %u\n"
           "freeBlocks  = %u\n",
           OSSwapBigToHostInt32(vheader.fileCount),
           OSSwapBigToHostInt32(vheader.folderCount),
           OSSwapBigToHostInt32(vheader.blockSize),
           OSSwapBigToHostInt32(vheader.totalBlocks),
           OSSwapBigToHostInt32(vheader.freeBlocks));

    close(fd);

    return 0;
}

The header file <hfs/hfs_format.h> declares struct HFSPlusVolumeHeader. See this file for the complete list of fields inside a HFS+ volume header.


The system call getattrlist() might give you the information you need.

0

精彩评论

暂无评论...
验证码 换一张
取 消