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.