X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=gzip.c;h=983f673e15eb7c847b69590de845c3f95d8d95fd;hb=ded6259f624c34f3bc221d1b2caee30fbcd729a4;hp=de794febb40e2dc543d5df67fb3c9dc576ddf418;hpb=350577c5a03ace7d421208672385302c77d78084;p=oweals%2Fbusybox.git diff --git a/gzip.c b/gzip.c index de794febb..983f673e1 100644 --- a/gzip.c +++ b/gzip.c @@ -7,11 +7,17 @@ #include "internal.h" #ifdef BB_GZIP -#ifndef BB_ZCAT -#error you need zcat to have gzip support! -#endif +//#ifndef BB_ZCAT +//#error you need zcat to have gzip support! +//#endif + +static const char gzip_usage[] = + "gzip [OPTION]... FILE\n\n" + "Compress FILE with maximum compression.\n" + "When FILE is -, reads standard input. Implies -c.\n\n" + "Options:\n" + "\t-c\tWrite output to standard output instead of FILE.gz\n"; -static const char gzip_usage[] = "gzip\nignores all command line arguments\ncompress stdin to stdout with -9 compression\n"; /* gzip.h -- common declarations for all gzip modules * Copyright (C) 1992-1993 Jean-loup Gailly. @@ -210,7 +216,6 @@ extern int exit_code; /* program exit code */ extern int verbose; /* be verbose (-v) */ extern int quiet; /* be quiet (-q) */ extern int test; /* check .z file integrity */ -extern int to_stdout; /* output to stdout (-c) */ extern int save_orig_name; /* set if original name must be saved */ #define get_byte() (inptr < insize ? inbuf[inptr++] : fill_inbuf(0)) @@ -272,7 +277,7 @@ extern int save_orig_name; /* set if original name must be saved */ #define WARN(msg) {if (!quiet) fprintf msg ; \ if (exit_code == OK) exit_code = WARNING;} -local void do_exit(int exitcode); +local void do_exit(int exitcode) __attribute__ ((noreturn)); /* in zip.c: */ extern int zip OF((int in, int out)); @@ -1726,7 +1731,6 @@ DECLARE(uch, window, 2L*WSIZE); /* local variables */ int ascii = 0; /* convert end-of-lines to local OS conventions */ -int to_stdout = 0; /* output to stdout (-c) */ int decompress = 0; /* decompress (-d) */ 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 */ @@ -1758,17 +1762,42 @@ unsigned outcnt; /* bytes in output buffer */ /* local functions */ -local void treat_stdin OF((void)); -static int (*work) OF((int infile, int outfile)) = zip; /* function to call */ - #define strequ(s1, s2) (strcmp((s1),(s2)) == 0) /* ======================================================================== */ // int main (argc, argv) // int argc; // char **argv; -int gzip_main(int argc, char * * argv) +int gzip_main(int argc, char ** argv) { + int result; + int inFileNum; + int outFileNum; + struct stat statBuf; + char* delFileName; + int tostdout = 0; + int fromstdin = 0; + + if (argc==1) + usage(gzip_usage); + + /* Parse any options */ + while (--argc > 0 && **(++argv) == '-') { + if (*((*argv)+1) == '\0') { + fromstdin = 1; + tostdout = 1; + } + while (*(++(*argv))) { + switch (**argv) { + case 'c': + tostdout = 1; + break; + default: + usage(gzip_usage); + } + } + } + foreground = signal(SIGINT, SIG_IGN) != SIG_IGN; if (foreground) { (void) signal (SIGINT, (sig_type)abort_gzip); @@ -1787,8 +1816,6 @@ int gzip_main(int argc, char * * argv) strncpy(z_suffix, Z_SUFFIX, sizeof(z_suffix)-1); z_len = strlen(z_suffix); - to_stdout = 1; - /* Allocate all global buffers (for DYN_ALLOC option) */ ALLOC(uch, inbuf, INBUFSIZ +INBUF_EXTRA); ALLOC(uch, outbuf, OUTBUFSIZ+OUTBUF_EXTRA); @@ -1801,33 +1828,84 @@ int gzip_main(int argc, char * * argv) ALLOC(ush, tab_prefix1, 1L<<(BITS-1)); #endif - /* And get to work */ - treat_stdin(); - do_exit(exit_code); - return exit_code; /* just to avoid lint warning */ -} + if (fromstdin==1) { + strcpy(ofname, "stdin"); -/* ======================================================================== - * Compress or decompress stdin - */ -local void treat_stdin() -{ + inFileNum=fileno(stdin); + time_stamp = 0; /* time unknown by default */ + ifile_size = -1L; /* convention for unknown size */ + } else { + /* Open up the input file */ + if (*argv=='\0') + usage(gzip_usage); + strncpy(ifname, *argv, MAX_PATH_LEN); + + /* Open input fille */ + inFileNum=open( ifname, O_RDONLY); + if (inFileNum < 0) { + perror(ifname); + do_exit(WARNING); + } + /* Get the time stamp on the input file. */ + result = stat(ifname, &statBuf); + if (result < 0) { + perror(ifname); + do_exit(WARNING); + } + time_stamp = statBuf.st_ctime; + ifile_size = statBuf.st_size; + } + + + if (tostdout==1) { + /* And get to work */ + strcpy(ofname, "stdout"); + outFileNum=fileno(stdout); SET_BINARY_MODE(fileno(stdout)); - strcpy(ifname, "stdin"); - strcpy(ofname, "stdout"); - /* Get the time stamp on the input file. */ - time_stamp = 0; /* time unknown by default */ + clear_bufs(); /* clear input and output buffers */ + part_nb = 0; - ifile_size = -1L; /* convention for unknown size */ + /* Actually do the compression/decompression. */ + zip(inFileNum, outFileNum); - clear_bufs(); /* clear input and output buffers */ - to_stdout = 1; - part_nb = 0; + } else { - /* Actually do the compression/decompression. Loop over zipped members. - */ - if ((*work)(fileno(stdin), fileno(stdout)) != OK) return; + /* And get to work */ + strncpy(ofname, ifname, MAX_PATH_LEN-4); + strcat(ofname, ".gz"); + + + /* Open output fille */ + outFileNum=open( ofname, O_RDWR|O_CREAT|O_EXCL|O_NOFOLLOW); + if (outFileNum < 0) { + perror(ofname); + do_exit(WARNING); + } + SET_BINARY_MODE(outFileNum); + /* Set permissions on the file */ + fchmod(outFileNum, statBuf.st_mode); + + clear_bufs(); /* clear input and output buffers */ + part_nb = 0; + + /* Actually do the compression/decompression. */ + result=zip(inFileNum, outFileNum); + close( outFileNum); + close( inFileNum); + /* Delete the original file */ + if (result == OK) + delFileName=ifname; + else + delFileName=ofname; + + if (unlink (delFileName) < 0) { + perror (delFileName); + exit( FALSE); + } + } + + do_exit(exit_code); } /* ======================================================================== @@ -2941,8 +3019,6 @@ local void set_file_type() extern int errno; #endif -extern ulg crc_32_tab[]; /* crc table, defined below */ - /* =========================================================================== * Copy input to output unchanged: zcat == cat with --force. * IN assertion: insize bytes have already been read in inbuf. @@ -3150,6 +3226,7 @@ int zip(in, out) /* Write the header to the gzip file. See algorithm.doc for the format */ + method = DEFLATED; put_byte(GZIP_MAGIC[0]); /* magic header */ put_byte(GZIP_MAGIC[1]);