zcat.c revision 1.5 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