Mercurial > hg > toybox
annotate toys/other/blkid.c @ 1322:b91284c2e569 draft
Make "losetup /dev/loop0 filename" work.
Sigh. Implement the complex cases and you screw up the simple cases you already tested...
author | Rob Landley <rob@landley.net> |
---|---|
date | Thu, 29 May 2014 06:29:12 -0500 |
parents | 5c51c9639a6f |
children | fc1bb49e58a9 |
rev | line source |
---|---|
1086
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1 /* blkid.c - Prints type, label and UUID of filesystem(s). |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
2 * |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
3 * Copyright 2013 Brad Conroy <bconroy@uis.edu> |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
4 * |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
5 * See ftp://ftp.kernel.org/pub/linux/utils/util-linux/v2.24/libblkid-docs/api-index-full.html |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
6 |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
7 USE_BLKID(NEWTOY(blkid, "<1", TOYFLAG_BIN)) |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
8 USE_BLKID(OLDTOY(fstype, blkid, "<1", TOYFLAG_BIN)) |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
9 |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
10 config BLKID |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
11 bool "blkid" |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
12 default y |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
13 help |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
14 usage: blkid [block device...] |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
15 Prints type, label and UUID of filesystem. |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
16 */ |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
17 |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
18 #define FOR_blkid |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
19 #include "toys.h" |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
20 |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
21 struct fstype { |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
22 char *name; |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
23 uint64_t magic; |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
24 int magic_len, magic_offset, uuid_off, label_len, label_off; |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
25 }; |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
26 |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
27 static const struct fstype fstypes[] = { |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
28 // ext3 = buf[1116]&4 ext4 = buf[1120]&64 |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
29 {"ext2", 0xEF53, 2, 1080, 1128, 16, 1144}, |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
30 // label actually 8/16 0x4d80 but horrible: 16 bit wide characters via |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
31 // codepage, something called a uuid that's only 8 bytes long... |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
32 {"ntfs", 0x5346544e, 4, 3, 0x48+(8<<24), 0, 0}, |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
33 |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
34 {"adfs", 0xadf5, 2, 0xc00, 0,0,0}, |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
35 {"bfs", 0x1badface, 4, 0, 0,0,0}, |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
36 {"btrfs", 0x4D5F53665248425FULL, 8, 65600, 65803, 256, 65819}, |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
37 {"cramfs", 0x28cd3d45, 4, 0, 0, 16, 48}, |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
38 {"f2fs", 0xF2F52010, 4, 1024, 1132, 16, 1110}, |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
39 {"jfs", 0x3153464a, 4, 32768, 32920, 16, 32904}, |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
40 {"nilfs", 0x3434, 2, 1030, 1176, 80, 1192}, |
1137
5c51c9639a6f
When building for 32-bit, the compiler can't figure out that a constant too big to fit in a long isn't trying to unless you explicitly postfix the constant with the type of the varable it's being assigned into.
Rob Landley <rob@landley.net>
parents:
1122
diff
changeset
|
41 {"reiserfs", 0x724573496552ULL, 6, 8244, 8276, 16, 8292}, |
5c51c9639a6f
When building for 32-bit, the compiler can't figure out that a constant too big to fit in a long isn't trying to unless you explicitly postfix the constant with the type of the varable it's being assigned into.
Rob Landley <rob@landley.net>
parents:
1122
diff
changeset
|
42 {"reiserfs", 0x724573496552ULL, 6, 65588, 65620, 16, 65536}, |
1086
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
43 {"romfs", 0x2d6d6f72, 4, 0, 0,0,0}, |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
44 {"squashfs", 0x73717368, 4, 0, 0,0,0}, |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
45 {"xiafs", 0x012fd16d, 4, 572, 0,0,0}, |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
46 {"xfs", 0x42534658, 4, 0, 32, 12, 108}, |
1137
5c51c9639a6f
When building for 32-bit, the compiler can't figure out that a constant too big to fit in a long isn't trying to unless you explicitly postfix the constant with the type of the varable it's being assigned into.
Rob Landley <rob@landley.net>
parents:
1122
diff
changeset
|
47 {"vfat", 0x3233544146ULL, 5, 82, 67+(4<<24), 11, 71}, // fat32 |
1086
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
48 {"vfat", 0x31544146, 4, 54, 39+(4<<24), 11, 43} // fat1 |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
49 }; |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
50 |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
51 /* TODO if no args use proc/partitions */ |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
52 void do_blkid(int fd, char *name) |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
53 { |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
54 int off, i, j; |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
55 char *type; |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
56 |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
57 off = i = 0; |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
58 |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
59 for (;;) { |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
60 int pass = 0, len; |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
61 |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
62 // Read next block of data |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
63 len = readall(fd, toybuf, sizeof(toybuf)); |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
64 if (len != sizeof(toybuf)) return; |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
65 |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
66 // Iterate through types in range |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
67 for (i=0; i < sizeof(fstypes)/sizeof(struct fstype); i++) { |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
68 uint64_t test; |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
69 |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
70 // Skip tests not in this 4k block |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
71 if (fstypes[i].magic_offset > off+sizeof(toybuf)) { |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
72 pass++; |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
73 continue; |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
74 } |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
75 if (fstypes[i].magic_offset < off) continue; |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
76 |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
77 // Populate 64 bit little endian magic value |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
78 test = 0; |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
79 for (j = 0; j < fstypes[i].magic_len; j++) |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
80 test += ((uint64_t)toybuf[j+fstypes[i].magic_offset-off])<<(8*j); |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
81 if (test == fstypes[i].magic) break; |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
82 } |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
83 |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
84 if (i == sizeof(fstypes)/sizeof(struct fstype)) { |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
85 off += len; |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
86 if (pass) continue; |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
87 return; |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
88 } |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
89 break; |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
90 } |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
91 |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
92 // distinguish ext2/3/4 |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
93 type = fstypes[i].name; |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
94 if (!i) { |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
95 if (toybuf[1116]&4) type = "ext3"; |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
96 if (toybuf[1120]&64) type = "ext4"; |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
97 } |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
98 |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
99 // Could special case NTFS here... |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
100 |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
101 // Output for fstype |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
102 if (*toys.which->name == 'f') { |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
103 puts(type); |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
104 return; |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
105 } |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
106 |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
107 // output for blkid |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
108 printf("%s:",name); |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
109 |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
110 if (fstypes[i].label_len) |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
111 printf(" LABEL=\"%.*s\"", fstypes[i].label_len, |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
112 toybuf+fstypes[i].label_off-off); |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
113 |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
114 if (fstypes[i].uuid_off) { |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
115 int bits = 0x550, size = fstypes[i].uuid_off >> 24, |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
116 uoff = (fstypes[i].uuid_off & ((1<<24)-1))-off; |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
117 |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
118 if (size) bits = 4*(size == 4); |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
119 else size = 16; |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
120 |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
121 printf(" UUID=\""); |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
122 for (j = 0; j < size; j++) printf("-%02x"+!(bits & (1<<j)), toybuf[uoff+j]); |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
123 printf("\""); |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
124 } |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
125 |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
126 printf(" TYPE=\"%s\"\n", fstypes[i].name); |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
127 } |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
128 |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
129 void blkid_main(void) |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
130 { |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
131 loopfiles(toys.optargs, do_blkid); |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
132 } |