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