summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOtavio Salvador <otavio@ossystems.com.br>2009-09-27 21:36:29 -0300
committerOtavio Salvador <otavio@ossystems.com.br>2009-10-29 20:43:50 -0200
commit0456b5ee381e55383249782a2e7ac6e4de60e746 (patch)
tree196d4868a2f89f944618176ddee75398fb98754d
parentc99bb48707c79be34d897f33e67f2f87397096c8 (diff)
squashfs-tools: add lzma support in 4.0 version
This added lzma by default since squashfs-tools is not common to be installed into a image and it doesn't increase the compilation time a lot. Signed-off-by: Otavio Salvador <otavio@ossystems.com.br>
-rw-r--r--recipes/squashfs-tools/squashfs-tools-4.0/lzma-support.patch462
-rw-r--r--recipes/squashfs-tools/squashfs-tools-4.0/portability.patch24
-rw-r--r--recipes/squashfs-tools/squashfs-tools-native_4.0.bb4
-rw-r--r--recipes/squashfs-tools/squashfs-tools_4.0.bb9
4 files changed, 496 insertions, 3 deletions
diff --git a/recipes/squashfs-tools/squashfs-tools-4.0/lzma-support.patch b/recipes/squashfs-tools/squashfs-tools-4.0/lzma-support.patch
new file mode 100644
index 0000000000..1441fb42f0
--- /dev/null
+++ b/recipes/squashfs-tools/squashfs-tools-4.0/lzma-support.patch
@@ -0,0 +1,462 @@
+Index: squashfs4.0/squashfs-tools/mksquashfs.c
+===================================================================
+--- squashfs4.0.orig/squashfs-tools/mksquashfs.c 2009-04-05 23:22:48.000000000 +0200
++++ squashfs4.0/squashfs-tools/mksquashfs.c 2009-09-14 17:21:46.210480446 +0200
+@@ -64,6 +64,18 @@
+ #include "global.h"
+ #include "sort.h"
+ #include "pseudo.h"
++#include "uncompress.h"
++
++#ifdef USE_LZMA
++#include <LzmaEnc.h>
++#include <LzmaDec.h>
++#define LZMA_DEFAULT_LEVEL 5
++#define LZMA_DEFAULT_DICT 0
++#define LZMA_DEFAULT_LC 1
++#define LZMA_DEFAULT_LP 2
++#define LZMA_DEFAULT_PB 2
++#define LZMA_DEFAULT_FB 32
++#endif
+
+ #ifdef SQUASHFS_TRACE
+ #define TRACE(s, args...) do { \
+@@ -830,6 +842,19 @@
+ rotate = (rotate + 1) % 4;
+ }
+
++#ifdef USE_LZMA
++static void *lzma_malloc(void *p, size_t size)
++{
++ (void)p;
++ return malloc(size);
++}
++static void lzma_free(void *p, void *addr)
++{
++ (void)p;
++ free(addr);
++}
++static ISzAlloc lzma_alloc = { lzma_malloc, lzma_free };
++#endif
+
+ unsigned int mangle2(z_stream **strm, char *d, char *s, int size,
+ int block_size, int uncompressed, int data_block)
+@@ -841,6 +866,50 @@
+ if(uncompressed)
+ goto notcompressed;
+
++#ifdef USE_LZMA
++ if (compression == LZMA_COMPRESSION) {
++ size_t outsize = block_size - LZMA_PROPS_SIZE;
++ size_t propsize = LZMA_PROPS_SIZE;
++ CLzmaEncProps props;
++
++ LzmaEncProps_Init(&props);
++ props.level = LZMA_DEFAULT_LEVEL;
++ props.dictSize = LZMA_DEFAULT_DICT;
++ props.lc = LZMA_DEFAULT_LC;
++ props.lp = LZMA_DEFAULT_LP;
++ props.pb = LZMA_DEFAULT_PB;
++ props.fb = LZMA_DEFAULT_FB;
++ props.numThreads = 1;
++
++ res = LzmaEncode((unsigned char *) d + LZMA_PROPS_SIZE, &outsize,
++ (unsigned char *) s, size,
++ &props, (unsigned char *) d, &propsize,
++ 1, NULL, &lzma_alloc, &lzma_alloc);
++ switch(res) {
++ case SZ_OK:
++ outsize += LZMA_PROPS_SIZE;
++ break;
++ case SZ_ERROR_DATA:
++ BAD_ERROR("lzma::compress failed, data error\n");
++ break;
++ case SZ_ERROR_MEM:
++ BAD_ERROR("lzma::compress failed, memory allocation error\n");
++ break;
++ case SZ_ERROR_PARAM:
++ BAD_ERROR("lzma::compress failed, invalid parameters\n");
++ break;
++ case SZ_ERROR_OUTPUT_EOF:
++ goto notcompressed;
++ /* should not happen */
++ default:
++ BAD_ERROR("lzma::compress failed, unknown error (%d)\n", res);
++ break;
++ }
++
++ return outsize;
++ }
++#endif
++
+ if(stream == NULL) {
+ if((stream = *strm = malloc(sizeof(z_stream))) == NULL)
+ BAD_ERROR("mangle::compress failed, not enough "
+@@ -1669,17 +1738,17 @@
+ else
+ data = read_from_disk(start_block, size);
+
+- res = uncompress((unsigned char *) buffer->data, &bytes,
++ res = uncompress_wrapper((unsigned char *) buffer->data, &bytes,
+ (const unsigned char *) data, size);
+ if(res != Z_OK) {
+ if(res == Z_MEM_ERROR)
+- BAD_ERROR("zlib::uncompress failed, not enough "
++ BAD_ERROR("uncompress failed, not enough "
+ "memory\n");
+ else if(res == Z_BUF_ERROR)
+- BAD_ERROR("zlib::uncompress failed, not enough "
++ BAD_ERROR("uncompress failed, not enough "
+ "room in output buffer\n");
+ else
+- BAD_ERROR("zlib::uncompress failed,"
++ BAD_ERROR("uncompress failed,"
+ " unknown error %d\n", res);
+ }
+ } else if(compressed_buffer)
+@@ -4282,6 +4351,10 @@
+ argv[0]);
+ exit(1);
+ }
++#ifdef USE_LZMA
++ } else if(strcmp(argv[i], "-lzma") == 0) {
++ compression = LZMA_COMPRESSION;
++#endif
+ } else if(strcmp(argv[i], "-ef") == 0) {
+ if(++i == argc) {
+ ERROR("%s: -ef missing filename\n", argv[0]);
+@@ -4410,6 +4483,9 @@
+ ERROR("-b <block_size>\t\tset data block to "
+ "<block_size>. Default %d bytes\n",
+ SQUASHFS_FILE_SIZE);
++#ifdef USE_LZMA
++ ERROR("-lzma Enable LZMA compression\n");
++#endif
+ ERROR("-processors <number>\tUse <number> processors."
+ " By default will use number of\n");
+ ERROR("\t\t\tprocessors available\n");
+@@ -4804,7 +4880,7 @@
+ sBlk.bytes_used = bytes;
+
+ /* Only compression supported */
+- sBlk.compression = ZLIB_COMPRESSION;
++ sBlk.compression = compression;
+
+ /* Xattrs are not currently supported */
+ sBlk.xattr_table_start = SQUASHFS_INVALID_BLK;
+Index: squashfs4.0/squashfs-tools/squashfs_fs.h
+===================================================================
+--- squashfs4.0.orig/squashfs-tools/squashfs_fs.h 2009-03-18 03:50:20.000000000 +0100
++++ squashfs4.0/squashfs-tools/squashfs_fs.h 2009-09-14 17:20:36.310480350 +0200
+@@ -229,6 +229,7 @@
+ typedef long long squashfs_inode_t;
+
+ #define ZLIB_COMPRESSION 1
++#define LZMA_COMPRESSION 2
+
+ struct squashfs_super_block {
+ unsigned int s_magic;
+Index: squashfs4.0/squashfs-tools/Makefile
+===================================================================
+--- squashfs4.0.orig/squashfs-tools/Makefile 2009-04-05 04:03:36.000000000 +0200
++++ squashfs4.0/squashfs-tools/Makefile 2009-09-14 17:20:36.310480350 +0200
+@@ -4,14 +4,20 @@
+
+ CFLAGS := -I$(INCLUDEDIR) -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_GNU_SOURCE -O2
+
++ifdef USE_LZMA
++ LZMA_CFLAGS = -DUSE_LZMA
++ LZMA_LIB = -llzma
++ CFLAGS += $(LZMA_CFLAGS)
++endif
++
+ all: mksquashfs unsquashfs
+
+-mksquashfs: mksquashfs.o read_fs.o sort.o swap.o pseudo.o
+- $(CC) mksquashfs.o read_fs.o sort.o swap.o pseudo.o -lz -lpthread -lm -o $@
++mksquashfs: mksquashfs.o read_fs.o sort.o swap.o pseudo.o uncompress.o
++ $(CC) mksquashfs.o read_fs.o sort.o swap.o pseudo.o uncompress.o -lz -lpthread -lm $(LZMA_LIB) -o $@
+
+-mksquashfs.o: mksquashfs.c squashfs_fs.h mksquashfs.h global.h sort.h squashfs_swap.h Makefile
++mksquashfs.o: mksquashfs.c squashfs_fs.h mksquashfs.h global.h sort.h squashfs_swap.h uncompress.h Makefile
+
+-read_fs.o: read_fs.c squashfs_fs.h read_fs.h global.h squashfs_swap.h Makefile
++read_fs.o: read_fs.c squashfs_fs.h read_fs.h global.h squashfs_swap.h uncompress.h Makefile
+
+ sort.o: sort.c squashfs_fs.h global.h sort.h Makefile
+
+@@ -19,18 +25,20 @@
+
+ pseudo.o: pseudo.c pseudo.h Makefile
+
+-unsquashfs: unsquashfs.o unsquash-1.o unsquash-2.o unsquash-3.o unsquash-4.o swap.o
+- $(CC) unsquashfs.o unsquash-1.o unsquash-2.o unsquash-3.o unsquash-4.o swap.o -lz -lpthread -lm -o $@
++uncompress.o: uncompress.c uncompress.h
++
++unsquashfs: unsquashfs.o unsquash-1.o unsquash-2.o unsquash-3.o unsquash-4.o swap.o uncompress.o
++ $(CC) unsquashfs.o unsquash-1.o unsquash-2.o unsquash-3.o unsquash-4.o swap.o uncompress.o -lz -lpthread -lm $(LZMA_LIB) -o $@
+
+-unsquashfs.o: unsquashfs.h unsquashfs.c squashfs_fs.h squashfs_swap.h squashfs_compat.h global.h Makefile
++unsquashfs.o: unsquashfs.h unsquashfs.c squashfs_fs.h squashfs_swap.h squashfs_compat.h global.h uncompress.h Makefile
+
+-unsquash-1.o: unsquashfs.h unsquash-1.c squashfs_fs.h squashfs_compat.h global.h Makefile
++unsquash-1.o: unsquashfs.h unsquash-1.c squashfs_fs.h squashfs_compat.h global.h uncompress.h Makefile
+
+-unsquash-2.o: unsquashfs.h unsquash-2.c unsquashfs.h squashfs_fs.h squashfs_compat.h global.h Makefile
++unsquash-2.o: unsquashfs.h unsquash-2.c unsquashfs.h squashfs_fs.h squashfs_compat.h global.h uncompress.h Makefile
+
+-unsquash-3.o: unsquashfs.h unsquash-3.c squashfs_fs.h squashfs_compat.h global.h Makefile
++unsquash-3.o: unsquashfs.h unsquash-3.c squashfs_fs.h squashfs_compat.h global.h uncompress.h Makefile
+
+-unsquash-4.o: unsquashfs.h unsquash-4.c squashfs_fs.h squashfs_swap.h global.h Makefile
++unsquash-4.o: unsquashfs.h unsquash-4.c squashfs_fs.h squashfs_swap.h global.h uncompress.h Makefile
+
+ clean:
+ -rm -f *.o mksquashfs unsquashfs
+Index: squashfs4.0/squashfs-tools/read_fs.c
+===================================================================
+--- squashfs4.0.orig/squashfs-tools/read_fs.c 2009-03-31 06:23:14.000000000 +0200
++++ squashfs4.0/squashfs-tools/read_fs.c 2009-09-14 17:20:36.310480350 +0200
+@@ -51,6 +51,7 @@
+ #include "squashfs_swap.h"
+ #include "read_fs.h"
+ #include "global.h"
++#include "uncompress.h"
+
+ #include <stdlib.h>
+
+@@ -83,17 +84,17 @@
+ c_byte = SQUASHFS_COMPRESSED_SIZE(c_byte);
+ read_destination(fd, start + offset, c_byte, buffer);
+
+- res = uncompress(block, &bytes, (const unsigned char *) buffer,
+- c_byte);
++ res = uncompress_wrapper(block, &bytes,
++ (const unsigned char *) buffer, c_byte);
+ if(res != Z_OK) {
+ if(res == Z_MEM_ERROR)
+- ERROR("zlib::uncompress failed, not enough "
++ ERROR("uncompress failed, not enough "
+ "memory\n");
+ else if(res == Z_BUF_ERROR)
+- ERROR("zlib::uncompress failed, not enough "
++ ERROR("uncompress failed, not enough "
+ "room in output buffer\n");
+ else
+- ERROR("zlib::uncompress failed, unknown error "
++ ERROR("uncompress failed, unknown error "
+ "%d\n", res);
+ return 0;
+ }
+Index: squashfs4.0/squashfs-tools/unsquashfs.c
+===================================================================
+--- squashfs4.0.orig/squashfs-tools/unsquashfs.c 2009-04-05 23:23:06.000000000 +0200
++++ squashfs4.0/squashfs-tools/unsquashfs.c 2009-09-14 17:20:36.310480350 +0200
+@@ -24,6 +24,7 @@
+ #include "unsquashfs.h"
+ #include "squashfs_swap.h"
+ #include "squashfs_compat.h"
++#include "uncompress.h"
+ #include "read_fs.h"
+
+ struct cache *fragment_cache, *data_cache;
+@@ -597,18 +598,17 @@
+ if(read_bytes(start + offset, c_byte, buffer) == FALSE)
+ goto failed;
+
+- res = uncompress((unsigned char *) block, &bytes,
++ res = uncompress_wrapper((unsigned char *) block, &bytes,
+ (const unsigned char *) buffer, c_byte);
+-
+ if(res != Z_OK) {
+ if(res == Z_MEM_ERROR)
+- ERROR("zlib::uncompress failed, not enough "
++ ERROR("uncompress failed, not enough "
+ "memory\n");
+ else if(res == Z_BUF_ERROR)
+- ERROR("zlib::uncompress failed, not enough "
++ ERROR("uncompress failed, not enough "
+ "room in output buffer\n");
+ else
+- ERROR("zlib::uncompress failed, unknown error "
++ ERROR("uncompress failed, unknown error "
+ "%d\n", res);
+ goto failed;
+ }
+@@ -645,18 +645,17 @@
+ if(read_bytes(start, c_byte, data) == FALSE)
+ goto failed;
+
+- res = uncompress((unsigned char *) block, &bytes,
++ res = uncompress_wrapper((unsigned char *) block, &bytes,
+ (const unsigned char *) data, c_byte);
+-
+ if(res != Z_OK) {
+ if(res == Z_MEM_ERROR)
+- ERROR("zlib::uncompress failed, not enough "
++ ERROR("uncompress failed, not enough "
+ "memory\n");
+ else if(res == Z_BUF_ERROR)
+- ERROR("zlib::uncompress failed, not enough "
++ ERROR("uncompress failed, not enough "
+ "room in output buffer\n");
+ else
+- ERROR("zlib::uncompress failed, unknown error "
++ ERROR("uncompress failed, unknown error "
+ "%d\n", res);
+ goto failed;
+ }
+@@ -1459,7 +1458,7 @@
+ s_ops.read_inode = read_inode_4;
+ s_ops.read_uids_guids = read_uids_guids_4;
+ memcpy(&sBlk, &sBlk_4, sizeof(sBlk_4));
+- return TRUE;
++ goto done;
+ }
+
+ /*
+@@ -1548,6 +1547,9 @@
+ goto failed_mount;
+ }
+
++done:
++ compression = sBlk.compression;
++
+ return TRUE;
+
+ failed_mount:
+@@ -1710,19 +1712,19 @@
+ int res;
+ unsigned long bytes = block_size;
+
+- res = uncompress((unsigned char *) tmp, &bytes,
++ res = uncompress_wrapper((unsigned char *) tmp, &bytes,
+ (const unsigned char *) entry->data,
+ SQUASHFS_COMPRESSED_SIZE_BLOCK(entry->size));
+
+ if(res != Z_OK) {
+ if(res == Z_MEM_ERROR)
+- ERROR("zlib::uncompress failed, not enough"
++ ERROR("uncompress failed, not enough"
+ "memory\n");
+ else if(res == Z_BUF_ERROR)
+- ERROR("zlib::uncompress failed, not enough "
++ ERROR("uncompress failed, not enough "
+ "room in output buffer\n");
+ else
+- ERROR("zlib::uncompress failed, unknown error "
++ ERROR("uncompress failed, unknown error "
+ "%d\n", res);
+ } else
+ memcpy(entry->data, tmp, bytes);
+Index: squashfs4.0/squashfs-tools/mksquashfs.h
+===================================================================
+--- squashfs4.0.orig/squashfs-tools/mksquashfs.h 2009-02-19 19:31:08.000000000 +0100
++++ squashfs4.0/squashfs-tools/mksquashfs.h 2009-09-14 17:20:36.310480350 +0200
+@@ -41,4 +41,9 @@
+ #define SQUASHFS_SWAP_LONG_LONGS(s, d, n) \
+ memcpy(d, s, n * sizeof(long long))
+ #endif
++
++extern int uncompress_wrapper(unsigned char *dest, unsigned long *dest_len,
++ const unsigned char *src, unsigned long src_len);
++
++
+ #endif
+Index: squashfs4.0/squashfs-tools/uncompress.c
+===================================================================
+--- /dev/null 1970-01-01 00:00:00.000000000 +0000
++++ squashfs4.0/squashfs-tools/uncompress.c 2009-09-14 17:20:36.310480350 +0200
+@@ -0,0 +1,58 @@
++/*
++ * Copyright (c) 2009 Felix Fietkau <nbd@openwrt.org>
++ *
++ * This program is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU General Public License
++ * as published by the Free Software Foundation; either version 2,
++ * or (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
++ *
++ * uncompress.c
++ */
++
++
++
++#ifdef USE_LZMA
++#include <LzmaLib.h>
++#endif
++#include <zlib.h>
++#include "squashfs_fs.h"
++
++/* compression algorithm */
++int compression = ZLIB_COMPRESSION;
++
++
++int uncompress_wrapper(unsigned char *dest, unsigned long *dest_len,
++ const unsigned char *src, unsigned long src_len)
++{
++ int res;
++
++#ifdef USE_LZMA
++ if (compression == LZMA_COMPRESSION) {
++ size_t slen = src_len - LZMA_PROPS_SIZE;
++ res = LzmaUncompress((unsigned char *)dest, dest_len,
++ (const unsigned char *) src + LZMA_PROPS_SIZE, &slen,
++ (const unsigned char *) src, LZMA_PROPS_SIZE);
++ switch(res) {
++ case SZ_OK:
++ res = Z_OK;
++ break;
++ case SZ_ERROR_MEM:
++ res = Z_MEM_ERROR;
++ break;
++ }
++ } else
++#endif
++ res = uncompress(dest, dest_len, src, src_len);
++ return res;
++}
++
++
+Index: squashfs4.0/squashfs-tools/uncompress.h
+===================================================================
+--- /dev/null 1970-01-01 00:00:00.000000000 +0000
++++ squashfs4.0/squashfs-tools/uncompress.h 2009-09-14 17:20:36.310480350 +0200
+@@ -0,0 +1,29 @@
++/*
++ * Copyright (c) 2009 Felix Fietkau <nbd@openwrt.org>
++ *
++ * This program is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU General Public License
++ * as published by the Free Software Foundation; either version 2,
++ * or (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
++ *
++ * uncompress.h
++ */
++
++#ifdef USE_LZMA
++#include <LzmaLib.h>
++#endif
++
++extern int compression;
++extern int uncompress_wrapper(unsigned char *dest, unsigned long *dest_len,
++ const unsigned char *src, unsigned long src_len);
++
++
diff --git a/recipes/squashfs-tools/squashfs-tools-4.0/portability.patch b/recipes/squashfs-tools/squashfs-tools-4.0/portability.patch
new file mode 100644
index 0000000000..4318c0ca60
--- /dev/null
+++ b/recipes/squashfs-tools/squashfs-tools-4.0/portability.patch
@@ -0,0 +1,24 @@
+--- a/squashfs-tools/global.h
++++ b/squashfs-tools/global.h
+@@ -44,4 +44,8 @@ typedef long long squashfs_fragment_inde
+ typedef squashfs_inode_t squashfs_inode;
+ typedef squashfs_block_t squashfs_block;
+
++#ifndef FNM_EXTMATCH
++#define FNM_EXTMATCH 0
++#endif
++
+ #endif
+--- a/squashfs-tools/unsquashfs.h
++++ b/squashfs-tools/unsquashfs.h
+@@ -49,8 +49,10 @@
+ #define __BYTE_ORDER BYTE_ORDER
+ #define __BIG_ENDIAN BIG_ENDIAN
+ #define __LITTLE_ENDIAN LITTLE_ENDIAN
++#include <sys/sysctl.h>
+ #else
+ #include <endian.h>
++#include <sys/sysinfo.h>
+ #endif
+
+ #include "squashfs_fs.h"
diff --git a/recipes/squashfs-tools/squashfs-tools-native_4.0.bb b/recipes/squashfs-tools/squashfs-tools-native_4.0.bb
index 1a82323951..f21bf99645 100644
--- a/recipes/squashfs-tools/squashfs-tools-native_4.0.bb
+++ b/recipes/squashfs-tools/squashfs-tools-native_4.0.bb
@@ -1,8 +1,8 @@
+inherit native
+
require squashfs-tools_${PV}.bb
PR = "${INC_PR}.1"
-inherit native
-
PACKAGES = ""
do_stage () {
diff --git a/recipes/squashfs-tools/squashfs-tools_4.0.bb b/recipes/squashfs-tools/squashfs-tools_4.0.bb
index 0de5794b95..a4503fcf0f 100644
--- a/recipes/squashfs-tools/squashfs-tools_4.0.bb
+++ b/recipes/squashfs-tools/squashfs-tools_4.0.bb
@@ -1,5 +1,12 @@
require squashfs-tools.inc
+DEPENDS += "lzma"
PR = "${INC_PR}.1"
+EXTRA_OEMAKE = "USE_LZMA=1 \
+ LZMA_CFLAGS='-I${STAGING_INCDIR}/lzma -DUSE_LZMA' \
+ LZMA_LIB='${STAGING_LIBDIR}/liblzma.a'"
+
DEFAULT_PREFERENCE = "-1"
-SRC_URI += " file://Makefile.patch;patch=1"
+SRC_URI += " file://portability.patch;patch=1;pnum=2 \
+ file://lzma-support.patch;patch=1;pnum=2"
+