Mercurial > hg > toybox
annotate toys/other/blkid.c @ 1613:96aa7ec74936 draft
Fix yet another sed bug.
The s/// command would copy the \ of substitutions before deciding what to
do with them (generally overwriting the \ with the new data). When the
substitution was A) at the very end of the new string, B) resolved to nothing,
it could leave a trailing \ that didn't belong there and didn't get overwritten
because the "copy trailing data" part that copies the original string's null
terminator already happened before the \ overwrote it.
The ghostwheel() function restarts regexes after embedded NUL bytes, but
if the string it's passed is _longer_ than the length it's told then it
gets confused (and it means we're off the end of our allocation so segfaults
are likely).
Fix: test for \ first and move the "copy byte" logic into an else case.
author | Rob Landley <rob@landley.net> |
---|---|
date | Mon, 15 Dec 2014 03:34:55 -0600 |
parents | fc1bb49e58a9 |
children | 21867cda5e41 |
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...] |
1333
fc1bb49e58a9
Help text should have a blank line after usage: lines, and a couple other whitespace tweaks.
Rob Landley <rob@landley.net>
parents:
1137
diff
changeset
|
15 |
1086
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
16 Prints type, label and UUID of filesystem. |
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 |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
19 #define FOR_blkid |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
20 #include "toys.h" |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
21 |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
22 struct fstype { |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
23 char *name; |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
24 uint64_t magic; |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
25 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
|
26 }; |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
27 |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
28 static const struct fstype fstypes[] = { |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
29 // ext3 = buf[1116]&4 ext4 = buf[1120]&64 |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
30 {"ext2", 0xEF53, 2, 1080, 1128, 16, 1144}, |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
31 // 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
|
32 // 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
|
33 {"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
|
34 |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
35 {"adfs", 0xadf5, 2, 0xc00, 0,0,0}, |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
36 {"bfs", 0x1badface, 4, 0, 0,0,0}, |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
37 {"btrfs", 0x4D5F53665248425FULL, 8, 65600, 65803, 256, 65819}, |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
38 {"cramfs", 0x28cd3d45, 4, 0, 0, 16, 48}, |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
39 {"f2fs", 0xF2F52010, 4, 1024, 1132, 16, 1110}, |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
40 {"jfs", 0x3153464a, 4, 32768, 32920, 16, 32904}, |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
41 {"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
|
42 {"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
|
43 {"reiserfs", 0x724573496552ULL, 6, 65588, 65620, 16, 65536}, |
1086
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
44 {"romfs", 0x2d6d6f72, 4, 0, 0,0,0}, |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
45 {"squashfs", 0x73717368, 4, 0, 0,0,0}, |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
46 {"xiafs", 0x012fd16d, 4, 572, 0,0,0}, |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
47 {"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
|
48 {"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
|
49 {"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
|
50 }; |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
51 |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
52 /* TODO if no args use proc/partitions */ |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
53 void do_blkid(int fd, char *name) |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
54 { |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
55 int off, i, j; |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
56 char *type; |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
57 |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
58 off = i = 0; |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
59 |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
60 for (;;) { |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
61 int pass = 0, len; |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
62 |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
63 // Read next block of data |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
64 len = readall(fd, toybuf, sizeof(toybuf)); |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
65 if (len != sizeof(toybuf)) return; |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
66 |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
67 // Iterate through types in range |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
68 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
|
69 uint64_t test; |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
70 |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
71 // Skip tests not in this 4k block |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
72 if (fstypes[i].magic_offset > off+sizeof(toybuf)) { |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
73 pass++; |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
74 continue; |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
75 } |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
76 if (fstypes[i].magic_offset < off) continue; |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
77 |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
78 // Populate 64 bit little endian magic value |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
79 test = 0; |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
80 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
|
81 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
|
82 if (test == fstypes[i].magic) break; |
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 |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
85 if (i == sizeof(fstypes)/sizeof(struct fstype)) { |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
86 off += len; |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
87 if (pass) continue; |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
88 return; |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
89 } |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
90 break; |
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 |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
93 // distinguish ext2/3/4 |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
94 type = fstypes[i].name; |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
95 if (!i) { |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
96 if (toybuf[1116]&4) type = "ext3"; |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
97 if (toybuf[1120]&64) type = "ext4"; |
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 |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
100 // Could special case NTFS here... |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
101 |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
102 // Output for fstype |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
103 if (*toys.which->name == 'f') { |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
104 puts(type); |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
105 return; |
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 |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
108 // output for blkid |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
109 printf("%s:",name); |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
110 |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
111 if (fstypes[i].label_len) |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
112 printf(" LABEL=\"%.*s\"", fstypes[i].label_len, |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
113 toybuf+fstypes[i].label_off-off); |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
114 |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
115 if (fstypes[i].uuid_off) { |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
116 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
|
117 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
|
118 |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
119 if (size) bits = 4*(size == 4); |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
120 else size = 16; |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
121 |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
122 printf(" UUID=\""); |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
123 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
|
124 printf("\""); |
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 |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
127 printf(" TYPE=\"%s\"\n", fstypes[i].name); |
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 |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
130 void blkid_main(void) |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
131 { |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
132 loopfiles(toys.optargs, do_blkid); |
162bb45b0387
Move blkid out of pending, default y.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
133 } |