add chaos_calmer branch
[15.05/openwrt.git] / tools / squashfs4 / patches / 170-add_support_for_LZMA_MAGIC_to_unsqashfs.patch
1 --- a/squashfs-tools/squashfs_fs.h
2 +++ b/squashfs-tools/squashfs_fs.h
3 @@ -30,6 +30,13 @@
4  #define SQUASHFS_MAGIC_SWAP            0x68737173
5  #define SQUASHFS_START                 0
6  
7 +/*
8 + * Squashfs + LZMA
9 + */
10 +
11 +#define SQUASHFS_MAGIC_LZMA            0x71736873
12 +#define SQUASHFS_MAGIC_LZMA_SWAP       0x73687371
13 +
14  /* size of metadata (inode and directory) blocks */
15  #define SQUASHFS_METADATA_SIZE         8192
16  #define SQUASHFS_METADATA_LOG          13
17 --- a/squashfs-tools/unsquashfs.c
18 +++ b/squashfs-tools/unsquashfs.c
19 @@ -1463,10 +1463,12 @@ int read_super(char *source)
20          */
21         read_fs_bytes(fd, SQUASHFS_START, sizeof(struct squashfs_super_block),
22                 &sBlk_4);
23 -       swap = sBlk_4.s_magic != SQUASHFS_MAGIC;
24 +       swap = (sBlk_4.s_magic != SQUASHFS_MAGIC &&
25 +               sBlk_4.s_magic != SQUASHFS_MAGIC_LZMA);
26         SQUASHFS_INSWAP_SUPER_BLOCK(&sBlk_4);
27  
28 -       if(sBlk_4.s_magic == SQUASHFS_MAGIC && sBlk_4.s_major == 4 &&
29 +       if((sBlk_4.s_magic == SQUASHFS_MAGIC || 
30 +          sBlk_4.s_magic == SQUASHFS_MAGIC_LZMA) && sBlk_4.s_major == 4 &&
31                         sBlk_4.s_minor == 0) {
32                 s_ops.squashfs_opendir = squashfs_opendir_4;
33                 s_ops.read_fragment = read_fragment_4;
34 @@ -1479,7 +1481,11 @@ int read_super(char *source)
35                 /*
36                  * Check the compression type
37                  */
38 -               comp = lookup_compressor_id(sBlk.s.compression);
39 +               if (sBlk_4.s_magic == SQUASHFS_MAGIC_LZMA)
40 +                       comp = lookup_compressor("lzma");
41 +               else
42 +                       comp = lookup_compressor_id(sBlk.s.compression);
43 +
44                 return TRUE;
45         }
46  
47 @@ -1494,8 +1500,10 @@ int read_super(char *source)
48          * Check it is a SQUASHFS superblock
49          */
50         swap = 0;
51 -       if(sBlk_3.s_magic != SQUASHFS_MAGIC) {
52 -               if(sBlk_3.s_magic == SQUASHFS_MAGIC_SWAP) {
53 +       if(sBlk_3.s_magic != SQUASHFS_MAGIC && 
54 +                       sBlk_3.s_magic != SQUASHFS_MAGIC_LZMA) {
55 +               if(sBlk_3.s_magic == SQUASHFS_MAGIC_SWAP || 
56 +                               sBlk_3.s_magic == SQUASHFS_MAGIC_LZMA_SWAP) {
57                         squashfs_super_block_3 sblk;
58                         ERROR("Reading a different endian SQUASHFS filesystem "
59                                 "on %s\n", source);
60 @@ -1573,7 +1581,11 @@ int read_super(char *source)
61         /*
62          * 1.x, 2.x and 3.x filesystems use gzip compression.
63          */
64 -       comp = lookup_compressor("gzip");
65 +       if (sBlk.s.s_magic == SQUASHFS_MAGIC_LZMA)
66 +               comp = lookup_compressor("lzma");
67 +       else
68 +               comp = lookup_compressor("gzip");
69 +
70         return TRUE;
71  
72  failed_mount: