libblkid
ライブラリを使用して、C/C++プログラムからブロックデバイス上のさまざまなファイルシステムを分析しようとしていますが、うまく機能します。ただし、 このライブラリ のblkid_superblocks_get_name関数と混同しています。
関数はいくつかのname
を割り当てますが、名前は何ですか?また、最初の(入力)引数idx
の意味は何ですか?この種の関数は、タイプblkid_probe
の最初の引数を持っていました。
関数について簡単に見てみましょう。
_int blkid_superblocks_get_name(size_t idx, const char **name, int *usage)
{
if (idx < ARRAY_SIZE(idinfos)) {
if (name)
*name = idinfos[idx]->name;
if (usage)
*usage = idinfos[idx]->usage;
return 0;
}
return -1;
}
_
name
は、_char *
_ポインターへのポインターです(したがって、"文字列"へのポインター)。使用目的は次のようになります
_char *the_name = NULL;
int usage = 0;
size_t idx;
idx = somehow_get_a_valid_index();
blkid_superblock_get_name(idx, &the_name, &usage);
_
この関数は、ポインター_the_name
_を何かの名前を指すように設定します。さらに調査してみましょう:idinfos
とは何ですか、どこから来たのですか?
idinfos
は_struct blkid_idinfo *
_の配列であることがわかります。
_static const struct blkid_idinfo *idinfos[] =
{
&aix_pt_idinfo,
&sgi_pt_idinfo
&Sun_pt_idinfo,
&dos_pt_idinfo,
&gpt_pt_idinfo,
&pmbr_pt_idinfo, /* always after GPT */
&mac_pt_idinfo,
&ultrix_pt_idinfo,
&bsd_pt_idinfo,
&unixware_pt_idinfo,
&solaris_x86_pt_idinfo,
&minix_pt_idinfo
};
_
さらに見てみると、_struct blkid_idinfo
_は
_struct blkid_idinfo
{
const char *name; /* fs, raid or partition table name */
int usage; /* BLKID_USAGE_* flag */
int flags; /* BLKID_IDINFO_* flags */
int minsz; /* minimal device size */
int (*probefunc)(blkid_probe pr, const struct blkid_idmag *mag);
struct blkid_idmag magics[];
};
_
Doxygenのコメントによると、これはファイルシステムまたはRAIDについて説明しています。 idinfos
のメンバーの1人を見てみましょう。
_const struct blkid_idinfo dos_pt_idinfo =
{
.name = "dos",
.probefunc = probe_dos_pt,
.magics =
{
/* DOS master boot sector:
*
* 0 | Code Area
* 440 | Optional Disk signature
* 446 | Partition table
* 510 | 0x55
* 511 | 0xAA
*/
{ .magic = "\x55\xAA", .len = 2, .sboff = 510 },
{ NULL }
}
};
_
これは明らかにDOSパーティションスキーム(別名MBRパーティションテーブル)を説明しています。
したがって、idinfos
は、認識されているいくつかのパーティション形式(MBR、GPT、BSDディスクラベルなど)を記述します。 blkid_superblocks_getname()
を振り返ると、idx
、つまりidinfos
配列へのオフセット(上記で引用)を取り、name
を作成することがわかります。対応する_struct blkid_idinfo
_のname
要素をポイントします(上記の例では_"dos"
_)。
util-linuxソースコードの_libblkid/samples/partitions.c
_は、これを使用してサポートされているパーティションタイプを反復する方法の例を示しています。
注:libblkidのソースコードはかなり明確に配置されているようです。それが何をするのかを理解するためにそれを見てみてください、理解するのは非常に良いです(grep
はあなたの友達です;)また、他のサンプルソースコードを見て、libblkidの方法を理解してください。使用すべきです。