HFS+ ディスクのボリューム ヘッダーを印刷する方法のコード スニペットを教えてください。
2 に答える
3
で宣言されている情報の一部を出力する小さなプログラム ( hfs-183.1に基づく) を作成しましたstruct HFSPlusVolumeHeader
。プログラムは次のように実行する必要がありroot
ます。たとえば、次のように実行し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;
}
ヘッダー ファイルは、 を<hfs/hfs_format.h>
宣言しstruct HFSPlusVolumeHeader
ます。HFS+ ボリューム ヘッダー内のフィールドの完全なリストについては、このファイルを参照してください。
于 2011-05-09T11:49:33.660 に答える
1
システム コールgetattrlist()によって、必要な情報が得られる場合があります。
于 2011-05-09T10:58:19.357 に答える