Split out decompression functions and jigdo parsing functions into
[jigit.git] / decompress.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <errno.h>
4 #include <string.h>
5 #include <fcntl.h>
6 #include <sys/types.h>
7 #include <sys/stat.h>
8 #include <limits.h>
9 #include <zlib.h>
10 #ifdef BZ2_SUPPORT
11 #   include <bzlib.h>
12 #endif
13 #include "jte.h"
14
15 static int ungzip_data_block(char *in_buf, INT64 in_len, char *out_buf, INT64 out_len)
16 {
17     int error = 0;
18     z_stream uc_stream;
19     
20     uc_stream.zalloc = NULL;
21     uc_stream.zfree = NULL;
22     uc_stream.opaque = NULL;
23     uc_stream.next_in = (unsigned char *)in_buf;
24     uc_stream.avail_in = in_len;
25
26     error = inflateInit(&uc_stream);
27     if (Z_OK != error)
28     {
29         fprintf(logfile, "ungzip_data_block: failed to init, error %d\n", error);
30         return EIO;
31     }
32     
33     uc_stream.next_out = (unsigned char *)out_buf;
34     uc_stream.avail_out = out_len;
35
36     error = inflate(&uc_stream, Z_FINISH);
37     if (Z_OK != error && Z_STREAM_END != error)
38     {
39         fprintf(logfile, "ungzip_data_block: failed to decompress, error %d\n", error);
40         return EIO;
41     }
42     
43     error = inflateEnd(&uc_stream);
44     if (Z_OK != error)
45     {
46         fprintf(logfile, "ungzip_data_block: failed to end, error %d\n", error);
47         return EIO;
48     }
49     
50     return 0;
51 }    
52
53 #ifdef BZ2_SUPPORT
54 static int unbzip_data_block(char *in_buf, INT64 in_len, char *out_buf, INT64 out_len)
55 {
56     int error = 0;
57     bz_stream uc_stream;
58     
59     uc_stream.bzalloc = NULL;
60     uc_stream.bzfree = NULL;
61     uc_stream.opaque = NULL;
62     uc_stream.next_in = in_buf;
63     uc_stream.avail_in = in_len;
64
65     error = BZ2_bzDecompressInit(&uc_stream, 0, 0);
66     if (BZ_OK != error)
67     {
68         fprintf(logfile, "unbzip_data_block: failed to init, error %d\n", error);
69         return EIO;
70     }
71     
72     uc_stream.next_out = out_buf;
73     uc_stream.avail_out = out_len;
74
75     error = BZ2_bzDecompress(&uc_stream);
76     if (BZ_OK != error && BZ_STREAM_END != error)
77     {
78         fprintf(logfile, "unbzip_data_block: failed to decompress, error %d\n", error);
79         return EIO;
80     }
81     
82     error = BZ2_bzDecompressEnd(&uc_stream);
83     if (BZ_OK != error)
84     {
85         fprintf(logfile, "unbzip_data_block: failed to end, error %d\n", error);
86         return EIO;
87     }
88     
89     return 0;
90 }    
91 #endif
92
93 int decompress_data_block(char *in_buf, INT64 in_len, char *out_buf,
94                                  INT64 out_len, int compress_type)
95 {
96 #ifdef BZ2_SUPPORT
97     if (CT_BZIP2 == compress_type)
98         return unbzip_data_block(in_buf, in_len, out_buf, out_len);
99     else
100 #endif
101         return ungzip_data_block(in_buf, in_len, out_buf, out_len);
102 }
103