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