Subversion Repositories planix.SVN

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 - 1
#include <u.h>
2
#include <libc.h>
3
#include <flate.h>
4
#include "zlib.h"
5
 
6
typedef struct Block	Block;
7
 
8
struct Block
9
{
10
	uchar	*pos;
11
	uchar	*limit;
12
};
13
 
14
static int
15
blgetc(void *vb)
16
{
17
	Block *b;
18
 
19
	b = vb;
20
	if(b->pos >= b->limit)
21
		return -1;
22
	return *b->pos++;
23
}
24
 
25
static int
26
blwrite(void *vb, void *buf, int n)
27
{
28
	Block *b;
29
 
30
	b = vb;
31
 
32
	if(n > b->limit - b->pos)
33
		n = b->limit - b->pos;
34
	memmove(b->pos, buf, n);
35
	b->pos += n;
36
	return n;
37
}
38
 
39
int
40
inflatezlibblock(uchar *dst, int dsize, uchar *src, int ssize)
41
{
42
	Block bd, bs;
43
	int ok;
44
 
45
	if(ssize < 6)
46
		return FlateInputFail;
47
 
48
	if(((src[0] << 8) | src[1]) % 31)
49
		return FlateCorrupted;
50
	if((src[0] & ZlibMeth) != ZlibDeflate
51
	|| (src[0] & ZlibCInfo) > ZlibWin32k)
52
		return FlateCorrupted;
53
 
54
	bs.pos = src + 2;
55
	bs.limit = src + ssize - 6;
56
 
57
	bd.pos = dst;
58
	bd.limit = dst + dsize;
59
 
60
	ok = inflate(&bd, blwrite, &bs, blgetc);
61
	if(ok != FlateOk)
62
		return ok;
63
 
64
	if(adler32(1, dst, bs.pos - dst) != ((bs.pos[0] << 24) | (bs.pos[1] << 16) | (bs.pos[2] << 8) | bs.pos[3]))
65
		return FlateCorrupted;
66
 
67
	return bd.pos - dst;
68
}