diff options
Diffstat (limited to 'isys/gzlib/gzip.c')
-rw-r--r-- | isys/gzlib/gzip.c | 536 |
1 files changed, 0 insertions, 536 deletions
diff --git a/isys/gzlib/gzip.c b/isys/gzlib/gzip.c deleted file mode 100644 index 77eb3f256..000000000 --- a/isys/gzlib/gzip.c +++ /dev/null @@ -1,536 +0,0 @@ -/* gzip (GNU zip) -- compress files with zip algorithm and 'compress' interface - * Copyright (C) 1992-1993 Jean-loup Gailly - * The unzip code was written and put in the public domain by Mark Adler. - * Portions of the lzw code are derived from the public domain 'compress' - * written by Spencer Thomas, Joe Orost, James Woods, Jim McKie, Steve Davies, - * Ken Turkowski, Dave Mack and Peter Jannesen. - * - * See the license_msg below and the file COPYING for the software license. - * See the file algorithm.doc for the compression algorithms and file formats. - */ - - -/* Compress files with zip algorithm and 'compress' interface. - * See usage() and help() functions below for all options. - * Outputs: - * file.gz: compressed file with same mode, owner, and utimes - * or stdout with -c option or if stdin used as input. - * If the output file name had to be truncated, the original name is kept - * in the compressed file. - * On MSDOS, file.tmp -> file.tmz. On VMS, file.tmp -> file.tmp-gz. - * - * Using gz on MSDOS would create too many file name conflicts. For - * example, foo.txt -> foo.tgz (.tgz must be reserved as shorthand for - * tar.gz). Similarly, foo.dir and foo.doc would both be mapped to foo.dgz. - * I also considered 12345678.txt -> 12345txt.gz but this truncates the name - * too heavily. There is no ideal solution given the MSDOS 8+3 limitation. - * - * For the meaning of all compilation flags, see comments in Makefile.in. - */ - -#ifdef RCSID -static char rcsid[] = "$Id$"; -#endif - -#include <config.h> -#include <ctype.h> -#include <sys/types.h> -#include <signal.h> -#include <sys/stat.h> -#include <errno.h> - -#include "tailor.h" -#include "gzip.h" -#include "lzw.h" - - /* configuration */ - -#ifdef HAVE_TIME_H -# include <time.h> -#else -# include <sys/time.h> -#endif - -#ifdef HAVE_FCNTL_H -# include <fcntl.h> -#endif - -#ifdef HAVE_LIMITS_H -# include <limits.h> -#endif - -#ifdef HAVE_UNISTD_H -# include <unistd.h> -#endif - -#if defined STDC_HEADERS || defined HAVE_STDLIB_H -# include <stdlib.h> -#endif - -#ifdef HAVE_DIRENT_H -# include <dirent.h> -# define NAMLEN(direct) strlen((direct)->d_name) -# define DIR_OPT "DIRENT" -#else -# define dirent direct -# define NAMLEN(direct) ((direct)->d_namlen) -# ifdef HAVE_SYS_NDIR_H -# include <sys/ndir.h> -# define DIR_OPT "SYS_NDIR" -# endif -# ifdef HAVE_SYS_DIR_H -# include <sys/dir.h> -# define DIR_OPT "SYS_DIR" -# endif -# ifdef HAVE_NDIR_H -# include <ndir.h> -# define DIR_OPT "NDIR" -# endif -# ifndef DIR_OPT -# define DIR_OPT "NO_DIR" -# endif -#endif - -#ifdef CLOSEDIR_VOID -# define CLOSEDIR(d) (closedir(d), 0) -#else -# define CLOSEDIR(d) closedir(d) -#endif - -#ifdef HAVE_UTIME -# ifdef HAVE_UTIME_H -# include <utime.h> -# define TIME_OPT "UTIME" -# else -# ifdef HAVE_SYS_UTIME_H -# include <sys/utime.h> -# define TIME_OPT "SYS_UTIME" -# else - struct utimbuf { - time_t actime; - time_t modtime; - }; -# define TIME_OPT "STRUCT_UTIMBUF" -# endif -# endif -#else -# define TIME_OPT "NO_UTIME" -#endif - -#if !defined(S_ISDIR) && defined(S_IFDIR) -# define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR) -#endif -#if !defined(S_ISREG) && defined(S_IFREG) -# define S_ISREG(m) (((m) & S_IFMT) == S_IFREG) -#endif - -typedef RETSIGTYPE (*sig_type) OF((int)); - -#ifndef O_BINARY -# define O_BINARY 0 /* creation mode for open() */ -#endif - -#ifndef O_CREAT - /* Pure BSD system? */ -# include <sys/file.h> -# ifndef O_CREAT -# define O_CREAT FCREAT -# endif -# ifndef O_EXCL -# define O_EXCL FEXCL -# endif -#endif - -#ifndef S_IRUSR -# define S_IRUSR 0400 -#endif -#ifndef S_IWUSR -# define S_IWUSR 0200 -#endif -#define RW_USER (S_IRUSR | S_IWUSR) /* creation mode for open() */ - -#ifndef MAX_PATH_LEN -# define MAX_PATH_LEN 1024 /* max pathname length */ -#endif - -#ifndef SEEK_END -# define SEEK_END 2 -#endif - -#ifndef CHAR_BIT -# define CHAR_BIT 8 -#endif - -#ifdef off_t - off_t lseek OF((int fd, off_t offset, int whence)); -#endif - -#ifndef OFF_T_MIN -#define OFF_T_MIN (~ (off_t) 0 << (sizeof (off_t) * CHAR_BIT - 1)) -#endif - -#ifndef OFF_T_MAX -#define OFF_T_MAX (~ (off_t) 0 - OFF_T_MIN) -#endif - - /* global buffers */ - -DECLARE(uch, inbuf, INBUFSIZ +INBUF_EXTRA); -DECLARE(uch, outbuf, OUTBUFSIZ+OUTBUF_EXTRA); -DECLARE(ush, d_buf, DIST_BUFSIZE); -DECLARE(uch, window, 2L*WSIZE); -#ifndef MAXSEG_64K - DECLARE(ush, tab_prefix, 1L<<BITS); -#else - DECLARE(ush, tab_prefix0, 1L<<(BITS-1)); - DECLARE(ush, tab_prefix1, 1L<<(BITS-1)); -#endif - - /* local variables */ - -long block_start; -unsigned strstart; /* start of string to insert */ - -int to_stdout = 0; /* output to stdout (-c) */ -int decompress = 0; /* decompress (-d) */ -int force = 1; /* don't ask questions, compress links (-f) */ -int no_name = -1; /* don't save or restore the original file name */ -int no_time = -1; /* don't save or restore the original file time */ -int recursive = 0; /* recurse through directories (-r) */ -int list = 0; /* list the file contents (-l) */ -int quiet = 0; /* be very quiet (-q) */ -int do_lzw = 0; /* generate output compatible with old compress (-Z) */ -int test = 0; /* test .gz file integrity */ -int foreground; /* set if program run in foreground */ -char *progname = "gzlib"; -int maxbits = BITS; /* max bits per code for LZW */ -int method = DEFLATED;/* compression method */ -int level = 6; /* compression level */ -int exit_code = OK; /* program exit code */ -int last_member; /* set for .zip and .Z files */ -int part_nb; /* number of parts in .gz file */ -time_t time_stamp; /* original time stamp (modification time) */ -off_t ifile_size; /* input file size, -1 for devices (debug only) */ -char *env; /* contents of GZIP env variable */ -char **args = NULL; /* argv pointer if GZIP env variable defined */ -char *z_suffix; /* default suffix (can be set with --suffix) */ -int z_len; /* strlen(z_suffix) */ - -off_t bytes_in; /* number of input bytes */ -off_t bytes_out; /* number of output bytes */ -off_t total_in; /* input bytes for all files */ -off_t total_out; /* output bytes for all files */ -char ifname[MAX_PATH_LEN]; /* input file name */ -char ofname[MAX_PATH_LEN]; /* output file name */ -int remove_ofname = 0; /* remove output file on error */ -struct stat istat; /* status for input file */ -int ifd; /* input file descriptor */ -int ofd; /* output file descriptor */ -unsigned insize; /* valid bytes in inbuf */ -unsigned inptr; /* index of next byte to be processed in inbuf */ -unsigned outcnt; /* bytes in output buffer */ - -/* local functions */ - -local int input_eof OF((void)); -local void treat_stdin OF((void)); -local int get_method OF((int in)); -local void do_exit OF((int exitcode)); -int (*work) OF((int infile, int outfile)) = zip; - -#define strequ(s1, s2) (strcmp((s1),(s2)) == 0) - -local void progerror (char * string) __attribute__ ((unused)); - -local void progerror (string) - char *string; -{ - int e = errno; - fprintf(stderr, "%s: ", progname); - errno = e; - perror(string); - exit_code = ERROR; -} - -/* ======================================================================== */ -int gunzip_main (int do_decompress_arg) -{ - int file_count; /* number of files to precess */ - int proglen; /* length of progname */ - int optc __attribute__ ((unused)); /* current option */ - int argc __attribute__ ((unused)) = 1; - char *argv[] __attribute__ ((unused)) = { "gunzip ", NULL }; - - EXPAND(argc, argv); /* wild card expansion if necessary */ - - proglen = strlen(progname); - - /* Suppress .exe for MSDOS, OS/2 and VMS: */ - if (proglen > 4 && strequ(progname+proglen-4, ".exe")) { - progname[proglen-4] = '\0'; - } - - foreground = signal(SIGINT, SIG_IGN) != SIG_IGN; - if (foreground) { - (void) signal (SIGINT, (sig_type)abort_gzip); - } -#ifdef SIGTERM - if (signal(SIGTERM, SIG_IGN) != SIG_IGN) { - (void) signal(SIGTERM, (sig_type)abort_gzip); - } -#endif -#ifdef SIGHUP - if (signal(SIGHUP, SIG_IGN) != SIG_IGN) { - (void) signal(SIGHUP, (sig_type)abort_gzip); - } -#endif - - if (do_decompress_arg) - decompress = 1; - - z_suffix = Z_SUFFIX; - z_len = strlen(z_suffix); - -#ifdef SIGPIPE - /* Ignore "Broken Pipe" message with --quiet */ - if (quiet && signal (SIGPIPE, SIG_IGN) != SIG_IGN) - signal (SIGPIPE, (sig_type) abort_gzip); -#endif - - /* By default, save name and timestamp on compression but do not - * restore them on decompression. - */ - if (no_time < 0) no_time = decompress; - if (no_name < 0) no_name = decompress; - - file_count = argc - optind; - - /* Allocate all global buffers (for DYN_ALLOC option) */ - ALLOC(uch, inbuf, INBUFSIZ +INBUF_EXTRA); - ALLOC(uch, outbuf, OUTBUFSIZ+OUTBUF_EXTRA); - ALLOC(ush, d_buf, DIST_BUFSIZE); - ALLOC(uch, window, 2L*WSIZE); -#ifndef MAXSEG_64K - ALLOC(ush, tab_prefix, 1L<<BITS); -#else - ALLOC(ush, tab_prefix0, 1L<<(BITS-1)); - ALLOC(ush, tab_prefix1, 1L<<(BITS-1)); -#endif - - treat_stdin(); - - do_exit(exit_code); - return exit_code; /* just to avoid lint warning */ -} - -/* Return nonzero when at end of file on input. */ -local int -input_eof () -{ - if (!decompress || last_member) - return 1; - - if (inptr == insize) - { - if (insize != INBUFSIZ || fill_inbuf (1) == EOF) - return 1; - - /* Unget the char that fill_inbuf got. */ - inptr = 0; - } - - return 0; -} - -/* ======================================================================== - * Compress or decompress stdin - */ -local void treat_stdin() -{ - strcpy(ifname, "stdin"); - strcpy(ofname, "stdout"); - - /* Get the time stamp on the input file. */ - time_stamp = 0; /* time unknown by default */ - - ifile_size = -1L; /* convention for unknown size */ - - clear_bufs(); /* clear input and output buffers */ - to_stdout = 1; - part_nb = 0; - - if (decompress) { - method = get_method(ifd); - if (method < 0) { - do_exit(exit_code); /* error message already emitted */ - } - } - - /* Actually do the compression/decompression. Loop over zipped members. - */ - for (;;) { - if ((*work)(fileno(stdin), fileno(stdout)) != OK) return; - - if (input_eof ()) - break; - - method = get_method(ifd); - if (method < 0) return; /* error message already emitted */ - bytes_out = 0; /* required for length check */ - } - -} - - -/* ======================================================================== - * Check the magic number of the input file and update ofname if an - * original name was given and to_stdout is not set. - * Return the compression method, -1 for error, -2 for warning. - * Set inptr to the offset of the next byte to be processed. - * Updates time_stamp if there is one and --no-time is not used. - * This function may be called repeatedly for an input file consisting - * of several contiguous gzip'ed members. - * IN assertions: there is at least one remaining compressed member. - * If the member is a zip file, it must be the only one. - */ -local int get_method(in) - int in; /* input file descriptor */ -{ - uch flags; /* compression flags */ - char magic[2]; /* magic header */ - int imagic1; /* like magic[1], but can represent EOF */ - ulg stamp; /* time stamp */ - - /* If --force and --stdout, zcat == cat, so do not complain about - * premature end of file: use try_byte instead of get_byte. - */ - if (force && to_stdout) { - magic[0] = (char)try_byte(); - imagic1 = try_byte (); - magic[1] = (char) imagic1; - /* If try_byte returned EOF, magic[1] == (char) EOF. */ - } else { - magic[0] = (char)get_byte(); - magic[1] = (char)get_byte(); - imagic1 = 0; /* avoid lint warning */ - } - method = -1; /* unknown yet */ - part_nb++; /* number of parts in gzip file */ - header_bytes = 0; - last_member = RECORD_IO; - /* assume multiple members in gzip file except for record oriented I/O */ - - if (memcmp(magic, GZIP_MAGIC, 2) == 0 - || memcmp(magic, OLD_GZIP_MAGIC, 2) == 0) { - - method = (int)get_byte(); - if (method != DEFLATED) { - fprintf(stderr, - "%s: %s: unknown method %d -- get newer version of gzip\n", - progname, ifname, method); - exit_code = ERROR; - return -1; - } - work = unzip; - flags = (uch)get_byte(); - - stamp = (ulg)get_byte(); - stamp |= ((ulg)get_byte()) << 8; - stamp |= ((ulg)get_byte()) << 16; - stamp |= ((ulg)get_byte()) << 24; - if (stamp != 0 && !no_time) time_stamp = stamp; - - (void)get_byte(); /* Ignore extra flags for the moment */ - (void)get_byte(); /* Ignore OS type for the moment */ - - if ((flags & CONTINUATION) != 0) { - unsigned part = (unsigned)get_byte(); - part |= ((unsigned)get_byte())<<8; - } - if ((flags & EXTRA_FIELD) != 0) { - unsigned len = (unsigned)get_byte(); - len |= ((unsigned)get_byte())<<8; - while (len--) (void)get_byte(); - } - - /* Get original file name if it was truncated */ - if ((flags & ORIG_NAME) != 0) { - char c; /* dummy used for NeXTstep 3.0 cc optimizer bug */ - do {c=get_byte();} while (c != 0); - } /* ORIG_NAME */ - - /* Discard file comment if any */ - if ((flags & COMMENT) != 0) { - while (get_char() != 0) /* null */ ; - } - if (part_nb == 1) { - header_bytes = inptr + 2*sizeof(long); /* include crc and size */ - } - - } else if (force && to_stdout && !list) { /* pass input unchanged */ - method = STORED; - work = copy; - inptr = 0; - last_member = 1; - } - - if (method >= 0) return method; - - if (part_nb == 1) { - fprintf(stderr, "\n%s: %s: not in gzip format\n", progname, ifname); - exit_code = ERROR; - return -1; - } else { - if (magic[0] == 0) - { - int inbyte; - for (inbyte = imagic1; inbyte == 0; inbyte = try_byte ()) - continue; - if (inbyte == EOF) - { - return -3; - } - } - - WARN((stderr, "\n%s: %s: decompression OK, trailing garbage ignored\n", - progname, ifname)); - return -2; - } -} - -/* ======================================================================== - * Free all dynamically allocated variables and exit with the given code. - */ -local void do_exit(exitcode) - int exitcode; -{ - static int in_exit = 0; - - if (in_exit) exit(exitcode); - in_exit = 1; - if (env != NULL) free(env), env = NULL; - if (args != NULL) free((char*)args), args = NULL; - FREE(inbuf); - FREE(outbuf); - FREE(d_buf); - FREE(window); -#ifndef MAXSEG_64K - FREE(tab_prefix); -#else - FREE(tab_prefix0); - FREE(tab_prefix1); -#endif - exit(exitcode); -} - -/* ======================================================================== - * Signal and error handler. - */ -RETSIGTYPE abort_gzip() -{ - if (remove_ofname) { - close(ofd); - unlink (ofname); - } - do_exit(ERROR); -} |