2011-07-19 8 views

Respuesta

12

Es casi tan simple como lo hace el manual: crea una estructura de sonda, la inicializa, le pide cierta información y luego la libera. Y puedes combinar los dos primeros pasos en uno. Se trata de un programa de trabajo:

#include <stdio.h> 
#include <stdlib.h> 
#include <err.h> 
#include <blkid/blkid.h> 

int main (int argc, char *argv[]) { 
    blkid_probe pr; 
    const char *uuid; 

    if (argc != 2) { 
    fprintf(stderr, "Usage: %s devname\n", argv[0]); 
    exit(1); 
    } 

    pr = blkid_new_probe_from_filename(argv[1]); 
    if (!pr) { 
    err(2, "Failed to open %s", argv[1]); 
    } 

    blkid_do_probe(pr); 
    blkid_probe_lookup_value(pr, "UUID", &uuid, NULL); 

    printf("UUID=%s\n", uuid); 

    blkid_free_probe(pr); 

    return 0; 
} 

blkid_probe_lookup_value conjuntos uuid que apuntan a una cadena que pertenece a la estructura pr, por lo que el argumento es de tipo const char *. Si necesita hacerlo, puede copiarlo en un char * que administre por su cuenta, pero para pasar al printf, no es necesario. El cuarto argumento para blkid_probe_lookup_value le permite obtener la longitud del valor devuelto en caso de que necesite eso también. Hay algunas diferencias sutiles entre blkid_do_probe, blkid_do_safeprobe y blkid_do_fullprobe, pero en los casos en que el dispositivo tiene un sistema de archivos conocido y usted solo quiere extraer el UUID de él, debe hacer el primer resultado del blkid_do_probe.

+0

Este ejemplo requiere que ingrese la partición como argumento correcto? ¿Cómo verificaría el UUID de la partición ROOT? – HighLife

+0

Defina "la partición ROOT". El dispositivo montado en '/'? – hobbs

+0

sí el dispositivo montado en/ – HighLife

4

Primero debe encontrar el dispositivo montado como raíz. Ver man getmntent (3). Una vez que conozca el dispositivo, use blkid_new_probe_from_filename como se describe en hobbs.

#include <stdio.h> 
#include <mntent.h> 

int main() { 
    FILE* fstab = setmntent("/etc/mtab", "r"); 
    struct mntent *e; 
    const char *devname = NULL; 
    while ((e = getmntent(fstab))) { 
     if (strcmp("/", e->mnt_dir) == 0) { 
      devname = e->mnt_fsname; 
      break; 
     } 
    } 
    printf("root devname is %s\n", devname); 
    endmntent(fstab); 
    return 0; 
} 
+0

Esto es muy útil, lo estoy combinando con la publicación de Hobbs y veré qué sucede. Gracias – HighLife