X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=extras%2Fvolume_id%2Flib%2Futil.c;h=ea5ff16e911da69750c709e04bb564bd014dcb9d;hb=14e18278;hp=e71d6208c5aadc325398318752943d882979fd21;hpb=ac877d7cf46e25bd50d17450e74f3b0346a8d5a1;p=elogind.git diff --git a/extras/volume_id/lib/util.c b/extras/volume_id/lib/util.c index e71d6208c..ea5ff16e9 100644 --- a/extras/volume_id/lib/util.c +++ b/extras/volume_id/lib/util.c @@ -3,19 +3,24 @@ * * 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 - * Free Software Foundation version 2 of the License. + * 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 Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * 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. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . */ #ifndef _GNU_SOURCE #define _GNU_SOURCE 1 #endif -#ifdef HAVE_CONFIG_H -# include -#endif - #include #include #include @@ -27,7 +32,6 @@ #include "libvolume_id.h" #include "libvolume_id-private.h" -#include "util.h" /* count of characters used to encode one unicode char */ static int utf8_encoded_expected_len(const char *str) @@ -196,12 +200,8 @@ static char *usage_to_string(enum volume_id_usage usage_id) return "other"; case VOLUME_ID_RAID: return "raid"; - case VOLUME_ID_DISKLABEL: - return "disklabel"; case VOLUME_ID_CRYPTO: return "crypto"; - case VOLUME_ID_UNPROBED: - return "unprobed"; case VOLUME_ID_UNUSED: return "unused"; } @@ -250,14 +250,12 @@ void volume_id_set_label_unicode16(struct volume_id *id, const uint8_t *buf, enu volume_id_set_unicode16((uint8_t *)id->label, sizeof(id->label), buf, endianess, count); } -void volume_id_set_uuid(struct volume_id *id, const uint8_t *buf, size_t len, enum uuid_format format) +static void set_uuid(const uint8_t *buf, size_t len, enum uuid_format format, + char *uuid, uint8_t *uuid_raw, size_t *uuid_raw_len) { unsigned int i; unsigned int count = 0; - if (len > sizeof(id->uuid_raw)) - len = sizeof(id->uuid_raw); - switch(format) { case UUID_STRING: count = len; @@ -281,8 +279,8 @@ void volume_id_set_uuid(struct volume_id *id, const uint8_t *buf, size_t len, en count = 32; break; } - memcpy(id->uuid_raw, buf, count); - id->uuid_raw_len = count; + memcpy(uuid_raw, buf, count); + *uuid_raw_len = count; /* if set, create string in the same format, the native platform uses */ for (i = 0; i < count; i++) @@ -293,16 +291,16 @@ void volume_id_set_uuid(struct volume_id *id, const uint8_t *buf, size_t len, en set: switch(format) { case UUID_DOS: - sprintf(id->uuid, "%02X%02X-%02X%02X", + sprintf(uuid, "%02X%02X-%02X%02X", buf[3], buf[2], buf[1], buf[0]); break; case UUID_64BIT_LE: - sprintf(id->uuid,"%02X%02X%02X%02X%02X%02X%02X%02X", + sprintf(uuid,"%02X%02X%02X%02X%02X%02X%02X%02X", buf[7], buf[6], buf[5], buf[4], buf[3], buf[2], buf[1], buf[0]); break; case UUID_DCE: - sprintf(id->uuid, + sprintf(uuid, "%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x", buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], @@ -312,18 +310,18 @@ set: break; case UUID_HEX_STRING: /* translate A..F to a..f */ - memcpy(id->uuid, buf, count); + memcpy(uuid, buf, count); for (i = 0; i < count; i++) - if (id->uuid[i] >= 'A' && id->uuid[i] <= 'F') - id->uuid[i] = (id->uuid[i] - 'A') + 'a'; - id->uuid[count] = '\0'; + if (uuid[i] >= 'A' && uuid[i] <= 'F') + uuid[i] = (uuid[i] - 'A') + 'a'; + uuid[count] = '\0'; break; case UUID_STRING: - memcpy(id->uuid, buf, count); - id->uuid[count] = '\0'; + memcpy(uuid, buf, count); + uuid[count] = '\0'; break; case UUID_MD: - sprintf(id->uuid, + sprintf(uuid, "%02x%02x%02x%02x:%02x%02x%02x%02x:%02x%02x%02x%02x:%02x%02x%02x%02x", buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6], buf[7], @@ -331,7 +329,7 @@ set: buf[12], buf[13], buf[14],buf[15]); break; case UUID_LVM: - sprintf(id->uuid, + sprintf(uuid, "%c%c%c%c%c%c-%c%c%c%c-%c%c%c%c-%c%c%c%c-%c%c%c%c-%c%c%c%c-%c%c%c%c%c%c", buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6], buf[7], buf[8], buf[9], @@ -344,11 +342,27 @@ set: } } +void volume_id_set_uuid(struct volume_id *id, const uint8_t *buf, size_t len, enum uuid_format format) +{ + if (len > sizeof(id->uuid_raw)) + len = sizeof(id->uuid_raw); + + set_uuid(buf, len, format, id->uuid, id->uuid_raw, &id->uuid_raw_len); +} + +void volume_id_set_uuid_sub(struct volume_id *id, const uint8_t *buf, size_t len, enum uuid_format format) +{ + if (len > sizeof(id->uuid_sub_raw)) + len = sizeof(id->uuid_sub_raw); + + set_uuid(buf, len, format, id->uuid_sub, id->uuid_sub_raw, &id->uuid_sub_raw_len); +} + uint8_t *volume_id_get_buffer(struct volume_id *id, uint64_t off, size_t len) { ssize_t buf_len; - info("get buffer off 0x%llx(%llu), len 0x%zx\n", (unsigned long long) off, (unsigned long long) off, len); + info("get buffer off 0x%" PRIx64 "(%" PRIu64 "), len 0x%zx\n", off, off, len); /* check if requested area fits in superblock buffer */ if (off + len <= SB_BUFFER_SIZE) { if (id->sbbuf == NULL) { @@ -361,7 +375,7 @@ uint8_t *volume_id_get_buffer(struct volume_id *id, uint64_t off, size_t len) /* check if we need to read */ if ((off + len) > id->sbbuf_len) { - info("read sbbuf len:0x%llx\n", (unsigned long long) (off + len)); + info("read sbbuf len:0x%" PRIx64 "\n", (off + len)); if (lseek(id->fd, 0, SEEK_SET) < 0) { dbg("lseek failed (%s)\n", strerror(errno)); return NULL; @@ -397,7 +411,7 @@ uint8_t *volume_id_get_buffer(struct volume_id *id, uint64_t off, size_t len) /* check if we need to read */ if ((off < id->seekbuf_off) || ((off + len) > (id->seekbuf_off + id->seekbuf_len))) { - info("read seekbuf off:0x%llx len:0x%zx\n", (unsigned long long) off, len); + info("read seekbuf off:0x%" PRIx64 " len:0x%zx\n", off, len); if (lseek(id->fd, off, SEEK_SET) < 0) { dbg("lseek failed (%s)\n", strerror(errno)); return NULL;