1 /* 2 * Copyright (C) 2008 Karel Zak <kzak@redhat.com> 3 * 4 * Inspired by libvolume_id by 5 * Kay Sievers <kay.sievers@vrfy.org> 6 * 7 * This file may be redistributed under the terms of the 8 * GNU Lesser General Public License. 9 */ 10 #include <stdio.h> 11 #include <stdlib.h> 12 #include <unistd.h> 13 #include <string.h> 14 #include <stdint.h> 15 16 #include "bitops.h" /* swab16() */ 17 #include "superblocks.h" 18 19 #include <libubox/md5.h> 20 21 struct squashfs_super_block { 22 uint32_t s_magic; 23 uint32_t inodes; 24 uint32_t mkfs_time; 25 uint32_t block_size; 26 uint32_t fragments; 27 uint16_t compression; 28 uint16_t block_log; 29 uint16_t flags; 30 uint16_t no_ids; 31 uint16_t s_major; 32 uint16_t s_minor; 33 uint64_t root_inode; 34 uint64_t bytes_used; 35 uint64_t id_table_start; 36 uint64_t xattr_id_table_start; 37 uint64_t inode_table_start; 38 uint64_t directory_table_start; 39 uint64_t fragment_table_start; 40 uint64_t lookup_table_start; 41 } __attribute__((packed)); 42 43 static int probe_squashfs(blkid_probe pr, const struct blkid_idmag *mag) 44 { 45 md5_ctx_t ctx = { 0 }; 46 uint32_t md5[4]; 47 struct squashfs_super_block *sq; 48 49 sq = blkid_probe_get_sb(pr, mag, struct squashfs_super_block); 50 if (!sq) 51 return -1; 52 53 if (strcmp(mag->magic, "sqsh") == 0 || 54 strcmp(mag->magic, "qshs") == 0) 55 blkid_probe_sprintf_version(pr, "%u.%u", 56 be16_to_cpu(sq->s_major), 57 be16_to_cpu(sq->s_minor)); 58 else 59 blkid_probe_sprintf_version(pr, "%u.%u", 60 le16_to_cpu(sq->s_major), 61 le16_to_cpu(sq->s_minor)); 62 md5_begin(&ctx); 63 md5_hash(sq, sizeof(*sq), &ctx); 64 md5_end(&md5, &ctx); 65 blkid_probe_sprintf_uuid(pr, NULL, 4, "%08x-%08x-%08x-%08x", 66 md5[3], md5[2], md5[1], md5[0]); 67 return 0; 68 } 69 70 const struct blkid_idinfo squashfs_idinfo = 71 { 72 .name = "squashfs", 73 .usage = BLKID_USAGE_FILESYSTEM, 74 .probefunc = probe_squashfs, 75 .magics = 76 { 77 { .magic = "sqsh", .len = 4 }, /* BE legacy squashfs */ 78 { .magic = "hsqs", .len = 4 }, /* LE / v4 squashfs */ 79 80 /* LZMA version */ 81 { .magic = "qshs", .len = 4 }, /* BE legacy squashfs with LZMA */ 82 { .magic = "shsq", .len = 4 }, /* LE / v4 squashfs with LZMA */ 83 { NULL } 84 } 85 }; 86 87 88
This page was automatically generated by LXR 0.3.1. • OpenWrt