1/* 2 * volume_id - reads filesystem label and uuid 3 * 4 * Copyright (C) 2005-2006 Kay Sievers <kay.sievers@vrfy.org> 5 * 6 * This program is free software; you can redistribute it and/or modify it 7 * under the terms of the GNU General Public License as published by the 8 * Free Software Foundation version 2 of the License. 9 */ 10 11#ifndef _VOLUME_ID_UTIL_ 12#define _VOLUME_ID_UTIL_ 13 14#ifndef _GNU_SOURCE 15#define _GNU_SOURCE 1 16#endif 17 18#ifdef HAVE_CONFIG_H 19# include <config.h> 20#endif 21 22#include <endian.h> 23#include <byteswap.h> 24#include <syslog.h> 25 26#define ALLOWED_CHARS "#+-.:=@_" 27 28#ifndef PACKED 29#define PACKED __attribute__((packed)) 30#endif 31 32#define err(format, arg...) volume_id_log_fn(LOG_ERR, __FILE__, __LINE__, format, ##arg) 33#define info(format, arg...) volume_id_log_fn(LOG_INFO, __FILE__, __LINE__, format, ##arg) 34#ifdef DEBUG 35#define dbg(format, arg...) volume_id_log_fn(LOG_DEBUG, __FILE__, __LINE__, format, ##arg) 36#else 37#define dbg(format, arg...) do { } while (0) 38#endif 39 40/* size of superblock buffer, reiserfs block is at 64k */ 41#define SB_BUFFER_SIZE 0x11000 42/* size of seek buffer, FAT cluster is 32k max */ 43#define SEEK_BUFFER_SIZE 0x10000 44 45#ifdef __BYTE_ORDER 46#if (__BYTE_ORDER == __LITTLE_ENDIAN) 47#define le16_to_cpu(x) (x) 48#define le32_to_cpu(x) (x) 49#define le64_to_cpu(x) (x) 50#define be16_to_cpu(x) bswap_16(x) 51#define be32_to_cpu(x) bswap_32(x) 52#define cpu_to_le16(x) (x) 53#define cpu_to_le32(x) (x) 54#define cpu_to_be32(x) bswap_32(x) 55#elif (__BYTE_ORDER == __BIG_ENDIAN) 56#define le16_to_cpu(x) bswap_16(x) 57#define le32_to_cpu(x) bswap_32(x) 58#define le64_to_cpu(x) bswap_64(x) 59#define be16_to_cpu(x) (x) 60#define be32_to_cpu(x) (x) 61#define cpu_to_le16(x) bswap_16(x) 62#define cpu_to_le32(x) bswap_32(x) 63#define cpu_to_be32(x) (x) 64#endif 65#endif /* __BYTE_ORDER */ 66 67enum uuid_format { 68 UUID_STRING, 69 UUID_HEX_STRING, 70 UUID_DCE, 71 UUID_DOS, 72 UUID_64BIT_LE, 73 UUID_64BIT_BE, 74 UUID_FOURINT, 75}; 76 77enum endian { 78 LE = 0, 79 BE = 1 80}; 81 82extern int volume_id_utf8_encoded_valid_unichar(const char *str); 83extern size_t volume_id_set_unicode16(uint8_t *str, size_t len, const uint8_t *buf, enum endian endianess, size_t count); 84extern void volume_id_set_usage(struct volume_id *id, enum volume_id_usage usage_id); 85extern void volume_id_set_label_raw(struct volume_id *id, const uint8_t *buf, size_t count); 86extern void volume_id_set_label_string(struct volume_id *id, const uint8_t *buf, size_t count); 87extern void volume_id_set_label_unicode16(struct volume_id *id, const uint8_t *buf, enum endian endianess, size_t count); 88extern void volume_id_set_uuid(struct volume_id *id, const uint8_t *buf, size_t len, enum uuid_format format); 89extern uint8_t *volume_id_get_buffer(struct volume_id *id, uint64_t off, size_t len); 90extern void volume_id_free_buffer(struct volume_id *id); 91 92#endif /* _VOLUME_ID_UTIL_ */ 93