blob: 759a832e63866a03804251ca52c6cbae62c21be1
1 | /* |
2 | * volume_id - reads filesystem label and uuid |
3 | * |
4 | * Copyright (C) 2005 Kay Sievers <kay.sievers@vrfy.org> |
5 | * |
6 | * This library is free software; you can redistribute it and/or |
7 | * modify it under the terms of the GNU Lesser General Public |
8 | * License as published by the Free Software Foundation; either |
9 | * version 2.1 of the License, or (at your option) any later version. |
10 | * |
11 | * This library is distributed in the hope that it will be useful, |
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
14 | * Lesser General Public License for more details. |
15 | * |
16 | * You should have received a copy of the GNU Lesser General Public |
17 | * License along with this library; if not, write to the Free Software |
18 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
19 | */ |
20 | |
21 | #include "libbb.h" |
22 | #include "volume_id.h" |
23 | |
24 | PUSH_AND_SET_FUNCTION_VISIBILITY_TO_HIDDEN |
25 | |
26 | #define dbg(...) ((void)0) |
27 | /* #define dbg(...) bb_error_msg(__VA_ARGS__) */ |
28 | |
29 | /* volume_id.h */ |
30 | |
31 | #define VOLUME_ID_VERSION 48 |
32 | |
33 | #define VOLUME_ID_LABEL_SIZE 64 |
34 | #define VOLUME_ID_UUID_SIZE 36 |
35 | #define VOLUME_ID_FORMAT_SIZE 32 |
36 | #define VOLUME_ID_PARTITIONS_MAX 256 |
37 | |
38 | enum volume_id_usage { |
39 | VOLUME_ID_UNUSED, |
40 | VOLUME_ID_UNPROBED, |
41 | VOLUME_ID_OTHER, |
42 | VOLUME_ID_FILESYSTEM, |
43 | VOLUME_ID_PARTITIONTABLE, |
44 | VOLUME_ID_RAID, |
45 | VOLUME_ID_DISKLABEL, |
46 | VOLUME_ID_CRYPTO, |
47 | }; |
48 | |
49 | #ifdef UNUSED_PARTITION_CODE |
50 | struct volume_id_partition { |
51 | // const char *type; |
52 | // const char *usage; |
53 | // smallint usage_id; |
54 | // uint8_t pt_type_raw; |
55 | // uint64_t pt_off; |
56 | // uint64_t pt_len; |
57 | }; |
58 | #endif |
59 | |
60 | struct volume_id { |
61 | int fd; |
62 | // int fd_close:1; |
63 | int error; |
64 | size_t sbbuf_len; |
65 | size_t seekbuf_len; |
66 | uint8_t *sbbuf; |
67 | uint8_t *seekbuf; |
68 | uint64_t seekbuf_off; |
69 | #ifdef UNUSED_PARTITION_CODE |
70 | struct volume_id_partition *partitions; |
71 | size_t partition_count; |
72 | #endif |
73 | // uint8_t label_raw[VOLUME_ID_LABEL_SIZE]; |
74 | // size_t label_raw_len; |
75 | char label[VOLUME_ID_LABEL_SIZE+1]; |
76 | // uint8_t uuid_raw[VOLUME_ID_UUID_SIZE]; |
77 | // size_t uuid_raw_len; |
78 | /* uuid is stored in ASCII (not binary) form here: */ |
79 | char uuid[VOLUME_ID_UUID_SIZE+1]; |
80 | // char type_version[VOLUME_ID_FORMAT_SIZE]; |
81 | // smallint usage_id; |
82 | // const char *usage; |
83 | #if ENABLE_FEATURE_BLKID_TYPE |
84 | const char *type; |
85 | #endif |
86 | }; |
87 | |
88 | struct volume_id* FAST_FUNC volume_id_open_node(int fd); |
89 | int FAST_FUNC volume_id_probe_all(struct volume_id *id, /*uint64_t off,*/ uint64_t size); |
90 | void FAST_FUNC free_volume_id(struct volume_id *id); |
91 | |
92 | /* util.h */ |
93 | |
94 | /* size of superblock buffer, reiserfs block is at 64k */ |
95 | #define SB_BUFFER_SIZE 0x11000 |
96 | /* size of seek buffer, FAT cluster is 32k max */ |
97 | #define SEEK_BUFFER_SIZE 0x10000 |
98 | |
99 | #if BB_LITTLE_ENDIAN |
100 | # define le16_to_cpu(x) (uint16_t)(x) |
101 | # define le32_to_cpu(x) (uint32_t)(x) |
102 | # define le64_to_cpu(x) (uint64_t)(x) |
103 | # define be16_to_cpu(x) (uint16_t)(bswap_16(x)) |
104 | # define be32_to_cpu(x) (uint32_t)(bswap_32(x)) |
105 | # define cpu_to_le16(x) (uint16_t)(x) |
106 | # define cpu_to_le32(x) (uint32_t)(x) |
107 | # define cpu_to_be32(x) (uint32_t)(bswap_32(x)) |
108 | #else |
109 | # define le16_to_cpu(x) (uint16_t)(bswap_16(x)) |
110 | # define le32_to_cpu(x) (uint32_t)(bswap_32(x)) |
111 | # define le64_to_cpu(x) (uint64_t)(bb_bswap_64(x)) |
112 | # define be16_to_cpu(x) (uint16_t)(x) |
113 | # define be32_to_cpu(x) (uint32_t)(x) |
114 | # define cpu_to_le16(x) (uint16_t)(bswap_16(x)) |
115 | # define cpu_to_le32(x) (uint32_t)(bswap_32(x)) |
116 | # define cpu_to_be32(x) (uint32_t)(x) |
117 | #endif |
118 | |
119 | /* volume_id_set_uuid(id,buf,fmt) assumes size of uuid buf |
120 | * by shifting: 4 << fmt, except for fmt == UUID_DCE_STRING. |
121 | * The constants below should match sizes. |
122 | */ |
123 | enum uuid_format { |
124 | UUID_DOS = 0, /* 4 bytes */ |
125 | UUID_NTFS = 1, /* 8 bytes */ |
126 | UUID_DCE = 2, /* 16 bytes */ |
127 | UUID_DCE_STRING = 3, /* 36 bytes (VOLUME_ID_UUID_SIZE) */ |
128 | }; |
129 | |
130 | enum endian { |
131 | LE = 0, |
132 | BE = 1 |
133 | }; |
134 | |
135 | void volume_id_set_unicode16(char *str, size_t len, const uint8_t *buf, enum endian endianess, size_t count); |
136 | //void volume_id_set_usage(struct volume_id *id, enum volume_id_usage usage_id); |
137 | //void volume_id_set_usage_part(struct volume_id_partition *part, enum volume_id_usage usage_id); |
138 | //void volume_id_set_label_raw(struct volume_id *id, const uint8_t *buf, size_t count); |
139 | void volume_id_set_label_string(struct volume_id *id, const uint8_t *buf, size_t count); |
140 | void volume_id_set_label_unicode16(struct volume_id *id, const uint8_t *buf, enum endian endianess, size_t count); |
141 | void volume_id_set_uuid(struct volume_id *id, const uint8_t *buf, enum uuid_format format); |
142 | void *volume_id_get_buffer(struct volume_id *id, uint64_t off, size_t len); |
143 | void volume_id_free_buffer(struct volume_id *id); |
144 | |
145 | |
146 | /* Probe routines */ |
147 | |
148 | /* RAID */ |
149 | |
150 | //int FAST_FUNC volume_id_probe_highpoint_37x_raid(struct volume_id *id /*,uint64_t off*/); |
151 | //int FAST_FUNC volume_id_probe_highpoint_45x_raid(struct volume_id *id /*,uint64_t off*/, uint64_t size); |
152 | |
153 | //int FAST_FUNC volume_id_probe_intel_software_raid(struct volume_id *id /*,uint64_t off*/, uint64_t size); |
154 | |
155 | int FAST_FUNC volume_id_probe_linux_raid(struct volume_id *id /*,uint64_t off*/, uint64_t size); |
156 | |
157 | //int FAST_FUNC volume_id_probe_lsi_mega_raid(struct volume_id *id /*,uint64_t off*/, uint64_t size); |
158 | |
159 | //int FAST_FUNC volume_id_probe_nvidia_raid(struct volume_id *id /*,uint64_t off*/, uint64_t size); |
160 | |
161 | //int FAST_FUNC volume_id_probe_promise_fasttrack_raid(struct volume_id *id /*,uint64_t off*/, uint64_t size); |
162 | |
163 | //int FAST_FUNC volume_id_probe_silicon_medley_raid(struct volume_id *id /*,uint64_t off*/, uint64_t size); |
164 | |
165 | //int FAST_FUNC volume_id_probe_via_raid(struct volume_id *id /*,uint64_t off*/, uint64_t size); |
166 | |
167 | //int FAST_FUNC volume_id_probe_lvm1(struct volume_id *id /*,uint64_t off*/); |
168 | //int FAST_FUNC volume_id_probe_lvm2(struct volume_id *id /*,uint64_t off*/); |
169 | |
170 | /* FS */ |
171 | |
172 | int FAST_FUNC volume_id_probe_bcache(struct volume_id *id /*,uint64_t off*/); |
173 | |
174 | int FAST_FUNC volume_id_probe_btrfs(struct volume_id *id /*,uint64_t off*/); |
175 | |
176 | int FAST_FUNC volume_id_probe_cramfs(struct volume_id *id /*,uint64_t off*/); |
177 | |
178 | int FAST_FUNC volume_id_probe_ext(struct volume_id *id /*,uint64_t off*/); |
179 | |
180 | int FAST_FUNC volume_id_probe_vfat(struct volume_id *id /*,uint64_t off*/); |
181 | |
182 | int FAST_FUNC volume_id_probe_hfs_hfsplus(struct volume_id *id /*,uint64_t off*/); |
183 | |
184 | //int FAST_FUNC volume_id_probe_hpfs(struct volume_id *id /*,uint64_t off*/); |
185 | |
186 | int FAST_FUNC volume_id_probe_iso9660(struct volume_id *id /*,uint64_t off*/); |
187 | |
188 | int FAST_FUNC volume_id_probe_jfs(struct volume_id *id /*,uint64_t off*/); |
189 | |
190 | int FAST_FUNC volume_id_probe_linux_swap(struct volume_id *id /*,uint64_t off*/); |
191 | |
192 | int FAST_FUNC volume_id_probe_luks(struct volume_id *id /*,uint64_t off*/); |
193 | |
194 | //int FAST_FUNC volume_id_probe_mac_partition_map(struct volume_id *id /*,uint64_t off*/); |
195 | |
196 | //int FAST_FUNC volume_id_probe_minix(struct volume_id *id /*,uint64_t off*/); |
197 | |
198 | //int FAST_FUNC volume_id_probe_msdos_part_table(struct volume_id *id /*,uint64_t off*/); |
199 | |
200 | int FAST_FUNC volume_id_probe_f2fs(struct volume_id *id /*,uint64_t off*/); |
201 | |
202 | int FAST_FUNC volume_id_probe_nilfs(struct volume_id *id /*,uint64_t off*/); |
203 | |
204 | int FAST_FUNC volume_id_probe_ntfs(struct volume_id *id /*,uint64_t off*/); |
205 | |
206 | int FAST_FUNC volume_id_probe_exfat(struct volume_id *id /*,uint64_t off*/); |
207 | |
208 | int FAST_FUNC volume_id_probe_ocfs2(struct volume_id *id /*,uint64_t off*/); |
209 | |
210 | int FAST_FUNC volume_id_probe_reiserfs(struct volume_id *id /*,uint64_t off*/); |
211 | |
212 | int FAST_FUNC volume_id_probe_romfs(struct volume_id *id /*,uint64_t off*/); |
213 | |
214 | int FAST_FUNC volume_id_probe_squashfs(struct volume_id *id /*,uint64_t off*/); |
215 | |
216 | int FAST_FUNC volume_id_probe_sysv(struct volume_id *id /*,uint64_t off*/); |
217 | |
218 | int FAST_FUNC volume_id_probe_udf(struct volume_id *id /*,uint64_t off*/); |
219 | |
220 | //int FAST_FUNC volume_id_probe_ufs(struct volume_id *id /*,uint64_t off*/); |
221 | |
222 | int FAST_FUNC volume_id_probe_xfs(struct volume_id *id /*,uint64_t off*/); |
223 | |
224 | int FAST_FUNC volume_id_probe_ubifs(struct volume_id *id /*,uint64_t off*/); |
225 | |
226 | POP_SAVED_FUNCTION_VISIBILITY |
227 |