From: Kay Sievers Date: Thu, 3 May 2007 12:22:39 +0000 (+0200) Subject: volume_id: add volume_id_get_* functions X-Git-Tag: 174~1970 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=commitdiff_plain;h=e7ea9c50e8eaab772206268739db2d59ba7bd709 volume_id: add volume_id_get_* functions In a future version of libvolume_id, struct volume_id will be an opaque data type, which can't be accessed directly. No interface has changed for now, until all known users are converted not to access the structure directly. --- diff --git a/extras/volume_id/lib/Makefile b/extras/volume_id/lib/Makefile index 41b7ecb7a..fafcc5279 100644 --- a/extras/volume_id/lib/Makefile +++ b/extras/volume_id/lib/Makefile @@ -13,7 +13,7 @@ INSTALL_DATA = ${INSTALL} -m 644 INSTALL_LIB = ${INSTALL} -m 755 SHLIB_CUR = 0 -SHLIB_REV = 76 +SHLIB_REV = 77 SHLIB_AGE = 0 SHLIB = libvolume_id.so.$(SHLIB_CUR).$(SHLIB_REV).$(SHLIB_AGE) diff --git a/extras/volume_id/lib/exported_symbols b/extras/volume_id/lib/exported_symbols index 57a1feb3d..c88d993e0 100644 --- a/extras/volume_id/lib/exported_symbols +++ b/extras/volume_id/lib/exported_symbols @@ -1,5 +1,14 @@ { global: volume_id_log_fn; + + volume_id_get_label; + volume_id_get_label_raw; + volume_id_get_uuid; + volume_id_get_uuid_raw; + volume_id_get_usage; + volume_id_get_type; + volume_id_get_type_version; + volume_id_open_fd; volume_id_open_node; volume_id_probe_all; diff --git a/extras/volume_id/lib/libvolume_id.h b/extras/volume_id/lib/libvolume_id.h index 98423f08c..523543f7e 100644 --- a/extras/volume_id/lib/libvolume_id.h +++ b/extras/volume_id/lib/libvolume_id.h @@ -1,7 +1,7 @@ /* * volume_id - reads volume label and uuid * - * Copyright (C) 2005 Kay Sievers + * Copyright (C) 2005-2007 Kay Sievers * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the @@ -14,11 +14,6 @@ #include #include -#ifndef PACKED -#define PACKED __attribute__((packed)) -#endif - - typedef void (*volume_id_log_fn_t)(int priority, const char *file, int line, const char *format, ...) __attribute__ ((format(printf, 4, 5))); @@ -61,6 +56,14 @@ struct volume_id { int fd_close:1; }; +extern int volume_id_get_label(struct volume_id *id, const char **label); +extern int volume_id_get_label_raw(struct volume_id *id, const uint8_t **label, size_t *len); +extern int volume_id_get_uuid(struct volume_id *id, const char **uuid); +extern int volume_id_get_uuid_raw(struct volume_id *id, const uint8_t **uuid, size_t *len); +extern int volume_id_get_usage(struct volume_id *id, const char **usage); +extern int volume_id_get_type(struct volume_id *id, const char **type); +extern int volume_id_get_type_version(struct volume_id *id, const char **type_version); + extern struct volume_id *volume_id_open_fd(int fd); extern struct volume_id *volume_id_open_node(const char *path); extern int volume_id_probe_all(struct volume_id *id, uint64_t off, uint64_t size); diff --git a/extras/volume_id/lib/util.h b/extras/volume_id/lib/util.h index 2abf05df7..964e70196 100644 --- a/extras/volume_id/lib/util.h +++ b/extras/volume_id/lib/util.h @@ -23,6 +23,10 @@ #include #include +#ifndef PACKED +#define PACKED __attribute__((packed)) +#endif + #define err(format, arg...) volume_id_log_fn(LOG_ERR, __FILE__, __LINE__, format, ##arg) #define info(format, arg...) volume_id_log_fn(LOG_INFO, __FILE__, __LINE__, format, ##arg) #ifdef DEBUG diff --git a/extras/volume_id/lib/volume_id.c b/extras/volume_id/lib/volume_id.c index c6c8d5af6..bf009c720 100644 --- a/extras/volume_id/lib/volume_id.c +++ b/extras/volume_id/lib/volume_id.c @@ -1,7 +1,7 @@ /* * volume_id - reads volume label and uuid * - * Copyright (C) 2005 Kay Sievers + * Copyright (C) 2005-2007 Kay Sievers * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the @@ -36,6 +36,103 @@ static void default_log(int priority, const char *file, int line, const char *fo volume_id_log_fn_t volume_id_log_fn = default_log; +int volume_id_get_label(struct volume_id *id, const char **label) +{ + if (id == NULL) + return -EINVAL; + if (label == NULL) + return -EINVAL; + if (id->usage_id == VOLUME_ID_UNUSED) + return 0; + + *label = id->label; + return 1; +} + +int volume_id_get_label_raw(struct volume_id *id, const uint8_t **label, size_t *len) +{ + if (id == NULL) + return -EINVAL; + if (label == NULL) + return -EINVAL; + if (len == NULL) + return -EINVAL; + if (id->usage_id == VOLUME_ID_UNUSED) + return 0; + + *label = id->label_raw; + *len = id->label_raw_len; + return 1; +} + +int volume_id_get_uuid(struct volume_id *id, const char **uuid) +{ + if (id == NULL) + return -EINVAL; + if (uuid == NULL) + return -EINVAL; + if (id->usage_id == VOLUME_ID_UNUSED) + return 0; + + *uuid = id->uuid; + return 1; +} + +int volume_id_get_uuid_raw(struct volume_id *id, const uint8_t **uuid, size_t *len) +{ + if (id == NULL) + return -EINVAL; + if (uuid == NULL) + return -EINVAL; + if (len == NULL) + return -EINVAL; + if (id->usage_id == VOLUME_ID_UNUSED) + return 0; + + *uuid = id->uuid_raw; + *len = id->uuid_raw_len; + return 1; +} + +int volume_id_get_usage(struct volume_id *id, const char **usage) +{ + if (id == NULL) + return -EINVAL; + if (usage == NULL) + return -EINVAL; + if (id->usage_id == VOLUME_ID_UNUSED) + return 0; + + *usage = id->usage; + return 1; +} + +int volume_id_get_type(struct volume_id *id, const char **type) +{ + if (id == NULL) + return -EINVAL; + if (type == NULL) + return -EINVAL; + if (id->usage_id == VOLUME_ID_UNUSED) + return 0; + + *type = id->type; + return 1; +} + +int volume_id_get_type_version(struct volume_id *id, const char **type_version) +{ + if (id == NULL) + return -EINVAL; + if (type_version == NULL) + return -EINVAL; + if (id->usage_id == VOLUME_ID_UNUSED) + return 0; + + *type_version = id->type_version; + return 1; +} + int volume_id_probe_raid(struct volume_id *id, uint64_t off, uint64_t size) { if (id == NULL)