Objective c 如何打印HFS卷头

Objective c 如何打印HFS卷头,objective-c,macos,hfs+,Objective C,Macos,Hfs+,任何人请给出如何打印HFS+磁盘卷头的代码片段。系统调用可能会提供您所需的信息。系统调用可能会提供您所需的信息。我编写了一个小程序(基于)来打印struct HFSPlusVolumeHeader中声明的一些信息。程序必须以根用户身份运行——例如,通过sudo(8): #包括 #包括 #包括 #包括 #包括 #包括 #包括 #包括 内部主(空){ int-fd; 结构统计; 结构HFSPlusVolumeHeader vheader; const char*vname=“/dev/rdisk0s

任何人请给出如何打印HFS+磁盘卷头的代码片段。

系统调用可能会提供您所需的信息。

系统调用可能会提供您所需的信息。

我编写了一个小程序(基于)来打印
struct HFSPlusVolumeHeader
中声明的一些信息。程序必须以
根用户身份运行
——例如,通过
sudo(8)

#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
内部主(空){
int-fd;
结构统计;
结构HFSPlusVolumeHeader vheader;
const char*vname=“/dev/rdisk0s2”;
if(lstat(vname和stat_buf)=-1){
fprintf(stderr,“无法统计%s\n”,vname);
perror(空);
出口(1);
}
如果((统计模式和S IFMT)!=S IFCHR){
fprintf(stderr,“%s不是原始字符设备\n”,vname);
perror(空);
出口(2);
}
fd=打开(仅限vname和ordu);
如果(fd==-1){
fprintf(stderr,“%s无法打开读取\n”,vname);
perror(空);
出口(3);
}
//卷头从偏移量1024开始
if(前置(fd和vheader,sizeof vheader,1024)!=sizeof vheader){
fprintf(stderr,“无法读取%s的卷头\n”,vname);
perror(空);
出口(4);
}
printf(“文件计数=%u\n”
“folderCount=%u\n”
“块大小=%u\n”
“totalBlocks=%u\n”
“自由块=%u\n”,
OSSwapBigToHostInt32(vheader.fileCount),
OSSwapBigToHostInt32(vheader.folderCount),
OSSwapBigToHostInt32(vheader.blockSize),
OSSwapBigToHostInt32(vheader.totalBlocks),
OSSwapBigToHostInt32(vheader.freeBlocks));
关闭(fd);
返回0;
}

头文件
声明
结构HFSPlusVolumeHeader
。有关HFS+卷头中字段的完整列表,请参阅此文件。

我已经编写了一个小程序(基于),它可以打印在
struct HFSPlusVolumeHeader
中声明的一些信息。程序必须以
根用户身份运行
——例如,通过
sudo(8)

#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
内部主(空){
int-fd;
结构统计;
结构HFSPlusVolumeHeader vheader;
const char*vname=“/dev/rdisk0s2”;
if(lstat(vname和stat_buf)=-1){
fprintf(stderr,“无法统计%s\n”,vname);
perror(空);
出口(1);
}
如果((统计模式和S IFMT)!=S IFCHR){
fprintf(stderr,“%s不是原始字符设备\n”,vname);
perror(空);
出口(2);
}
fd=打开(仅限vname和ordu);
如果(fd==-1){
fprintf(stderr,“%s无法打开读取\n”,vname);
perror(空);
出口(3);
}
//卷头从偏移量1024开始
if(前置(fd和vheader,sizeof vheader,1024)!=sizeof vheader){
fprintf(stderr,“无法读取%s的卷头\n”,vname);
perror(空);
出口(4);
}
printf(“文件计数=%u\n”
“folderCount=%u\n”
“块大小=%u\n”
“totalBlocks=%u\n”
“自由块=%u\n”,
OSSwapBigToHostInt32(vheader.fileCount),
OSSwapBigToHostInt32(vheader.folderCount),
OSSwapBigToHostInt32(vheader.blockSize),
OSSwapBigToHostInt32(vheader.totalBlocks),
OSSwapBigToHostInt32(vheader.freeBlocks));
关闭(fd);
返回0;
}

头文件
声明
结构HFSPlusVolumeHeader
。有关HFS+卷头中字段的完整列表,请参阅此文件。

使用哪种编程语言?在Mac上使用C或objective C?在Mac上使用C或objective C
#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;
}