/*
 * volume_id - reads filesystem label and uuid
 *
 * Copyright (C) 2005 Kay Sievers <kay.sievers@vrfy.org>
 *
 *	This library is free software; you can redistribute it and/or
 *	modify it under the terms of the GNU Lesser General Public
 *	License as published by the Free Software Foundation; either
 *	version 2.1 of the License, or (at your option) any later version.
 *
 *	This library 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
 *	Lesser General Public License for more details.
 *
 *	You should have received a copy of the GNU Lesser General Public
 *	License along with this library; if not, write to the Free Software
 *	Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 */

#include "libbb.h"
#include "volume_id.h"

#if __GNUC_PREREQ(4,1)
# pragma GCC visibility push(hidden)
#endif

#define dbg(...) ((void)0)
/* #define dbg(...) bb_error_msg(__VA_ARGS__) */


/* volume_id.h */

#define VOLUME_ID_VERSION		48

#define VOLUME_ID_LABEL_SIZE		64
#define VOLUME_ID_UUID_SIZE		36
#define VOLUME_ID_FORMAT_SIZE		32
#define VOLUME_ID_PARTITIONS_MAX	256

enum volume_id_usage {
	VOLUME_ID_UNUSED,
	VOLUME_ID_UNPROBED,
	VOLUME_ID_OTHER,
	VOLUME_ID_FILESYSTEM,
	VOLUME_ID_PARTITIONTABLE,
	VOLUME_ID_RAID,
	VOLUME_ID_DISKLABEL,
	VOLUME_ID_CRYPTO,
};

#ifdef UNUSED_PARTITION_CODE
struct volume_id_partition {
//	const char	*type;
//	const char	*usage;
//	smallint	usage_id;
//	uint8_t		pt_type_raw;
//	uint64_t	pt_off;
//	uint64_t	pt_len;
};
#endif

struct volume_id {
//	uint8_t		label_raw[VOLUME_ID_LABEL_SIZE];
//	size_t		label_raw_len;
	char		label[VOLUME_ID_LABEL_SIZE+1];
//	uint8_t		uuid_raw[VOLUME_ID_UUID_SIZE];
//	size_t		uuid_raw_len;
	/* uuid is stored in ASCII (not binary) form here: */
	char		uuid[VOLUME_ID_UUID_SIZE+1];
//	char		type_version[VOLUME_ID_FORMAT_SIZE];
//	smallint	usage_id;
//	const char	*usage;
//	const char	*type;

#ifdef UNUSED_PARTITION_CODE
	struct volume_id_partition *partitions;
	size_t		partition_count;
#endif

	int		fd;
	uint8_t		*sbbuf;
	uint8_t		*seekbuf;
	size_t		sbbuf_len;
	uint64_t	seekbuf_off;
	size_t		seekbuf_len;
//	int		fd_close:1;
};

struct volume_id *volume_id_open_node(const char *path);
int volume_id_probe_all(struct volume_id *id, uint64_t off, uint64_t size);
void free_volume_id(struct volume_id *id);

/* util.h */

/* size of superblock buffer, reiserfs block is at 64k */
#define SB_BUFFER_SIZE				0x11000
/* size of seek buffer, FAT cluster is 32k max */
#define SEEK_BUFFER_SIZE			0x10000

#define bswap16(x) (uint16_t)	( \
				(((uint16_t)(x) & 0x00ffu) << 8) | \
				(((uint16_t)(x) & 0xff00u) >> 8))

#define bswap32(x) (uint32_t)	( \
				(((uint32_t)(x) & 0xff000000u) >> 24) | \
				(((uint32_t)(x) & 0x00ff0000u) >>  8) | \
				(((uint32_t)(x) & 0x0000ff00u) <<  8) | \
				(((uint32_t)(x) & 0x000000ffu) << 24))

#define bswap64(x) (uint64_t)	( \
				(((uint64_t)(x) & 0xff00000000000000ull) >> 56) | \
				(((uint64_t)(x) & 0x00ff000000000000ull) >> 40) | \
				(((uint64_t)(x) & 0x0000ff0000000000ull) >> 24) | \
				(((uint64_t)(x) & 0x000000ff00000000ull) >>  8) | \
				(((uint64_t)(x) & 0x00000000ff000000ull) <<  8) | \
				(((uint64_t)(x) & 0x0000000000ff0000ull) << 24) | \
				(((uint64_t)(x) & 0x000000000000ff00ull) << 40) | \
				(((uint64_t)(x) & 0x00000000000000ffull) << 56))

