web-dev-qa-db-ja.com

libblkidライブラリ:「blkid_superblocks_get_name」関数は何のためにありますか?

libblkidライブラリを使用して、C/C++プログラムからブロックデバイス上のさまざまなファイルシステムを分析しようとしていますが、うまく機能します。ただし、 このライブラリblkid_superblocks_get_name関数と混同しています。

関数はいくつかのnameを割り当てますが、名前は何ですか?また、最初の(入力)引数idxの意味は何ですか?この種の関数は、タイプblkid_probeの最初の引数を持っていました。

2
HEKTO

関数について簡単に見てみましょう。

_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の方法を理解してください。使用すべきです。

2
Andreas Wiese