diff options
author | Jonas Gorski <jogo@openwrt.org> | 2011-10-19 10:17:28 +0000 |
---|---|---|
committer | Jonas Gorski <jogo@openwrt.org> | 2011-10-19 10:17:28 +0000 |
commit | 90673a048cffc62eaf624e7ca54b1bd1c27b67bd (patch) | |
tree | 71bf490f5b7b3bc4ada993306f868e7e2dba1e1e /tools | |
parent | b656b87d136d7038aa045a221fd2ce5b9a903ef1 (diff) | |
download | upstream-90673a048cffc62eaf624e7ca54b1bd1c27b67bd.tar.gz upstream-90673a048cffc62eaf624e7ca54b1bd1c27b67bd.tar.bz2 upstream-90673a048cffc62eaf624e7ca54b1bd1c27b67bd.zip |
squashfs4: Add support for LZMA Magic to unsquashfs
Some vendor firmwares use a different super block magic to indicate LZMA
compression. This patches adds support for detecting this and enable
extraction for those firmware's root filesystems.
SVN-Revision: 28489
Diffstat (limited to 'tools')
-rw-r--r-- | tools/squashfs4/patches/170-add_support_for_LZMA_MAGIC_to_unsqashfs.patch | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/tools/squashfs4/patches/170-add_support_for_LZMA_MAGIC_to_unsqashfs.patch b/tools/squashfs4/patches/170-add_support_for_LZMA_MAGIC_to_unsqashfs.patch new file mode 100644 index 0000000000..ad69b190ea --- /dev/null +++ b/tools/squashfs4/patches/170-add_support_for_LZMA_MAGIC_to_unsqashfs.patch @@ -0,0 +1,72 @@ +--- a/squashfs-tools/squashfs_fs.h ++++ b/squashfs-tools/squashfs_fs.h +@@ -30,6 +30,13 @@ + #define SQUASHFS_MAGIC_SWAP 0x68737173 + #define SQUASHFS_START 0 + ++/* ++ * Squashfs + LZMA ++ */ ++ ++#define SQUASHFS_MAGIC_LZMA 0x71736873 ++#define SQUASHFS_MAGIC_LZMA_SWAP 0x73687371 ++ + /* size of metadata (inode and directory) blocks */ + #define SQUASHFS_METADATA_SIZE 8192 + #define SQUASHFS_METADATA_LOG 13 +--- a/squashfs-tools/unsquashfs.c ++++ b/squashfs-tools/unsquashfs.c +@@ -1463,10 +1463,12 @@ int read_super(char *source) + */ + read_fs_bytes(fd, SQUASHFS_START, sizeof(struct squashfs_super_block), + &sBlk_4); +- swap = sBlk_4.s_magic != SQUASHFS_MAGIC; ++ swap = (sBlk_4.s_magic != SQUASHFS_MAGIC && ++ sBlk_4.s_magic != SQUASHFS_MAGIC_LZMA); + SQUASHFS_INSWAP_SUPER_BLOCK(&sBlk_4); + +- if(sBlk_4.s_magic == SQUASHFS_MAGIC && sBlk_4.s_major == 4 && ++ if((sBlk_4.s_magic == SQUASHFS_MAGIC || ++ sBlk_4.s_magic == SQUASHFS_MAGIC_LZMA) && sBlk_4.s_major == 4 && + sBlk_4.s_minor == 0) { + s_ops.squashfs_opendir = squashfs_opendir_4; + s_ops.read_fragment = read_fragment_4; +@@ -1479,7 +1481,11 @@ int read_super(char *source) + /* + * Check the compression type + */ +- comp = lookup_compressor_id(sBlk.s.compression); ++ if (sBlk_4.s_magic == SQUASHFS_MAGIC_LZMA) ++ comp = lookup_compressor("lzma"); ++ else ++ comp = lookup_compressor_id(sBlk.s.compression); ++ + return TRUE; + } + +@@ -1494,8 +1500,10 @@ int read_super(char *source) + * Check it is a SQUASHFS superblock + */ + swap = 0; +- if(sBlk_3.s_magic != SQUASHFS_MAGIC) { +- if(sBlk_3.s_magic == SQUASHFS_MAGIC_SWAP) { ++ if(sBlk_3.s_magic != SQUASHFS_MAGIC && ++ sBlk_3.s_magic != SQUASHFS_MAGIC_LZMA) { ++ if(sBlk_3.s_magic == SQUASHFS_MAGIC_SWAP || ++ sBlk_3.s_magic == SQUASHFS_MAGIC_LZMA_SWAP) { + squashfs_super_block_3 sblk; + ERROR("Reading a different endian SQUASHFS filesystem " + "on %s\n", source); +@@ -1573,7 +1581,11 @@ int read_super(char *source) + /* + * 1.x, 2.x and 3.x filesystems use gzip compression. + */ +- comp = lookup_compressor("gzip"); ++ if (sBlk.s.s_magic == SQUASHFS_MAGIC_LZMA) ++ comp = lookup_compressor("lzma"); ++ else ++ comp = lookup_compressor("gzip"); ++ + return TRUE; + + failed_mount: |