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