Blame


1 b6afd33e 2003-11-23 devnull #include <u.h>
2 b6afd33e 2003-11-23 devnull #include <libc.h>
3 b6afd33e 2003-11-23 devnull #include <flate.h>
4 b6afd33e 2003-11-23 devnull #include "zlib.h"
5 b6afd33e 2003-11-23 devnull
6 b6afd33e 2003-11-23 devnull typedef struct ZWrite ZWrite;
7 b6afd33e 2003-11-23 devnull
8 b6afd33e 2003-11-23 devnull struct ZWrite
9 b6afd33e 2003-11-23 devnull {
10 b6afd33e 2003-11-23 devnull ulong adler;
11 b6afd33e 2003-11-23 devnull void *wr;
12 b6afd33e 2003-11-23 devnull int (*w)(void*, void*, int);
13 b6afd33e 2003-11-23 devnull };
14 b6afd33e 2003-11-23 devnull
15 b6afd33e 2003-11-23 devnull static int
16 b6afd33e 2003-11-23 devnull zlwrite(void *vzw, void *buf, int n)
17 b6afd33e 2003-11-23 devnull {
18 b6afd33e 2003-11-23 devnull ZWrite *zw;
19 b6afd33e 2003-11-23 devnull
20 b6afd33e 2003-11-23 devnull zw = vzw;
21 b6afd33e 2003-11-23 devnull zw->adler = adler32(zw->adler, buf, n);
22 b6afd33e 2003-11-23 devnull n = (*zw->w)(zw->wr, buf, n);
23 b6afd33e 2003-11-23 devnull if(n <= 0)
24 b6afd33e 2003-11-23 devnull return n;
25 b6afd33e 2003-11-23 devnull return n;
26 b6afd33e 2003-11-23 devnull }
27 b6afd33e 2003-11-23 devnull
28 b6afd33e 2003-11-23 devnull int
29 b6afd33e 2003-11-23 devnull inflatezlib(void *wr, int (*w)(void*, void*, int), void *getr, int (*get)(void*))
30 b6afd33e 2003-11-23 devnull {
31 b6afd33e 2003-11-23 devnull ZWrite zw;
32 b6afd33e 2003-11-23 devnull ulong v;
33 b6afd33e 2003-11-23 devnull int c, i;
34 b6afd33e 2003-11-23 devnull
35 b6afd33e 2003-11-23 devnull c = (*get)(getr);
36 b6afd33e 2003-11-23 devnull if(c < 0)
37 b6afd33e 2003-11-23 devnull return FlateInputFail;
38 b6afd33e 2003-11-23 devnull i = (*get)(getr);
39 b6afd33e 2003-11-23 devnull if(i < 0)
40 b6afd33e 2003-11-23 devnull return FlateInputFail;
41 b6afd33e 2003-11-23 devnull
42 b6afd33e 2003-11-23 devnull if(((c << 8) | i) % 31)
43 b6afd33e 2003-11-23 devnull return FlateCorrupted;
44 b6afd33e 2003-11-23 devnull if((c & ZlibMeth) != ZlibDeflate
45 b6afd33e 2003-11-23 devnull || (c & ZlibCInfo) > ZlibWin32k)
46 b6afd33e 2003-11-23 devnull return FlateCorrupted;
47 b6afd33e 2003-11-23 devnull
48 b6afd33e 2003-11-23 devnull zw.wr = wr;
49 b6afd33e 2003-11-23 devnull zw.w = w;
50 b6afd33e 2003-11-23 devnull zw.adler = 1;
51 b6afd33e 2003-11-23 devnull i = inflate(&zw, zlwrite, getr, get);
52 b6afd33e 2003-11-23 devnull if(i != FlateOk)
53 b6afd33e 2003-11-23 devnull return i;
54 b6afd33e 2003-11-23 devnull
55 b6afd33e 2003-11-23 devnull v = 0;
56 b6afd33e 2003-11-23 devnull for(i = 0; i < 4; i++){
57 b6afd33e 2003-11-23 devnull c = (*get)(getr);
58 b6afd33e 2003-11-23 devnull if(c < 0)
59 b6afd33e 2003-11-23 devnull return FlateInputFail;
60 b6afd33e 2003-11-23 devnull v = (v << 8) | c;
61 b6afd33e 2003-11-23 devnull }
62 b6afd33e 2003-11-23 devnull if(zw.adler != v)
63 b6afd33e 2003-11-23 devnull return FlateCorrupted;
64 b6afd33e 2003-11-23 devnull
65 b6afd33e 2003-11-23 devnull return FlateOk;
66 b6afd33e 2003-11-23 devnull }