blkid.c revision 42b7d4b06b55e0090c3be1bc6ca1ed166bd6b2fd
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 742b7d4b06b55e0090c3be1bc6ca1ed166bd6b2fdDima KrasnerUSE_BLKID(NEWTOY(blkid, NULL, 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 3042b7d4b06b55e0090c3be1bc6ca1ed166bd6b2fdDima Krasner#define ONE_K 1024 3142b7d4b06b55e0090c3be1bc6ca1ed166bd6b2fdDima Krasner 32ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landleystruct fstype { 33ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley char *name; 34ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley uint64_t magic; 35ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley int magic_len, magic_offset, uuid_off, label_len, label_off; 36907d423f0093b0e31ce103fa7b86348431affb9bRob Landley}; 37730d5a851fd8d8d39497e1dbb334baa583816c61Brad Conroy 38ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landleystatic const struct fstype fstypes[] = { 39bce0e002dc5d25ae109e0b72da071986f211cf9cRob Landley {"ext2", 0xEF53, 2, 1080, 1128, 16, 1144}, // keep this first for ext3/4 check 40bce0e002dc5d25ae109e0b72da071986f211cf9cRob Landley // NTFS label actually 8/16 0x4d80 but horrible: 16 bit wide characters via 41ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley // codepage, something called a uuid that's only 8 bytes long... 42ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley {"ntfs", 0x5346544e, 4, 3, 0x48+(8<<24), 0, 0}, 43ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley 44ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley {"adfs", 0xadf5, 2, 0xc00, 0,0,0}, 45ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley {"bfs", 0x1badface, 4, 0, 0,0,0}, 46ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley {"btrfs", 0x4D5F53665248425FULL, 8, 65600, 65803, 256, 65819}, 47ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley {"cramfs", 0x28cd3d45, 4, 0, 0, 16, 48}, 48ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley {"f2fs", 0xF2F52010, 4, 1024, 1132, 16, 1110}, 49ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley {"jfs", 0x3153464a, 4, 32768, 32920, 16, 32904}, 50ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley {"nilfs", 0x3434, 2, 1030, 1176, 80, 1192}, 510cae7298fffccbd84e9d06e2d73dce9ed66a9c67Rob Landley {"reiserfs", 0x724573496552ULL, 6, 8244, 8276, 16, 8292}, 520cae7298fffccbd84e9d06e2d73dce9ed66a9c67Rob Landley {"reiserfs", 0x724573496552ULL, 6, 65588, 65620, 16, 65536}, 53ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley {"romfs", 0x2d6d6f72, 4, 0, 0,0,0}, 54ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley {"squashfs", 0x73717368, 4, 0, 0,0,0}, 55ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley {"xiafs", 0x012fd16d, 4, 572, 0,0,0}, 56ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley {"xfs", 0x42534658, 4, 0, 32, 12, 108}, 570cae7298fffccbd84e9d06e2d73dce9ed66a9c67Rob Landley {"vfat", 0x3233544146ULL, 5, 82, 67+(4<<24), 11, 71}, // fat32 58ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley {"vfat", 0x31544146, 4, 54, 39+(4<<24), 11, 43} // fat1 59ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley}; 60730d5a851fd8d8d39497e1dbb334baa583816c61Brad Conroy 617a3f53ba446ae2600763ee37b7f8dcc91de3ec5fRob Landleystatic void do_blkid(int fd, char *name) 62907d423f0093b0e31ce103fa7b86348431affb9bRob Landley{ 63ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley int off, i, j; 64ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley char *type; 65ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley 66ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley off = i = 0; 67ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley 68ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley for (;;) { 69ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley int pass = 0, len; 70ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley 71ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley // Read next block of data 72ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley len = readall(fd, toybuf, sizeof(toybuf)); 73ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley if (len != sizeof(toybuf)) return; 74ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley 75ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley // Iterate through types in range 76ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley for (i=0; i < sizeof(fstypes)/sizeof(struct fstype); i++) { 77ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley uint64_t test; 78ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley 79ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley // Skip tests not in this 4k block 80ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley if (fstypes[i].magic_offset > off+sizeof(toybuf)) { 81ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley pass++; 82ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley continue; 83ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley } 84ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley if (fstypes[i].magic_offset < off) continue; 85ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley 86ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley // Populate 64 bit little endian magic value 87ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley test = 0; 88ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley for (j = 0; j < fstypes[i].magic_len; j++) 89ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley test += ((uint64_t)toybuf[j+fstypes[i].magic_offset-off])<<(8*j); 90ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley if (test == fstypes[i].magic) break; 91907d423f0093b0e31ce103fa7b86348431affb9bRob Landley } 92907d423f0093b0e31ce103fa7b86348431affb9bRob Landley 93ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley if (i == sizeof(fstypes)/sizeof(struct fstype)) { 94ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley off += len; 95ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley if (pass) continue; 96ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley return; 97ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley } 98ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley break; 99ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley } 100ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley 101ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley // distinguish ext2/3/4 102ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley type = fstypes[i].name; 103ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley if (!i) { 104ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley if (toybuf[1116]&4) type = "ext3"; 105ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley if (toybuf[1120]&64) type = "ext4"; 106ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley } 107ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley 108ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley // Could special case NTFS here... 109ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley 110ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley // Output for fstype 111ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley if (*toys.which->name == 'f') { 112ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley puts(type); 113ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley return; 114ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley } 115ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley 116ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley // output for blkid 117ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley printf("%s:",name); 118ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley 119ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley if (fstypes[i].label_len) 120ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley printf(" LABEL=\"%.*s\"", fstypes[i].label_len, 121ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley toybuf+fstypes[i].label_off-off); 122ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley 123ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley if (fstypes[i].uuid_off) { 124ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley int bits = 0x550, size = fstypes[i].uuid_off >> 24, 125ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley uoff = (fstypes[i].uuid_off & ((1<<24)-1))-off; 126ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley 127ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley if (size) bits = 4*(size == 4); 128ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley else size = 16; 129ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley 130ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley printf(" UUID=\""); 131ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley for (j = 0; j < size; j++) printf("-%02x"+!(bits & (1<<j)), toybuf[uoff+j]); 132ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley printf("\""); 133ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley } 134ad1f8a0e598751aaf67d3fbd1611d35b03318f4eRob Landley 135bce0e002dc5d25ae109e0b72da071986f211cf9cRob Landley printf(" TYPE=\"%s\"\n", type); 136730d5a851fd8d8d39497e1dbb334baa583816c61Brad Conroy} 137730d5a851fd8d8d39497e1dbb334baa583816c61Brad Conroy 13842b7d4b06b55e0090c3be1bc6ca1ed166bd6b2fdDima Krasnerstatic void loop_partitions() 13942b7d4b06b55e0090c3be1bc6ca1ed166bd6b2fdDima Krasner{ 14042b7d4b06b55e0090c3be1bc6ca1ed166bd6b2fdDima Krasner unsigned int ma, mi, sz, fd; 14142b7d4b06b55e0090c3be1bc6ca1ed166bd6b2fdDima Krasner char device[14]; 14242b7d4b06b55e0090c3be1bc6ca1ed166bd6b2fdDima Krasner char *name = toybuf, *buffer = toybuf + ONE_K; 14342b7d4b06b55e0090c3be1bc6ca1ed166bd6b2fdDima Krasner FILE* fp = xfopen("/proc/partitions", "r"); 14442b7d4b06b55e0090c3be1bc6ca1ed166bd6b2fdDima Krasner 14542b7d4b06b55e0090c3be1bc6ca1ed166bd6b2fdDima Krasner while (fgets(buffer, ONE_K, fp)) { 14642b7d4b06b55e0090c3be1bc6ca1ed166bd6b2fdDima Krasner name[0] = '\0'; 14742b7d4b06b55e0090c3be1bc6ca1ed166bd6b2fdDima Krasner if (sscanf(buffer, " %u %u %u %[^\n ]", &ma, &mi, &sz, name) != 4) 14842b7d4b06b55e0090c3be1bc6ca1ed166bd6b2fdDima Krasner continue; 14942b7d4b06b55e0090c3be1bc6ca1ed166bd6b2fdDima Krasner 15042b7d4b06b55e0090c3be1bc6ca1ed166bd6b2fdDima Krasner sprintf(device,"/dev/%s",name); 15142b7d4b06b55e0090c3be1bc6ca1ed166bd6b2fdDima Krasner fd = open(device, O_RDONLY); 15242b7d4b06b55e0090c3be1bc6ca1ed166bd6b2fdDima Krasner if (-1 == fd) perror_exit("Could not open %s", device); 15342b7d4b06b55e0090c3be1bc6ca1ed166bd6b2fdDima Krasner do_blkid(fd, device); 15442b7d4b06b55e0090c3be1bc6ca1ed166bd6b2fdDima Krasner close(fd); 15542b7d4b06b55e0090c3be1bc6ca1ed166bd6b2fdDima Krasner } 15642b7d4b06b55e0090c3be1bc6ca1ed166bd6b2fdDima Krasner fclose(fp); 15742b7d4b06b55e0090c3be1bc6ca1ed166bd6b2fdDima Krasner} 15842b7d4b06b55e0090c3be1bc6ca1ed166bd6b2fdDima Krasner 159730d5a851fd8d8d39497e1dbb334baa583816c61Brad Conroyvoid blkid_main(void) 160730d5a851fd8d8d39497e1dbb334baa583816c61Brad Conroy{ 16142b7d4b06b55e0090c3be1bc6ca1ed166bd6b2fdDima Krasner if (*toys.optargs) 16242b7d4b06b55e0090c3be1bc6ca1ed166bd6b2fdDima Krasner loopfiles(toys.optargs, do_blkid); 16342b7d4b06b55e0090c3be1bc6ca1ed166bd6b2fdDima Krasner else 16442b7d4b06b55e0090c3be1bc6ca1ed166bd6b2fdDima Krasner loop_partitions(); 165730d5a851fd8d8d39497e1dbb334baa583816c61Brad Conroy} 166bce0e002dc5d25ae109e0b72da071986f211cf9cRob Landley 167bce0e002dc5d25ae109e0b72da071986f211cf9cRob Landleyvoid fstype_main(void) 168bce0e002dc5d25ae109e0b72da071986f211cf9cRob Landley{ 16942b7d4b06b55e0090c3be1bc6ca1ed166bd6b2fdDima Krasner loopfiles(toys.optargs, do_blkid); 170bce0e002dc5d25ae109e0b72da071986f211cf9cRob Landley} 171