X-Git-Url: http://git.archive.openwrt.org/?p=project%2Ffstools.git;a=blobdiff_plain;f=probe-libblkid.c;fp=probe-libblkid.c;h=c4488885d97ad2b6d16f0621379bd880ffece0e4;hp=0000000000000000000000000000000000000000;hb=c8c2aa3df24542a729129753d4b58e9e5027a288;hpb=f800782ac2426c12e001467b5222331957185854 diff --git a/probe-libblkid.c b/probe-libblkid.c new file mode 100644 index 0000000..c448888 --- /dev/null +++ b/probe-libblkid.c @@ -0,0 +1,117 @@ +/* + * Copyright (C) 2016 Jo-Philipp Wich + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 2.1 + * as published by the Free Software Foundation + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include +#include +#include +#include +#include + +#include "probe.h" + + +static struct { + bool loaded; + blkid_probe (*alloc)(const char *); + int (*probe)(blkid_probe); + int (*lookup)(blkid_probe, const char *, const char **, size_t *); + void (*free)(blkid_probe); +} libblkid = { }; + + +static bool +load_libblkid(void) +{ + void *lib; + + if (!libblkid.loaded) { + lib = dlopen("libblkid.so", RTLD_GLOBAL); + + if (lib) { + libblkid.alloc = dlsym(lib, "blkid_new_probe_from_filename"); + libblkid.probe = dlsym(lib, "blkid_do_probe"); + libblkid.lookup = dlsym(lib, "blkid_probe_lookup_value"); + libblkid.free = dlsym(lib, "blkid_free_probe"); + } + + libblkid.loaded = true; + } + + return (libblkid.alloc && libblkid.probe && libblkid.lookup && libblkid.free); +} + +struct probe_info * +probe_path_libblkid(const char *path) +{ + blkid_probe pr; + struct probe_info *info = NULL; + size_t type_len, uuid_len, label_len, name_len, version_len; + char *dev_ptr, *type_ptr, *uuid_ptr, *label_ptr, *name_ptr, *version_ptr; + const char *type_val, *uuid_val, *label_val, *name_val, *version_val; + + if (!load_libblkid()) + return NULL; + + pr = libblkid.alloc(path); + + if (!pr) + return NULL; + + if (libblkid.probe(pr) == 0) { + if (libblkid.lookup(pr, "TYPE", &type_val, &type_len)) + type_len = 0; + + if (libblkid.lookup(pr, "UUID", &uuid_val, &uuid_len)) + uuid_len = 0; + + if (libblkid.lookup(pr, "LABEL", &label_val, &label_len)) + label_len = 0; + + if (libblkid.lookup(pr, "NAME", &name_val, &name_len)) + name_len = 0; + + if (libblkid.lookup(pr, "VERSION", &version_val, &version_len)) + version_len = 0; + + if (type_len) { + info = calloc_a(sizeof(*info), + &dev_ptr, strlen(path) + 1, + &type_ptr, type_len, + &uuid_ptr, uuid_len, + &label_ptr, label_len, + &name_ptr, name_len, + &version_ptr, version_len); + + if (info) { + info->dev = strcpy(dev_ptr, path); + info->type = strcpy(type_ptr, type_val); + + if (uuid_len) + info->uuid = strcpy(uuid_ptr, uuid_val); + + if (label_len) + info->label = strcpy(label_ptr, label_val); + + if (name_len) + info->name = strcpy(name_ptr, name_val); + + if (version_len) + info->version = strcpy(version_ptr, version_val); + } + } + } + + libblkid.free(pr); + + return info; +}