libblkid 库:“blkid_superblocks_get_name”函数的用途是什么?

libblkid 库:“blkid_superblocks_get_name”函数的用途是什么?

我正在尝试使用该libblkid库从 C/C++ 程序分析块设备上的各种文件系统,并且效果良好。然而我很困惑blkid_superblocks_get_name函数来自这个图书馆

该函数分配了一些name,但是名称是什么?另外,第一个(输入)参数的含义是什么idx?此类函数过去的第一个参数类型为blkid_probe

答案1

让我们简单看一下该函数:

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

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指向name相应的 - 元素struct blkid_idinfo(在上面的示例中"dos")。

libblkid/samples/partitions.c在里面实用程序Linux源代码显示了如何使用它来迭代支持的分区类型的示例。

笔记:的源代码libblkid似乎安排得相当清楚,尝试看看它以了解它的作用,它很好理解(grep是你的朋友;)还可以看看其他示例源代码以了解如何libblkid应该使用。

相关内容