aboutsummaryrefslogtreecommitdiff
path: root/util-linux/volume_id/volume_id_internal.h
blob: 5a38562f416935c9e6965929e03e32d21184325c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
/*
 * 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"


#define dbg(...) ((void)0)


/* 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,
};

struct volume_id_partition {
	enum		volume_id_usage usage_id;
	const char	*usage;
	const char	*type;
	uint64_t	off;
	uint64_t	len;
	uint8_t		partition_type_raw;
};

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;
	char		uuid[VOLUME_ID_UUID_SIZE+1];
	enum		volume_id_usage usage_id;
	const char	*usage;
	const char	*type;
	char		type_version[VOLUME_ID_FORMAT_SIZE];

	struct volume_id_partition *partitions;
	size_t		partition_count;

	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);