1730d5a851fd8d8d39497e1dbb334baa583816c61Brad Conroy/* blkid.c - Prints type, label and UUID of filesystem(s). 2730d5a851fd8d8d39497e1dbb334baa583816c61Brad Conroy * 3730d5a851fd8d8d39497e1dbb334baa583816c61Brad Conroy * Copyright 2013 Brad Conroy <bconroy@uis.edu> 4730d5a851fd8d8d39497e1dbb334baa583816c61Brad Conroy * 5730d5a851fd8d8d39497e1dbb334baa583816c61Brad Conroy * See ftp://ftp.kernel.org/pub/linux/utils/util-linux/v2.24/libblkid-docs/api-index-full.html 6730d5a851fd8d8d39497e1dbb334baa583816c61Brad Conroy 71203ddf0e1110a107cbabf4855e07055fabe1e42Rob LandleyUSE_BLKID(NEWTOY(blkid, 0, TOYFLAG_BIN)) 8bce0e002dc5d25ae109e0b72da071986f211cf9cRob LandleyUSE_FSTYPE(NEWTOY(fstype, "<1", TOYFLAG_BIN)) 9730d5a851fd8d8d39497e1dbb334baa583816c61Brad Conroy 10730d5a851fd8d8d39497e1dbb334baa583816c61Brad Conroyconfig BLKID 11730d5a851fd8d8d39497e1dbb334baa583816c61Brad Conroy bool "blkid" 1203c1b0b202dd4179d472497b08667fad8d4c4530Rob Landley default y 13730d5a851fd8d8d39497e1dbb334baa583816c61Brad Conroy help 14bce0e002dc5d25ae109e0b72da071986f211cf9cRob Landley usage: blkid DEV... 15314f19e4d2099eb19824df49d71953946486f78fRob Landley 16bce0e002dc5d25ae109e0b72da071986f211cf9cRob Landley Prints type, label and UUID of filesystem on a block device or image. 17bce0e002dc5d25ae109e0b72da071986f211cf9cRob Landley 18bce0e002dc5d25ae109e0b72da071986f211cf9cRob Landleyconfig FSTYPE 19bce0e002dc5d25ae109e0b72da071986f211cf9cRob Landley bool "fstype" 20bce0e002dc5d25ae109e0b72da071986f211cf9cRob Landley default y 21bce0e002dc5d25ae109e0b72da071986f211cf9cRob Landley help 22bce0e002dc5d25ae109e0b72da071986f211cf9cRob Landley usage: fstype DEV... 23bce0e002dc5d25ae109e0b72da071986f211cf9cRob Landley 24bce0e002dc5d25ae109e0b72da071986f211cf9cRob Landley Prints type of filesystem on a block device or image. 25730d5a851fd8d8d39497e1dbb334baa583816c61Brad Conroy*/ 26907d423f0093b0e31ce103fa7b86348431affb9bRob Landley 27730d5a851fd8d8d39497e1dbb334baa583816c61Brad Conroy#define FOR_blkid 28730d5a851fd8d8d39497e1dbb334baa583816c61Brad Conroy#include "toys.h" 29730d5a851fd8d8d39497e1dbb334baa583816c61Brad Conroy 30ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landleystruct fstype { 31ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley char *name; 32ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley uint64_t magic; 33ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley int magic_len, magic_offset, uuid_off, label_len, label_off; 34907d423f0093b0e31ce103fa7b86348431affb9bRob Landley}; 35730d5a851fd8d8d39497e1dbb334baa583816c61Brad Conroy 36ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landleystatic const struct fstype fstypes[] = { 37bce0e002dc5d25ae109e0b72da071986f211cf9cRob Landley {"ext2", 0xEF53, 2, 1080, 1128, 16, 1144}, // keep this first for ext3/4 check 382a3ac1459f857f17e1c273c49a8df000b14fc8dbRob Landley {"swap", 0x4341505350415753LL, 8, 4086, 1036, 15, 1052}, 39bce0e002dc5d25ae109e0b72da071986f211cf9cRob Landley // NTFS label actually 8/16 0x4d80 but horrible: 16 bit wide characters via 40ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley // codepage, something called a uuid that's only 8 bytes long... 41ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley {"ntfs", 0x5346544e, 4, 3, 0x48+(8<<24), 0, 0}, 42ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley 43ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley {"adfs", 0xadf5, 2, 0xc00, 0,0,0}, 44ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley {"bfs", 0x1badface, 4, 0, 0,0,0}, 45ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley {"btrfs", 0x4D5F53665248425FULL, 8, 65600, 65803, 256, 65819}, 46ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley {"cramfs", 0x28cd3d45, 4, 0, 0, 16, 48}, 47ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley {"f2fs", 0xF2F52010, 4, 1024, 1132, 16, 1110}, 48ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley {"jfs", 0x3153464a, 4, 32768, 32920, 16, 32904}, 49ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley {"nilfs", 0x3434, 2, 1030, 1176, 80, 1192}, 500cae7298fffccbd84e9d06e2d73dce9ed66a9c67Rob Landley {"reiserfs", 0x724573496552ULL, 6, 8244, 8276, 16, 8292}, 51acf34f524d28fc51ac06dae6a1a6948d3e26bb68Rob Landley {"reiserfs", 0x724573496552ULL, 6, 65588, 65620, 16, 65636}, 52ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley {"romfs", 0x2d6d6f72, 4, 0, 0,0,0}, 53ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley {"squashfs", 0x73717368, 4, 0, 0,0,0}, 54ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley {"xiafs", 0x012fd16d, 4, 572, 0,0,0}, 55ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley {"xfs", 0x42534658, 4, 0, 32, 12, 108}, 560cae7298fffccbd84e9d06e2d73dce9ed66a9c67Rob Landley {"vfat", 0x3233544146ULL, 5, 82, 67+(4<<24), 11, 71}, // fat32 57ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley {"vfat", 0x31544146, 4, 54, 39+(4<<24), 11, 43} // fat1 58ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley}; 59730d5a851fd8d8d39497e1dbb334baa583816c61Brad Conroy 607a3f53ba446ae2600763ee37b7f8dcc91de3ec5fRob Landleystatic void do_blkid(int fd, char *name) 61907d423f0093b0e31ce103fa7b86348431affb9bRob Landley{ 625a7b147c18e0550536f888d531dea73696336902Rob Landley int off, i, j, len; 63ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley char *type; 64ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley 65ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley off = i = 0; 66ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley 67ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley for (;;) { 685a7b147c18e0550536f888d531dea73696336902Rob Landley int pass = 0; 69ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley 70ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley // Read next block of data 71ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley len = readall(fd, toybuf, sizeof(toybuf)); 72ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley if (len != sizeof(toybuf)) return; 73ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley 74ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley // Iterate through types in range 75ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley for (i=0; i < sizeof(fstypes)/sizeof(struct fstype); i++) { 76ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley uint64_t test; 77ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley 78ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley // Skip tests not in this 4k block 79ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley if (fstypes[i].magic_offset > off+sizeof(toybuf)) { 80ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley pass++; 81ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley continue; 82ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley } 83ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley if (fstypes[i].magic_offset < off) continue; 84ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley 85ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley // Populate 64 bit little endian magic value 86ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley test = 0; 87ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley for (j = 0; j < fstypes[i].magic_len; j++) 88ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley test += ((uint64_t)toybuf[j+fstypes[i].magic_offset-off])<<(8*j); 89ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley if (test == fstypes[i].magic) break; 90907d423f0093b0e31ce103fa7b86348431affb9bRob Landley } 91907d423f0093b0e31ce103fa7b86348431affb9bRob Landley 921203ddf0e1110a107cbabf4855e07055fabe1e42Rob Landley if (i == ARRAY_LEN(fstypes)) { 93ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley off += len; 94ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley if (pass) continue; 95ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley return; 96ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley } 97ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley break; 98ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley } 99ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley 100ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley // distinguish ext2/3/4 101ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley type = fstypes[i].name; 102ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley if (!i) { 103ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley if (toybuf[1116]&4) type = "ext3"; 104ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley if (toybuf[1120]&64) type = "ext4"; 105ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley } 106ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley 107ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley // Could special case NTFS here... 108ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley 109ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley // Output for fstype 110ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley if (*toys.which->name == 'f') { 111ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley puts(type); 112ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley return; 113ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley } 114ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley 115ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley // output for blkid 116ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley printf("%s:",name); 117ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley 118c23186d3ee6001b78c843fc3609575306c687ba2Samuel Holland if (fstypes[i].label_len) { 1195a7b147c18e0550536f888d531dea73696336902Rob Landley char *s = toybuf+fstypes[i].label_off-off;; 1205a7b147c18e0550536f888d531dea73696336902Rob Landley 1215a7b147c18e0550536f888d531dea73696336902Rob Landley len = fstypes[i].label_len; 1225a7b147c18e0550536f888d531dea73696336902Rob Landley if (!strcmp(type, "vfat")) { 1235a7b147c18e0550536f888d531dea73696336902Rob Landley while (len && s[len-1]==' ') len--; 1245a7b147c18e0550536f888d531dea73696336902Rob Landley if (strstart(&s, "NO NAME")) len=0; 125c23186d3ee6001b78c843fc3609575306c687ba2Samuel Holland } 1265a7b147c18e0550536f888d531dea73696336902Rob Landley if (len) printf(" LABEL=\"%.*s\"", len, s); 127c23186d3ee6001b78c843fc3609575306c687ba2Samuel Holland } 128ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley 129ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley if (fstypes[i].uuid_off) { 130ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley int bits = 0x550, size = fstypes[i].uuid_off >> 24, 131ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley uoff = (fstypes[i].uuid_off & ((1<<24)-1))-off; 132ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley 133ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley if (size) bits = 4*(size == 4); 134ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley else size = 16; 135ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley 136ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley printf(" UUID=\""); 137ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley for (j = 0; j < size; j++) printf("-%02x"+!(bits & (1<<j)), toybuf[uoff+j]); 138ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley printf("\""); 139ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley } 140ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley 141bce0e002dc5d25ae109e0b72da071986f211cf9cRob Landley printf(" TYPE=\"%s\"\n", type); 142730d5a851fd8d8d39497e1dbb334baa583816c61Brad Conroy} 143730d5a851fd8d8d39497e1dbb334baa583816c61Brad Conroy 144730d5a851fd8d8d39497e1dbb334baa583816c61Brad Conroyvoid blkid_main(void) 145730d5a851fd8d8d39497e1dbb334baa583816c61Brad Conroy{ 1461203ddf0e1110a107cbabf4855e07055fabe1e42Rob Landley if (*toys.optargs) loopfiles(toys.optargs, do_blkid); 1471203ddf0e1110a107cbabf4855e07055fabe1e42Rob Landley else { 1481203ddf0e1110a107cbabf4855e07055fabe1e42Rob Landley unsigned int ma, mi, sz, fd; 1491203ddf0e1110a107cbabf4855e07055fabe1e42Rob Landley char *name = toybuf, *buffer = toybuf+1024, device[32]; 1501203ddf0e1110a107cbabf4855e07055fabe1e42Rob Landley FILE *fp = xfopen("/proc/partitions", "r"); 1511203ddf0e1110a107cbabf4855e07055fabe1e42Rob Landley 1521203ddf0e1110a107cbabf4855e07055fabe1e42Rob Landley while (fgets(buffer, 1024, fp)) { 1531203ddf0e1110a107cbabf4855e07055fabe1e42Rob Landley *name = 0; 1541203ddf0e1110a107cbabf4855e07055fabe1e42Rob Landley if (sscanf(buffer, " %u %u %u %[^\n ]", &ma, &mi, &sz, name) != 4) 1551203ddf0e1110a107cbabf4855e07055fabe1e42Rob Landley continue; 1561203ddf0e1110a107cbabf4855e07055fabe1e42Rob Landley 1571203ddf0e1110a107cbabf4855e07055fabe1e42Rob Landley sprintf(device, "/dev/%.20s", name); 1581203ddf0e1110a107cbabf4855e07055fabe1e42Rob Landley if (-1 == (fd = open(device, O_RDONLY))) { 159d3a435e53c94ec25b4ae5fa2614f49ef8884e08aRob Landley if (errno != ENOMEDIUM) perror_msg_raw(device); 1601203ddf0e1110a107cbabf4855e07055fabe1e42Rob Landley } else { 1611203ddf0e1110a107cbabf4855e07055fabe1e42Rob Landley do_blkid(fd, device); 1621203ddf0e1110a107cbabf4855e07055fabe1e42Rob Landley close(fd); 1631203ddf0e1110a107cbabf4855e07055fabe1e42Rob Landley } 1641203ddf0e1110a107cbabf4855e07055fabe1e42Rob Landley } 1651203ddf0e1110a107cbabf4855e07055fabe1e42Rob Landley if (CFG_TOYBOX_FREE) fclose(fp); 1661203ddf0e1110a107cbabf4855e07055fabe1e42Rob Landley } 167730d5a851fd8d8d39497e1dbb334baa583816c61Brad Conroy} 168bce0e002dc5d25ae109e0b72da071986f211cf9cRob Landley 169bce0e002dc5d25ae109e0b72da071986f211cf9cRob Landleyvoid fstype_main(void) 170bce0e002dc5d25ae109e0b72da071986f211cf9cRob Landley{ 17142b7d4b06b55e0090c3be1bc6ca1ed166bd6b2fdDima Krasner loopfiles(toys.optargs, do_blkid); 172bce0e002dc5d25ae109e0b72da071986f211cf9cRob Landley} 173