wok-next rev 10932
fusecloop: add old version support
author | Pascal Bellard <pascal.bellard@slitaz.org> |
---|---|
date | Fri Aug 26 17:50:10 2011 +0200 (2011-08-26) |
parents | 149e9a44c474 |
children | 9de4fcf2f70c |
files | fusecloop/receipt fusecloop/stuff/fusecloop.u |
line diff
1.1 --- a/fusecloop/receipt Fri Aug 26 13:57:39 2011 +0200 1.2 +++ b/fusecloop/receipt Fri Aug 26 17:50:10 2011 +0200 1.3 @@ -1,11 +1,11 @@ 1.4 # SliTaz package receipt. 1.5 1.6 PACKAGE="fusecloop" 1.7 -VERSION="0.20.0" 1.8 +VERSION="0.20.1" 1.9 CATEGORY="system-tools" 1.10 SHORT_DESC="Mount cloop image in user space with fuse." 1.11 MAINTAINER="pascal.bellard@slitaz.org" 1.12 -TARBALL="$PACKAGE-$VERSION.tar.bz2" 1.13 +TARBALL="$PACKAGE-$VERSION.tar.gz" 1.14 WEB_SITE="http://$PACKAGE.sourceforge.net/" 1.15 WGET_URL="$SF_MIRROR/$PACKAGE/$TARBALL" 1.16 DEPENDS="fuse zlib" 1.17 @@ -17,6 +17,7 @@ 1.18 { 1.19 cd $src 1.20 sed -i 's/dprintf/d_printf/g' *.h *.c 1.21 + patch -p0 < ../stuff/fusecloop.u 1.22 ./configure --prefix=/usr --infodir=/usr/share/info \ 1.23 --mandir=/usr/share/man $CONFIGURE_ARGS && 1.24 make
2.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 2.2 +++ b/fusecloop/stuff/fusecloop.u Fri Aug 26 17:50:10 2011 +0200 2.3 @@ -0,0 +1,160 @@ 2.4 +--- compressed_loop.h 2.5 ++++ compressed_loop.h 2.6 +@@ -41,6 +41,55 @@ 2.7 + /* data_index (num_blocks 64bit pointers, network order)... */ 2.8 + /* compressed data (gzip block compressed format)... */ 2.9 + 2.10 ++struct block_info 2.11 ++{ 2.12 ++ loff_t offset; /* 64-bit offsets of compressed block */ 2.13 ++ u_int32_t size; /* 32-bit compressed block size */ 2.14 ++ u_int32_t optidx; /* 32-bit index number */ 2.15 ++}; 2.16 ++ 2.17 ++static inline char *build_index(struct block_info *offsets, unsigned long n) 2.18 ++{ 2.19 ++ u_int32_t *ofs32 = (u_int32_t *) offsets; 2.20 ++ loff_t *ofs64 = (loff_t *) offsets; 2.21 ++ if (ofs32[0] == 0) { 2.22 ++ if (ofs32[2]) { /* ACCELERATED KNOPPIX V1.0 */ 2.23 ++ do { 2.24 ++ offsets[n].offset = __be64_to_cpu(offsets[n].offset); 2.25 ++ offsets[n].size = ntohl(offsets[n].size); 2.26 ++ } while (n--); 2.27 ++ return "128BE accelerated knoppix 1.0"; 2.28 ++ } 2.29 ++ else { /* V2.0 */ 2.30 ++ loff_t last = __be64_to_cpu(ofs64[n+1]); 2.31 ++ do { 2.32 ++ offsets[n].size = last - 2.33 ++ (offsets[n].offset = __be64_to_cpu(ofs64[n])); 2.34 ++ last = offsets[n].offset; 2.35 ++ } while (n--); 2.36 ++ return "64BE v2.0"; 2.37 ++ } 2.38 ++ } 2.39 ++ else if (ofs32[1] == 0) { /* V1.0 */ 2.40 ++ loff_t last = __be64_to_cpu(ofs64[n+1]); 2.41 ++ do { 2.42 ++ offsets[n].size = last - 2.43 ++ (offsets[n].offset = __le64_to_cpu(ofs64[n])); 2.44 ++ last = offsets[n].offset; 2.45 ++ } while (n--); 2.46 ++ return "64LE v1.0"; 2.47 ++ } 2.48 ++ else { /* V0.68 */ 2.49 ++ loff_t last = ntohl(ofs32[n+1]); 2.50 ++ do { 2.51 ++ offsets[n].size = last - 2.52 ++ (offsets[n].offset = ntohl(ofs32[n])); 2.53 ++ last = offsets[n].offset; 2.54 ++ } while (n--); 2.55 ++ return "32BE v0.68"; 2.56 ++ } 2.57 ++} 2.58 ++ 2.59 + /* Cloop suspend IOCTL */ 2.60 + #define CLOOP_SUSPEND 0x4C07 2.61 + 2.62 + 2.63 +--- cloopreader.h 2.64 ++++ cloopreader.h 2.65 +@@ -33,7 +33,7 @@ 2.66 + int numblocks; 2.67 + ulong blocksize; 2.68 + 2.69 +- loff_t* toc; /* Data index */ 2.70 ++ struct block_info *toc; /* Data index */ 2.71 + size_t tocsize; 2.72 + 2.73 + unsigned char* cblock; /* Compressed block */ 2.74 + 2.75 +--- cloopreader.c 2.76 ++++ cloopreader.c 2.77 +@@ -59,10 +59,11 @@ 2.78 + 2.79 + ALLOC(c->pblock,c->blocksize); 2.80 + 2.81 +- c->tocsize=sizeof *c->toc * (c->numblocks+1); /* One extra address is position of EOF */ 2.82 ++ c->tocsize=sizeof(*c->toc) * c->numblocks; 2.83 + ALLOC(c->toc,c->tocsize); 2.84 + 2.85 + OP(read_all(c->fh,c->toc,c->tocsize)); /* read Data Index */ 2.86 ++ build_index(c->toc, c->numblocks); 2.87 + c->cblocksizecur=0; 2.88 + c->curblock=-1; 2.89 + return 0; 2.90 +@@ -79,10 +80,10 @@ 2.91 + if(page>=c->numblocks){errno=EFAULT;return -1;} 2.92 + c->curblock=page; 2.93 + 2.94 +- bprintf("Seeking to 0x%Lx\n",btc(c->toc[page])); 2.95 +- OP(lseek(c->fh,btc(c->toc[page]), SEEK_SET)); 2.96 ++ bprintf("Seeking to 0x%Lx\n",c->toc[page].offset); 2.97 ++ OP(lseek(c->fh,c->toc[page].offset, SEEK_SET)); 2.98 + 2.99 +- c->cblocksize=btc(c->toc[page+1]) - btc(c->toc[page]); 2.100 ++ c->cblocksize=c->toc[page].size; 2.101 + bprintf("Compressed size=%lu\n",c->cblocksize); 2.102 + if(c->cblocksize > c->cblocksizecur){ 2.103 + if(c->cblocksizecur)free(c->cblock); 2.104 +--- extract_compressed_fs.c 2.105 ++++ extract_compressed_fs.c 2.106 +@@ -7,6 +7,7 @@ 2.107 + struct cloop_head head; 2.108 + unsigned int i; 2.109 + unsigned char *buffer, *clear_buffer; 2.110 ++ struct block_info *offsets; 2.111 + 2.112 + if (argc != 2) { 2.113 + fprintf(stderr, "Need filename\n"); 2.114 +@@ -30,35 +31,34 @@ 2.115 + fprintf(stderr, "%u blocks of size %u. Preamble:\n%s\n", 2.116 + ntohl(head.num_blocks), ntohl(head.block_size), head.preamble); 2.117 + 2.118 ++ i = ntohl(head.num_blocks) * sizeof(*offsets); 2.119 ++ offsets = malloc(i); 2.120 ++ if (!offsets || read(handle, offsets, i) != i) { 2.121 ++ perror("Reading index\n"); 2.122 ++ exit(1); 2.123 ++ } 2.124 ++ 2.125 ++ fprintf(stderr, "Index %s.\n", 2.126 ++ build_index(offsets, ntohl(head.num_blocks))); 2.127 ++ 2.128 + for (i = 0; i < ntohl(head.num_blocks); i++) { 2.129 +- int currpos; 2.130 + unsigned long destlen = ntohl(head.block_size); 2.131 +- loff_t offset[2]; 2.132 +- unsigned int size; 2.133 ++ unsigned int size = offsets[i].size; 2.134 + 2.135 +- read(handle, &offset, 2*sizeof(loff_t)); 2.136 +- lseek(handle, -sizeof(loff_t), SEEK_CUR); 2.137 +- 2.138 +- currpos = lseek(handle, 0, SEEK_CUR); 2.139 +- if (lseek(handle, __be64_to_cpu(offset[0]), SEEK_SET) < 0) { 2.140 ++ if (lseek(handle, offsets[i].offset, SEEK_SET) < 0) { 2.141 + fprintf(stderr, "lseek to %Lu: %s\n", 2.142 +- __be64_to_cpu(offset[0]), strerror(errno)); 2.143 ++ offsets[i].offset, strerror(errno)); 2.144 + exit(1); 2.145 + } 2.146 + 2.147 +- size=__be64_to_cpu(offset[1])-__be64_to_cpu(offset[0]); 2.148 + if (size > ntohl(head.block_size) + ntohl(head.block_size)/1000 2.149 + + 12 + 4) { 2.150 + fprintf(stderr, 2.151 + "Size %u for block %u (offset %Lu) too big\n", 2.152 +- size, i, __be64_to_cpu(offset[0])); 2.153 ++ size, i, offsets[i].offset); 2.154 + exit(1); 2.155 + } 2.156 + read(handle, buffer, size); 2.157 +- if (lseek(handle, currpos, SEEK_SET) < 0) { 2.158 +- perror("seeking"); 2.159 +- exit(1); 2.160 +- } 2.161 + 2.162 + fprintf(stderr, "Block %u length %u => %lu\n", 2.163 + i, size, destlen);