unbzip2.c revision 1.2 1 /* $NetBSD: unbzip2.c,v 1.2 2004/03/30 09:15:07 mrg Exp $ */
2
3 /* This file is #included by gzip.c */
4
5 static off_t
6 unbzip2(int in, int out)
7 {
8 FILE *f_in;
9 BZFILE *b_in;
10 int bzerror, n;
11 off_t bytes_out = 0;
12 char buffer[64 * 1024];
13
14 if ((in = dup(in)) < 0)
15 maybe_err(1, "dup");
16
17 if ((f_in = fdopen(in, "r")) == NULL)
18 maybe_err(1, "fdopen");
19
20 if ((b_in = BZ2_bzReadOpen(&bzerror, f_in, 0, 0, NULL, 0)) == NULL)
21 maybe_err(1, "BZ2_bzReadOpen");
22
23 do {
24 n = BZ2_bzRead(&bzerror, b_in, buffer, sizeof (buffer));
25
26 switch (bzerror) {
27 case BZ_IO_ERROR:
28 maybe_errx(1, "bzip2 I/O error");
29 case BZ_UNEXPECTED_EOF:
30 maybe_errx(1, "bzip2 unexpected end of file");
31 case BZ_DATA_ERROR:
32 maybe_errx(1, "bzip2 data integrity error");
33 case BZ_DATA_ERROR_MAGIC:
34 maybe_errx(1, "bzip2 magic number error");
35 case BZ_MEM_ERROR:
36 maybe_errx(1, "bzip2 out of memory");
37 case BZ_OK:
38 case BZ_STREAM_END:
39 break;
40 default:
41 maybe_errx(1, "bzip2 unknown error");
42 }
43
44 if ((n = write(out, buffer, n)) < 0)
45 maybe_err(1, "write");
46 bytes_out += n;
47 } while (bzerror != BZ_STREAM_END);
48
49 (void)BZ2_bzReadClose(&bzerror, b_in);
50 (void)fclose(f_in);
51
52
53 return (bytes_out);
54 }
55