mirror of
git://projects.qi-hardware.com/openwrt-xburst.git
synced 2024-08-20 05:45:53 +03:00
73 lines
2.2 KiB
Diff
73 lines
2.2 KiB
Diff
|
--- 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:
|