#if BB_LITTLE_ENDIAN
#define le16_to_cpu(x) (x)
#define le32_to_cpu(x) (x)
#define le64_to_cpu(x) (x)
#define be16_to_cpu(x) bswap16(x)
#define be32_to_cpu(x) bswap32(x)
#define cpu_to_le16(x) (x)
#define cpu_to_le32(x) (x)
#define cpu_to_be32(x) bswap32(x)
#else
#define le16_to_cpu(x) bswap16(x)
#define le32_to_cpu(x) bswap32(x)
#define le64_to_cpu(x) bswap64(x)
#define be16_to_cpu(x) (x)
#define be32_to_cpu(x) (x)
#define cpu_to_le16(x) bswap16(x)
#define cpu_to_le32(x) bswap32(x)
#define cpu_to_be32(x) (x)
#endif

enum uuid_format {
	UUID_DCE_STRING,
	UUID_DCE,
	UUID_DOS,
	UUID_NTFS,
	UUID_HFS,
};

enum endian {
	LE = 0,
	BE = 1
};

void volume_id_set_unicode16(char *str, size_t len, const uint8_t *buf, enum endian endianess, size_t count);
//void volume_id_set_usage(struct volume_id *id, enum volume_id_usage usage_id);
//void volume_id_set_usage_part(struct volume_id_partition *part, enum volume_id_usage usage_id);
//void volume_id_set_label_raw(struct volume_id *id, const uint8_t *buf, size_t count);
void volume_id_set_label_string(struct volume_id *id, const uint8_t *buf, size_t count);
void volume_id_set_label_unicode16(struct volume_id *id, const uint8_t *buf, enum endian endianess, size_t count);
void volume_id_set_uuid(struct volume_id *id, const uint8_t *buf, enum uuid_format format);
void *volume_id_get_buffer(struct volume_id *id, uint64_t off, size_t len);
void volume_id_free_buffer(struct volume_id *id);


/* Probe routines */

/* RAID */

//int volume_id_probe_highpoint_37x_raid(struct volume_id *id, uint64_t off);
//int volume_id_probe_highpoint_45x_raid(struct volume_id *id, uint64_t off, uint64_t size);

//int volume_id_probe_intel_software_raid(struct volume_id *id, uint64_t off, uint64_t size);

int volume_id_probe_linux_raid(struct volume_id *id, uint64_t off, uint64_t size);

//int volume_id_probe_lsi_mega_raid(struct volume_id *id, uint64_t off, uint64_t size);

//int volume_id_probe_nvidia_raid(struct volume_id *id, uint64_t off, uint64_t size);

//int volume_id_probe_promise_fasttrack_raid(struct volume_id *id, uint64_t off, uint64_t size);

//int volume_id_probe_silicon_medley_raid(struct volume_id *id, uint64_t off, uint64_t size);

//int volume_id_probe_via_raid(struct volume_id *id, uint64_t off, uint64_t size);

//int volume_id_probe_lvm1(struct volume_id *id, uint64_t off);
//int volume_id_probe_lvm2(struct volume_id *id, uint64_t off);

/* FS */

int volume_id_probe_cramfs(struct volume_id *id, uint64_t off);

int volume_id_probe_ext(struct volume_id *id, uint64_t off);

int volume_id_probe_vfat(struct volume_id *id, uint64_t off);

int volume_id_probe_hfs_hfsplus(struct volume_id *id, uint64_t off);

//int volume_id_probe_hpfs(struct volume_id *id, uint64_t off);

int volume_id_probe_iso9660(struct volume_id *id, uint64_t off);

int volume_id_probe_jfs(struct volume_id *id, uint64_t off);

int volume_id_probe_linux_swap(struct volume_id *id, uint64_t off);

int volume_id_probe_luks(struct volume_id *id, uint64_t off);

//int volume_id_probe_mac_partition_map(struct volume_id *id, uint64_t off);

//int volume_id_probe_minix(struct volume_id *id, uint64_t off);

//int volume_id_probe_msdos_part_table(struct volume_id *id, uint64_t off);

int volume_id_probe_ntfs(struct volume_id *id, uint64_t off);

int volume_id_probe_ocfs2(struct volume_id *id, uint64_t off);

int volume_id_probe_reiserfs(struct volume_id *id, uint64_t off);

int volume_id_probe_romfs(struct volume_id *id, uint64_t off);

int volume_id_probe_sysv(struct volume_id *id, uint64_t off);

int volume_id_probe_udf(struct volume_id *id, uint64_t off);

//int volume_id_probe_ufs(struct volume_id *id, uint64_t off);

int volume_id_probe_xfs(struct volume_id *id, uint64_t off);

#if __GNUC_PREREQ(4,1)
# pragma GCC visibility pop
#endif
