A biblioteca libblkid: qual é a função 'blkid_superblocks_get_name'?

2

Estou tentando usar a biblioteca libblkid para analisar vários sistemas de arquivos em um dispositivo de bloco de um programa C / C ++ e funciona bem. No entanto, estou confuso com a função blkid_superblocks_get_name de esta biblioteca .

A função atribui algum name , mas o nome de quê? Além disso, qual é o significado do primeiro argumento (de entrada) idx ? Esse tipo de função costumava ter o primeiro argumento do tipo blkid_probe .

    
por HEKTO 09.04.2014 / 22:36

1 resposta

2

Vamos dar uma breve olhada na função:

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 é um ponteiro para um ponteiro char * (portanto, um ponteiro para uma »string«). O uso pretendido seria algo como

char *the_name = NULL;
int usage = 0;
size_t idx;

idx = somehow_get_a_valid_index();

blkid_superblock_get_name(idx, &the_name, &usage);

A função define seu ponteiro the_name para apontar para o nome de algo. Vamos investigar mais: O que é idinfos e de onde vem?

Acontece que idinfos é uma matriz de 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
};

e olhando mais, vemos struct blkid_idinfo is

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[];
};

O comentário do Doxygen diz que isso descreve um sistema de arquivos ou RAID. Vamos dar uma olhada em um dos membros de 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 }
    }
};

Isso obviamente descreve o esquema de particionamento do DOS (também conhecido como tabela de partições MBR).

Portanto, idinfos descreve vários formatos de partição reconhecidos (MBR, GPT, BSD disklabels,…). Olhando para trás para blkid_superblocks_getname() , podemos ver que é preciso um idx , que é um deslocamento para a matriz idinfos (conforme citado acima) e faz name apontar para o name -element do correspondente struct blkid_idinfo (no exemplo acima, "dos" ).

libblkid/samples/partitions.c no código-fonte util-linux mostra um exemplo de como usar isso para iterar tipos de partição suportados.

Nota: o código-fonte libblkid parece estar bem organizado, tente dar uma olhada nele para entender o que ele faz, é muito bom entender ( grep é seu amigo;) Também dê uma olhada no outro código fonte para entender como o libblkid deve ser usado.

    
por 10.04.2014 / 01:00