wok rev 12214

fusecloop: compress index too
author Pascal Bellard <pascal.bellard@slitaz.org>
date Mon Apr 02 22:48:21 2012 +0200 (2012-04-02)
parents 2dde678153c7
children 188ed036ce84
files fusecloop/receipt fusecloop/stuff/fusecloop.u
line diff
     1.1 --- a/fusecloop/receipt	Sun Apr 01 12:41:48 2012 +0200
     1.2 +++ b/fusecloop/receipt	Mon Apr 02 22:48:21 2012 +0200
     1.3 @@ -8,7 +8,10 @@
     1.4  TARBALL="$PACKAGE-$VERSION.tar.gz"
     1.5  WEB_SITE="http://fusecloop.sourceforge.net/"
     1.6  WGET_URL="$SF_MIRROR/$PACKAGE/$TARBALL"
     1.7 -DEPENDS="fuse zlib"
     1.8 +ADVANCECOMP_VERSION="1.15"
     1.9 +ADVANCECOMP_TARBALL="advancecomp-$ADVANCECOMP_VERSION.tar.gz"
    1.10 +ADVANCECOMP_URL="$SF_MIRROR/advancemame/$ADVANCECOMP_TARBALL"
    1.11 +DEPENDS="fuse zlib gcc-lib-base"
    1.12  BUILD_DEPENDS="fuse-dev zlib-dev"
    1.13  SUGGESTED="fuseiso"
    1.14  
    1.15 @@ -16,11 +19,22 @@
    1.16  compile_rules()
    1.17  {
    1.18  	cd $src
    1.19 +	[ -s $SOURCES_REPOSITORY/$ADVANCECOMP_TARBALL ] ||
    1.20 +		wget -P $SOURCES_REPOSITORY $ADVANCECOMP_URL
    1.21 +	tar xzf $SOURCES_REPOSITORY/$ADVANCECOMP_TARBALL
    1.22  	sed -i 's/dprintf/d_printf/g' *.h *.c
    1.23  	patch -p0 < $stuff/fusecloop.u
    1.24 +	ADVANCECOMP=advancecomp-$ADVANCECOMP_VERSION
    1.25 +	cp *.h *.c $ADVANCECOMP
    1.26 +	cp create_compressed_fs.c $ADVANCECOMP/redef.cc
    1.27 +	sed -i 's/def FIND_BEST_COMPRESSION/ 1/' $ADVANCECOMP/redef.cc
    1.28  	./configure --prefix=/usr --infodir=/usr/share/info \
    1.29  	--mandir=/usr/share/man $CONFIGURE_ARGS &&
    1.30 -	make
    1.31 +	make &&
    1.32 +	cd $ADVANCECOMP &&
    1.33 +	./configure --prefix=/usr --infodir=/usr/share/info \
    1.34 +	--mandir=/usr/share/man $CONFIGURE_ARGS &&
    1.35 +	make advdef
    1.36  }
    1.37  
    1.38  # Rules to gen a SliTaz package suitable for Tazpkg.
    1.39 @@ -29,6 +43,6 @@
    1.40  	mkdir -p $fs/usr/bin
    1.41  	cp $src/fusecloop $fs/usr/bin
    1.42  	cp $src/extract_compressed_fs $fs/usr/bin
    1.43 -	cp $src/create_compressed_fs $fs/usr/bin
    1.44 +	cp $src/advancecomp-*/advdef $fs/usr/bin/create_compressed_fs
    1.45  }
    1.46  
     2.1 --- a/fusecloop/stuff/fusecloop.u	Sun Apr 01 12:41:48 2012 +0200
     2.2 +++ b/fusecloop/stuff/fusecloop.u	Mon Apr 02 22:48:21 2012 +0200
     2.3 @@ -1,11 +1,12 @@
     2.4  --- compressed_loop.h
     2.5  +++ compressed_loop.h
     2.6 -@@ -41,6 +41,73 @@
     2.7 +@@ -41,6 +41,74 @@
     2.8   /* data_index (num_blocks 64bit pointers, network order)...      */
     2.9   /* compressed data (gzip block compressed format)...             */
    2.10   
    2.11  +struct cloop_tail
    2.12  +{
    2.13 ++	u_int32_t table_size;
    2.14  +	u_int32_t index_size;
    2.15  +	u_int32_t num_blocks;
    2.16  +};
    2.17 @@ -28,7 +29,7 @@
    2.18  +				offsets[n].offset = __be64_to_cpu(offsets[n].offset);
    2.19  +				offsets[n].size = ntohl(offsets[n].size);
    2.20  +			}
    2.21 -+			return "128BE accelerated knoppix 1.0";
    2.22 ++			return (char *) "128BE accelerated knoppix 1.0";
    2.23  +		}
    2.24  +		else { /* V2.0 */
    2.25  +			loff_t last = __be64_to_cpu(ofs64[n]);
    2.26 @@ -37,7 +38,7 @@
    2.27  +					(offsets[n].offset = __be64_to_cpu(ofs64[n])); 
    2.28  +				last = offsets[n].offset;
    2.29  +			}
    2.30 -+			return "64BE v2.0";
    2.31 ++			return (char *) "64BE v2.0";
    2.32  +		}
    2.33  +	}
    2.34  +	else if (ofs32[1] == 0) { /* V1.0 */
    2.35 @@ -47,7 +48,7 @@
    2.36  +				(offsets[n].offset = __le64_to_cpu(ofs64[n])); 
    2.37  +			last = offsets[n].offset;
    2.38  +		}
    2.39 -+		return "64LE v1.0";
    2.40 ++		return (char *) "64LE v1.0";
    2.41  +	}
    2.42  +	else if (ntohl(ofs32[0]) == (4*n) + 0x8C) { /* V0.68 */
    2.43  +		loff_t last = ntohl(ofs32[n]);
    2.44 @@ -56,7 +57,7 @@
    2.45  +				(offsets[n].offset = ntohl(ofs32[n])); 
    2.46  +			last = offsets[n].offset;
    2.47  +		}
    2.48 -+		return "32BE v0.68";
    2.49 ++		return (char *) "32BE v0.68";
    2.50  +	}
    2.51  +	else { /* V3.0 */
    2.52  +		int i, j;
    2.53 @@ -67,7 +68,7 @@
    2.54  +			offsets[i].offset = j;
    2.55  +			j += offsets[i].size;
    2.56  +		}
    2.57 -+		return "32BE v3.0";
    2.58 ++		return (char *) "32BE v3.0";
    2.59  +	}
    2.60  +}
    2.61  +
    2.62 @@ -89,30 +90,43 @@
    2.63  
    2.64  --- cloopreader.c
    2.65  +++ cloopreader.c
    2.66 -@@ -59,10 +59,21 @@
    2.67 +@@ -59,10 +59,32 @@
    2.68   
    2.69       ALLOC(c->pblock,c->blocksize);
    2.70   
    2.71  -    c->tocsize=sizeof *c->toc * (c->numblocks+1); /* One extra address is position of EOF */
    2.72 -+    c->tocsize=sizeof(*c->toc) * c->numblocks;
    2.73 -+    if (c->numblocks == -1) {
    2.74 +-    ALLOC(c->toc,c->tocsize);
    2.75 ++    if (c->numblocks + 1 == 0) {
    2.76  +	struct cloop_tail tail;
    2.77  +	loff_t end = lseek(c->fh,0,SEEK_END); /* lseek(,-n,SEEK_END) buggy ? */
    2.78 -+
    2.79 ++	void *p;
    2.80 ++	ulong toclen, len; 
    2.81 + 
    2.82 +-    OP(read_all(c->fh,c->toc,c->tocsize));  /* read Data Index */
    2.83  +	OP(lseek(c->fh, end - sizeof(tail), SEEK_SET)); 
    2.84  +	OP(read_all(c->fh, &tail, sizeof(tail)));
    2.85  +	c->numblocks = ntohl(tail.num_blocks);
    2.86 -+	c->tocsize = ntohl(tail.index_size) * c->numblocks;
    2.87 -+	OP(lseek(c->fh, end - sizeof(tail) - c->tocsize, SEEK_SET));
    2.88 ++	c->tocsize = sizeof(*c->toc) * c->numblocks;
    2.89 ++	len = ntohl(tail.table_size);
    2.90 ++	toclen = (ntohl(tail.index_size) & 255) * c->numblocks;
    2.91 ++	OP(lseek(c->fh, end - sizeof(tail) - len, SEEK_SET));
    2.92 ++        ALLOC(c->toc,c->tocsize);
    2.93 ++        ALLOC(p,len);
    2.94 ++        OP(read_all(c->fh,p,len));  /* read Data Index */
    2.95 ++	if (uncompress((void *)c->toc,&toclen,p,len) != Z_OK)
    2.96 ++		exit(1);
    2.97 ++	free(p);
    2.98  +    }
    2.99 -     ALLOC(c->toc,c->tocsize);
   2.100 - 
   2.101 -     OP(read_all(c->fh,c->toc,c->tocsize));  /* read Data Index */
   2.102 ++    else {
   2.103 ++	c->tocsize = sizeof(*c->toc) * c->numblocks;
   2.104 ++        ALLOC(c->toc,c->tocsize);
   2.105 ++        OP(read_all(c->fh,c->toc,c->tocsize));  /* read Data Index */
   2.106 ++    }
   2.107  +    build_index(c->toc, c->numblocks);
   2.108       c->cblocksizecur=0;
   2.109       c->curblock=-1;
   2.110       return 0;
   2.111 -@@ -79,10 +90,10 @@
   2.112 +@@ -79,10 +101,10 @@
   2.113       if(page>=c->numblocks){errno=EFAULT;return -1;}
   2.114       c->curblock=page;
   2.115   
   2.116 @@ -133,7 +147,7 @@
   2.117   /* Extracts a filesystem back from a compressed fs file */
   2.118  +#define _LARGEFILE64_SOURCE
   2.119   #include "common_header.h"
   2.120 -+#define CLOOP_PREAMBLE "#!/bin/sh\n" "#V2.0 Format\n" "insmod cloop.o file=$0 && mount -r -t iso9660 /dev/cloop $1\n" "exit $?\n"
   2.121 ++#define CLOOP_PREAMBLE "#!/bin/sh\n" "#V2.0 Format\n" "modprobe cloop file=$0 && mount -r -t iso9660 /dev/cloop $1\n" "exit $?\n"
   2.122   
   2.123   int main(int argc, char *argv[])
   2.124   {
   2.125 @@ -151,7 +165,7 @@
   2.126   		exit(1);
   2.127   	}
   2.128   
   2.129 -@@ -24,44 +28,77 @@
   2.130 +@@ -24,44 +28,91 @@
   2.131   		exit(1);
   2.132   	}
   2.133   
   2.134 @@ -160,42 +174,55 @@
   2.135  -	clear_buffer = malloc(ntohl(head.block_size));
   2.136  -	fprintf(stderr, "%u blocks of size %u. Preamble:\n%s\n", 
   2.137  -		ntohl(head.num_blocks), ntohl(head.block_size), head.preamble);
   2.138 --
   2.139 ++	num_blocks = ntohl(head.num_blocks);
   2.140 ++	block_size = ntohl(head.block_size);
   2.141 ++	zblock_maxsize =  block_size + block_size/1000 + 12 + 4;
   2.142 ++	buffer = malloc(zblock_maxsize);
   2.143 ++	clear_buffer = malloc(block_size);
   2.144 + 
   2.145  -	for (i = 0; i < ntohl(head.num_blocks); i++) {
   2.146  -		int currpos;
   2.147  -		unsigned long destlen = ntohl(head.block_size);
   2.148  -		loff_t offset[2];
   2.149  -		unsigned int size;
   2.150 -+	num_blocks = ntohl(head.num_blocks);
   2.151 -+	block_size = ntohl(head.block_size);
   2.152 -+	zblock_maxsize =  block_size + block_size/1000 + 12 + 4;
   2.153 -+	buffer = malloc(zblock_maxsize);
   2.154 -+	clear_buffer = malloc(block_size);
   2.155 -+	fprintf(stderr, "%lu blocks of size %lu. Preamble:\n%s\n", 
   2.156 -+		num_blocks, block_size, head.preamble);
   2.157 -+
   2.158 -+	if (num_blocks == -1) {
   2.159 ++	if (num_blocks == (unsigned long) -1) {
   2.160 ++		void *table;
   2.161  +		struct cloop_tail tail;
   2.162 ++		unsigned long len, table_size;
   2.163  +		loff_t end = lseek64(handle, 0, SEEK_END);
   2.164 ++		
   2.165  +		if (lseek64(handle, end - sizeof(tail), SEEK_SET) < 0 ||
   2.166  +		    read(handle, &tail, sizeof(tail)) != sizeof(tail) ||
   2.167  +		    lseek64(handle, end - sizeof(tail) - 
   2.168 -+		    	  (ntohl(tail.num_blocks) * ntohl(tail.index_size)), 
   2.169 -+		    	  SEEK_SET) < 0) {
   2.170 ++		    	  ntohl(tail.table_size), SEEK_SET) < 0) {
   2.171  +			perror("Reading tail\n");
   2.172  +			exit(1);
   2.173  +		}
   2.174  +		head.num_blocks = tail.num_blocks;
   2.175  +		num_blocks = ntohl(head.num_blocks);
   2.176 -+		i = num_blocks * ntohl(tail.index_size);
   2.177 ++		table_size = ntohl(tail.table_size);
   2.178 ++		table = malloc(table_size);
   2.179 ++		len = i = num_blocks * (ntohl(tail.index_size) & 255);
   2.180 ++		offsets = malloc(num_blocks * sizeof(*offsets));
   2.181 ++		if (!table || !offsets || 
   2.182 ++		    read(handle, table, table_size) != table_size ||
   2.183 ++		    uncompress((void *)offsets, &len, table, table_size) != Z_OK ||
   2.184 ++		    len != i) {
   2.185 ++			perror("Reading index\n");
   2.186 ++			exit(1);
   2.187 ++		}
   2.188 ++		free(table);
   2.189  +	}
   2.190 -+	else i = num_blocks * sizeof(*offsets);
   2.191 -+	offsets = malloc(i);
   2.192 -+	if (!offsets || read(handle, offsets, i) != i) {
   2.193 -+		perror("Reading index\n");
   2.194 -+		exit(1);
   2.195 ++	else {
   2.196 ++		offsets = malloc(i = num_blocks * sizeof(*offsets));
   2.197 ++		if (!offsets || read(handle, offsets, i) != i) {
   2.198 ++			perror("Reading index\n");
   2.199 ++			exit(1);
   2.200 ++		}
   2.201  +	}
   2.202  +	
   2.203 ++	fprintf(stderr, "%lu blocks of size %lu. Preamble:\n%s\n", 
   2.204 ++		num_blocks, block_size, head.preamble);
   2.205  +	fprintf(stderr, "Index %s.\n", build_index(offsets, num_blocks));
   2.206  +	
   2.207  +	if (argc > 2) {
   2.208 @@ -256,7 +283,7 @@
   2.209   		if (i == 3) {
   2.210   			fprintf(stderr,
   2.211   				"Block head:%02X%02X%02X%02X%02X%02X%02X%02X\n",
   2.212 -@@ -105,12 +142,12 @@
   2.213 +@@ -105,12 +156,12 @@
   2.214   			fprintf(stderr, "Uncomp: unknown error %u\n", i);
   2.215   			exit(1);
   2.216   		}
   2.217 @@ -299,17 +326,68 @@
   2.218   	${CC} ${CFLAGS} ${LDFLAGS} -lz cloopreader.o ${FUSECFLAGS} ${FUSELDFLAGS} fusecloop.c debug.o -o fusecloop
   2.219   
   2.220  
   2.221 +
   2.222  --- create_compressed_fs.c
   2.223  +++ create_compressed_fs.c
   2.224 -@@ -0,0 +1,80 @@
   2.225 +@@ -0,0 +1,147 @@
   2.226 ++#ifdef FIND_BEST_COMPRESSION
   2.227 ++#include <compress.h>
   2.228 ++extern "C" {
   2.229 ++#include <stdlib.h>
   2.230 ++#include <string.h>
   2.231 ++
   2.232 ++static int best_compress(unsigned char *compressed,
   2.233 ++			 unsigned long *compressed_len,
   2.234 ++			 unsigned char *uncompressed,
   2.235 ++			 unsigned long uncompressed_len)
   2.236 ++{
   2.237 ++	int i, j, err;
   2.238 ++	unsigned char *buf[2];
   2.239 ++	unsigned len;
   2.240 ++	unsigned long llen,  best = *compressed_len * 2;
   2.241 ++	static unsigned char *buffer;
   2.242 ++	static unsigned long buffersz;
   2.243 ++
   2.244 ++	if (buffersz < *compressed_len) {
   2.245 ++		if (buffer) free(buffer);
   2.246 ++		buffer = (unsigned char *)  malloc(buffersz = *compressed_len);
   2.247 ++		if (!buffer) return Z_MEM_ERROR;
   2.248 ++	}
   2.249 ++	buf[0] = compressed;
   2.250 ++	buf[1] = buffer;
   2.251 ++	for (i = j = 0; i <= 10; i++) {
   2.252 ++		llen = len = *compressed_len;
   2.253 ++		if (i == 10) 
   2.254 ++			err = (compress_zlib(shrink_extreme, buf[j],
   2.255 ++		     		len, uncompressed,
   2.256 ++		     		uncompressed_len)) ? Z_OK : Z_DATA_ERROR;
   2.257 ++		else {
   2.258 ++			err = compress2(buf[j], &llen, uncompressed,
   2.259 ++				     uncompressed_len, i);
   2.260 ++			len = llen;
   2.261 ++		}
   2.262 ++		if (err != Z_OK) return err;
   2.263 ++		if (len < best) {
   2.264 ++			best = len;
   2.265 ++			j = 1 - j;
   2.266 ++		}
   2.267 ++	}
   2.268 ++	*compressed_len = best;
   2.269 ++	if (j == 0)
   2.270 ++		memcpy(compressed, buffer, best);
   2.271 ++	return err;
   2.272 ++}
   2.273 ++#define compress2(a,b,c,d,e) best_compress(a,b,c,d)
   2.274 ++#endif
   2.275 ++                        
   2.276  +/* Creates a compressed file */
   2.277  +#include "common_header.h"
   2.278  +
   2.279 -+#define CLOOP_PREAMBLE "#!/bin/sh\n" "#V3.0 Format\n" "insmod cloop.o file=$0 && mount -r -t iso9660 /dev/cloop $1\n" "exit $?\n"
   2.280 ++#define CLOOP_PREAMBLE "#!/bin/sh\n" "#V3.0 Format\n" "modprobe cloop file=$0 && mount -r -t iso9660 /dev/cloop $1\n" "exit $?\n"
   2.281  +#define CHUNK 65536
   2.282  +#define DEFAULT_BLOCKSIZE 65536
   2.283  +
   2.284 -+static void quit(char *s)
   2.285 ++static void quit(const char *s)
   2.286  +{
   2.287  +	fprintf(stderr, "%s\n", s);
   2.288  +	exit(1);
   2.289 @@ -337,6 +415,8 @@
   2.290  +	unsigned char *compressed, *uncompressed;
   2.291  +	unsigned long *index;
   2.292  +	int n, indexmax, zlenmax;
   2.293 ++	unsigned long len, pos;
   2.294 ++	static char padding[512];
   2.295  +	
   2.296  +	if (argc > 1) {
   2.297  +		if (argv[1][0] < '0' || argv[1][0] > '9')
   2.298 @@ -353,35 +433,51 @@
   2.299  +	head.num_blocks = -1;
   2.300  +	head.block_size = htonl(block_size);
   2.301  +	write(STDOUT_FILENO, &head, sizeof(head));
   2.302 ++	pos = sizeof(head);
   2.303  +	
   2.304 -+	compressed = malloc(zlenmax);
   2.305 -+	uncompressed = malloc(block_size);
   2.306 -+	index = malloc(indexmax = CHUNK);
   2.307 ++	compressed = (unsigned char *) malloc(zlenmax);
   2.308 ++	uncompressed = (unsigned char *) malloc(block_size);
   2.309 ++	index = (unsigned long *) malloc(indexmax = CHUNK);
   2.310  +	if (!compressed || !uncompressed || !index)
   2.311  +		quit("Malloc failed");
   2.312  +	
   2.313  +	for (n = 0; readblock(uncompressed, block_size); n++) {
   2.314 -+		unsigned long len = zlenmax;
   2.315 -+		
   2.316 ++		len = zlenmax;
   2.317  +		if (compress2(compressed, &len, uncompressed, block_size, 
   2.318  +				Z_BEST_COMPRESSION) != Z_OK)
   2.319  +			quit("Compression failed");
   2.320  +		fprintf(stderr, "Block %u length %lu => %lu\n",
   2.321  +			n, block_size, len);
   2.322  +		write(STDOUT_FILENO, compressed, len);
   2.323 ++		pos += len;
   2.324  +		if (n * sizeof(*index) >= indexmax) {
   2.325 -+			index = realloc(index, indexmax += CHUNK);
   2.326 ++			index = (unsigned long *) realloc(index,
   2.327 ++							  indexmax += CHUNK);
   2.328  +			if (!index)
   2.329  +				quit("Realloc");
   2.330  +		}
   2.331  +		index[n] = ntohl(len);
   2.332  +	}
   2.333 -+	write(STDOUT_FILENO, index, n * sizeof(*index));
   2.334  +	tail.index_size = ntohl(sizeof(*index));
   2.335  +	tail.num_blocks = ntohl(n);
   2.336 ++	n *= sizeof(*index);
   2.337 ++	len = n + n/1000 + 12;
   2.338 ++	compressed = (unsigned char *) realloc(compressed, n);
   2.339 ++	if (!compressed || compress2(compressed, &len, (unsigned char *) index,
   2.340 ++				     n, Z_BEST_COMPRESSION) != Z_OK)
   2.341 ++		quit("Index compression failed");
   2.342 ++	tail.table_size = ntohl(len);
   2.343 ++	pos += len + sizeof(tail);
   2.344 ++	n = pos & 511;
   2.345 ++	if (n) write(STDOUT_FILENO, padding, 512 - n);
   2.346 ++	write(STDOUT_FILENO, compressed, len);
   2.347  +	write(STDOUT_FILENO, &tail, sizeof(tail));
   2.348  +	return 0;
   2.349  +}
   2.350 ++#ifdef FIND_BEST_COMPRESSION
   2.351 ++}
   2.352 ++#endif
   2.353 +
   2.354  --- fusecloop.c
   2.355  +++ fusecloop.c
   2.356  @@ -65,7 +65,7 @@