wok-next diff fusecloop/stuff/fusecloop.u @ rev 10933
fusecloop: add v3.0 support
author | Pascal Bellard <pascal.bellard@slitaz.org> |
---|---|
date | Fri Aug 26 20:39:15 2011 +0200 (2011-08-26) |
parents | ff0097ff50cd |
children | 65b7fa14f14f |
line diff
1.1 --- a/fusecloop/stuff/fusecloop.u Fri Aug 26 17:50:10 2011 +0200 1.2 +++ b/fusecloop/stuff/fusecloop.u Fri Aug 26 20:39:15 2011 +0200 1.3 @@ -1,9 +1,15 @@ 1.4 --- compressed_loop.h 1.5 +++ compressed_loop.h 1.6 -@@ -41,6 +41,55 @@ 1.7 +@@ -41,6 +41,85 @@ 1.8 /* data_index (num_blocks 64bit pointers, network order)... */ 1.9 /* compressed data (gzip block compressed format)... */ 1.10 1.11 ++struct cloop_tail 1.12 ++{ 1.13 ++ u_int32_t index_size; 1.14 ++ u_int32_t num_blocks; 1.15 ++}; 1.16 ++ 1.17 +struct block_info 1.18 +{ 1.19 + loff_t offset; /* 64-bit offsets of compressed block */ 1.20 @@ -11,46 +17,70 @@ 1.21 + u_int32_t optidx; /* 32-bit index number */ 1.22 +}; 1.23 + 1.24 -+static inline char *build_index(struct block_info *offsets, unsigned long n) 1.25 ++static inline char *build_index(struct block_info *offsets, unsigned long n, 1.26 ++ unsigned long block_size) 1.27 +{ 1.28 ++ u_int16_t *ofs16 = (u_int16_t *) offsets; 1.29 + u_int32_t *ofs32 = (u_int32_t *) offsets; 1.30 + loff_t *ofs64 = (loff_t *) offsets; 1.31 ++ 1.32 + if (ofs32[0] == 0) { 1.33 + if (ofs32[2]) { /* ACCELERATED KNOPPIX V1.0 */ 1.34 -+ do { 1.35 ++ while (n--) { 1.36 + offsets[n].offset = __be64_to_cpu(offsets[n].offset); 1.37 + offsets[n].size = ntohl(offsets[n].size); 1.38 -+ } while (n--); 1.39 ++ } 1.40 + return "128BE accelerated knoppix 1.0"; 1.41 + } 1.42 + else { /* V2.0 */ 1.43 -+ loff_t last = __be64_to_cpu(ofs64[n+1]); 1.44 -+ do { 1.45 ++ loff_t last = __be64_to_cpu(ofs64[n]); 1.46 ++ while (n--) { 1.47 + offsets[n].size = last - 1.48 + (offsets[n].offset = __be64_to_cpu(ofs64[n])); 1.49 + last = offsets[n].offset; 1.50 -+ } while (n--); 1.51 ++ } 1.52 + return "64BE v2.0"; 1.53 + } 1.54 + } 1.55 + else if (ofs32[1] == 0) { /* V1.0 */ 1.56 -+ loff_t last = __be64_to_cpu(ofs64[n+1]); 1.57 -+ do { 1.58 ++ loff_t last = __be64_to_cpu(ofs64[n]); 1.59 ++ while (n--) { 1.60 + offsets[n].size = last - 1.61 + (offsets[n].offset = __le64_to_cpu(ofs64[n])); 1.62 + last = offsets[n].offset; 1.63 -+ } while (n--); 1.64 ++ } 1.65 + return "64LE v1.0"; 1.66 + } 1.67 -+ else { /* V0.68 */ 1.68 -+ loff_t last = ntohl(ofs32[n+1]); 1.69 -+ do { 1.70 ++ else if (ntohl(ofs32[0]) == (4*n) + 0x8C) { /* V0.68 */ 1.71 ++ loff_t last = ntohl(ofs32[n]); 1.72 ++ while (n--) { 1.73 + offsets[n].size = last - 1.74 + (offsets[n].offset = ntohl(ofs32[n])); 1.75 + last = offsets[n].offset; 1.76 -+ } while (n--); 1.77 ++ } 1.78 + return "32BE v0.68"; 1.79 + } 1.80 ++ else { /* V3.0 */ 1.81 ++ char *type; 1.82 ++ int i, j, smallest; 1.83 ++ 1.84 ++ smallest = (block_size < 32768) ? 0 : block_size>>10; 1.85 ++ if (block_size > 0x10000) { 1.86 ++ for (i = 0; i < n; i++) 1.87 ++ offsets[n].size = smallest + ntohl(ofs32[n]); 1.88 ++ type = "32BE size v3.0"; 1.89 ++ } 1.90 ++ else { 1.91 ++ for (i = 0; i < n; i++) 1.92 ++ offsets[n].size = smallest + ntohs(ofs16[n]); 1.93 ++ type = "16BE size v3.0"; 1.94 ++ } 1.95 ++ for (i = j = 0; i < n; i++) { 1.96 ++ offsets[i].offset = j; 1.97 ++ j += offsets[i].size; 1.98 ++ } 1.99 ++ return type; 1.100 ++ } 1.101 +} 1.102 + 1.103 /* Cloop suspend IOCTL */ 1.104 @@ -71,20 +101,29 @@ 1.105 1.106 --- cloopreader.c 1.107 +++ cloopreader.c 1.108 -@@ -59,10 +59,11 @@ 1.109 +@@ -59,10 +59,20 @@ 1.110 1.111 ALLOC(c->pblock,c->blocksize); 1.112 1.113 - c->tocsize=sizeof *c->toc * (c->numblocks+1); /* One extra address is position of EOF */ 1.114 + c->tocsize=sizeof(*c->toc) * c->numblocks; 1.115 ++ if (c->numblocks == -1) { 1.116 ++ struct cloop_tail tail; 1.117 ++ 1.118 ++ OP(lseek(c->fh, - sizeof(tail), SEEK_END)); 1.119 ++ OP(read_all(c->fh, &tail, sizeof(tail))); 1.120 ++ c->numblocks = ntohl(tail.num_blocks); 1.121 ++ c->tocsize = ntohl(tail.index_size) * c->numblocks; 1.122 ++ OP(lseek(c->fh, - sizeof(tail) - c->tocsize, SEEK_END)); 1.123 ++ } 1.124 ALLOC(c->toc,c->tocsize); 1.125 1.126 OP(read_all(c->fh,c->toc,c->tocsize)); /* read Data Index */ 1.127 -+ build_index(c->toc, c->numblocks); 1.128 ++ build_index(c->toc, c->numblocks, c->blocksize); 1.129 c->cblocksizecur=0; 1.130 c->curblock=-1; 1.131 return 0; 1.132 -@@ -79,10 +80,10 @@ 1.133 +@@ -79,10 +89,10 @@ 1.134 if(page>=c->numblocks){errno=EFAULT;return -1;} 1.135 c->curblock=page; 1.136 1.137 @@ -98,6 +137,7 @@ 1.138 bprintf("Compressed size=%lu\n",c->cblocksize); 1.139 if(c->cblocksize > c->cblocksizecur){ 1.140 if(c->cblocksizecur)free(c->cblock); 1.141 + 1.142 --- extract_compressed_fs.c 1.143 +++ extract_compressed_fs.c 1.144 @@ -7,6 +7,7 @@ 1.145 @@ -108,19 +148,33 @@ 1.146 1.147 if (argc != 2) { 1.148 fprintf(stderr, "Need filename\n"); 1.149 -@@ -30,35 +31,34 @@ 1.150 +@@ -30,35 +31,48 @@ 1.151 fprintf(stderr, "%u blocks of size %u. Preamble:\n%s\n", 1.152 ntohl(head.num_blocks), ntohl(head.block_size), head.preamble); 1.153 1.154 -+ i = ntohl(head.num_blocks) * sizeof(*offsets); 1.155 ++ i = ntohl(head.num_blocks); 1.156 ++ if (i == -1) { 1.157 ++ struct cloop_tail tail; 1.158 ++ if (lseek(handle, - sizeof(tail), SEEK_END) < 0 || 1.159 ++ read(handle, &tail, sizeof(tail)) != sizeof(tail) || 1.160 ++ lseek(handle, - sizeof(tail) - 1.161 ++ (ntohl(tail.num_blocks) * ntohl(tail.index_size)), 1.162 ++ SEEK_END) < 0) { 1.163 ++ perror("Reading tail\n"); 1.164 ++ exit(1); 1.165 ++ } 1.166 ++ head.num_blocks = tail.num_blocks; 1.167 ++ i = ntohl(tail.num_blocks) * ntohl(tail.index_size); 1.168 ++ } 1.169 ++ else i *= sizeof(*offsets); 1.170 + offsets = malloc(i); 1.171 + if (!offsets || read(handle, offsets, i) != i) { 1.172 + perror("Reading index\n"); 1.173 + exit(1); 1.174 + } 1.175 + 1.176 -+ fprintf(stderr, "Index %s.\n", 1.177 -+ build_index(offsets, ntohl(head.num_blocks))); 1.178 ++ fprintf(stderr, "Index %s.\n", build_index(offsets, 1.179 ++ ntohl(head.num_blocks), ntohl(head.block_size))); 1.180 + 1.181 for (i = 0; i < ntohl(head.num_blocks); i++) { 1.182 - int currpos;