Home | History | Annotate | Line # | Download | only in zcat
      1  1.5  christos /*	$NetBSD: zcat.c,v 1.5 2017/01/12 01:58:03 christos Exp $	*/
      2  1.1       gwr 
      3  1.1       gwr /* mini zcat.c -- a minimal zcat using the zlib compression library
      4  1.1       gwr  * Copyright (C) 1995-1996 Jean-loup Gailly.
      5  1.1       gwr  * For conditions of distribution and use, see copyright notice in zlib.h
      6  1.1       gwr  */
      7  1.1       gwr 
      8  1.1       gwr /*
      9  1.1       gwr  * Credits, History:
     10  1.1       gwr  * This program is a reduced version of the minigzip.c
     11  1.1       gwr  * program originally written by Jean-loup Gailly.
     12  1.1       gwr  * This reduction is the work of Gordon Ross.
     13  1.1       gwr  */
     14  1.1       gwr 
     15  1.1       gwr #include <stdio.h>
     16  1.5  christos #include <stdarg.h>
     17  1.5  christos #include <stdlib.h>
     18  1.1       gwr #include <string.h>
     19  1.1       gwr #include <stdlib.h>
     20  1.5  christos #include <unistd.h>
     21  1.1       gwr 
     22  1.1       gwr #include "zlib.h"
     23  1.1       gwr 
     24  1.1       gwr #define BUFLEN 4096
     25  1.1       gwr 
     26  1.1       gwr char *prog;
     27  1.1       gwr 
     28  1.5  christos static void error(const char *, ...) __printflike(1, 2);
     29  1.5  christos static void gz_uncompress(gzFile, int);
     30  1.1       gwr 
     31  1.1       gwr /* ===========================================================================
     32  1.1       gwr  * Display error message and exit
     33  1.1       gwr  */
     34  1.5  christos static void
     35  1.5  christos error(const char *fmt, ...)
     36  1.1       gwr {
     37  1.5  christos 	char buf[1024];
     38  1.5  christos 	va_list ap;
     39  1.5  christos 	int l;
     40  1.5  christos 
     41  1.5  christos 	l = snprintf_ss(buf, sizeof(buf), "%s: ", prog);
     42  1.5  christos 	write(STDERR_FILENO, buf, l);
     43  1.5  christos 	va_start(ap, fmt);
     44  1.5  christos 	l = vsnprintf_ss(buf, sizeof(buf), fmt, ap);
     45  1.5  christos 	va_end(ap);
     46  1.5  christos 	write(STDERR_FILENO, buf, l);
     47  1.5  christos 	_exit(EXIT_SUCCESS);
     48  1.1       gwr }
     49  1.1       gwr 
     50  1.1       gwr /* ===========================================================================
     51  1.1       gwr  * Uncompress input to output then close both files.
     52  1.1       gwr  */
     53  1.5  christos static void
     54  1.5  christos gz_uncompress(gzFile in, int out)
     55  1.4   tsutsui {
     56  1.4   tsutsui 	char buf[BUFLEN];
     57  1.4   tsutsui 	int len;
     58  1.4   tsutsui 	int err;
     59  1.4   tsutsui 
     60  1.4   tsutsui 	for (;;) {
     61  1.4   tsutsui 		len = gzread(in, buf, sizeof(buf));
     62  1.4   tsutsui 		if (len < 0)
     63  1.5  christos 			error ("%s", gzerror(in, &err));
     64  1.4   tsutsui 		if (len == 0)
     65  1.4   tsutsui 			break;
     66  1.1       gwr 
     67  1.5  christos 		if ((int)write(out, buf, (size_t)len) != len) {
     68  1.4   tsutsui 			error("failed fwrite");
     69  1.4   tsutsui 		}
     70  1.1       gwr 	}
     71  1.5  christos 	if (close(out))
     72  1.4   tsutsui 		error("failed fclose");
     73  1.1       gwr 
     74  1.4   tsutsui 	if (gzclose(in) != Z_OK)
     75  1.4   tsutsui 		error("failed gzclose");
     76  1.1       gwr }
     77  1.1       gwr 
     78  1.1       gwr 
     79  1.1       gwr /* ===========================================================================
     80  1.2       gwr  * Usage:  zcat [files...]
     81  1.1       gwr  */
     82  1.1       gwr 
     83  1.5  christos int
     84  1.5  christos main(int argc, char *argv[])
     85  1.1       gwr {
     86  1.4   tsutsui 	gzFile zfp;
     87  1.1       gwr 
     88  1.1       gwr 	/* save program name and skip */
     89  1.4   tsutsui 	prog = argv[0];
     90  1.4   tsutsui 	argc--, argv++;
     91  1.1       gwr 
     92  1.1       gwr 	/* ignore any switches */
     93  1.1       gwr 	while (*argv && (**argv == '-')) {
     94  1.4   tsutsui 		argc--, argv++;
     95  1.4   tsutsui 	}
     96  1.1       gwr 
     97  1.4   tsutsui 	if (argc == 0) {
     98  1.5  christos 		zfp = gzdopen(STDIN_FILENO, "rb");
     99  1.1       gwr 		if (zfp == NULL)
    100  1.1       gwr 			error("can't gzdopen stdin");
    101  1.5  christos 		gz_uncompress(zfp, STDOUT_FILENO);
    102  1.1       gwr 		return 0;
    103  1.4   tsutsui 	}
    104  1.1       gwr 
    105  1.1       gwr 	do {
    106  1.1       gwr 		/* file_uncompress(*argv); */
    107  1.1       gwr 		zfp = gzopen(*argv, "rb");
    108  1.1       gwr 		if (zfp == NULL) {
    109  1.5  christos 			error("can't gzopen `%s'", *argv);
    110  1.5  christos 			_exit(EXIT_FAILURE);
    111  1.1       gwr 		}
    112  1.5  christos 		gz_uncompress(zfp, STDOUT_FILENO);
    113  1.1       gwr 	} while (argv++, --argc);
    114  1.4   tsutsui 	return 0; /* to avoid warning */
    115  1.2       gwr }
    116  1.2       gwr 
    117  1.2       gwr 
    118  1.2       gwr /*
    119  1.2       gwr  * XXX: hacks to keep gzio.c from pulling in deflate stuff
    120  1.2       gwr  */
    121  1.2       gwr 
    122  1.4   tsutsui int deflateInit2_(z_streamp strm, int  level, int  method,
    123  1.4   tsutsui     int windowBits, int memLevel, int strategy,
    124  1.4   tsutsui     const char *version, int stream_size)
    125  1.2       gwr {
    126  1.4   tsutsui 
    127  1.4   tsutsui 	return -1;
    128  1.2       gwr }
    129  1.2       gwr 
    130  1.4   tsutsui int deflate(z_streamp strm, int flush)
    131  1.2       gwr {
    132  1.4   tsutsui 
    133  1.4   tsutsui 	return -1;
    134  1.2       gwr }
    135  1.2       gwr 
    136  1.4   tsutsui int deflateEnd(z_streamp strm)
    137  1.2       gwr {
    138  1.4   tsutsui 
    139  1.4   tsutsui 	return -1;
    140  1.3   thorpej }
    141  1.3   thorpej 
    142  1.4   tsutsui int deflateParams(z_streamp strm, int level, int strategy)
    143  1.3   thorpej {
    144  1.4   tsutsui 
    145  1.4   tsutsui 	return Z_STREAM_ERROR;
    146  1.1       gwr }
    147