Home | History | Annotate | Line # | Download | only in gzip
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