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.