#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 FILEs with maximum compression.\n\n"
+ "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 on standard output\n";
+ "\t-c\tWrite output to standard output instead of FILE.gz\n";
/* gzip.h -- common declarations for all gzip modules
#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));
int ascii = 0; /* convert end-of-lines to local OS conventions */
int decompress = 0; /* decompress (-d) */
-int tostdout = 0; /* uncompress to stdout (-c) */
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 foreground; /* set if program run in foreground */
/* 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)
/* ======================================================================== */
// 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':
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()
-{
- SET_BINARY_MODE(fileno(stdout));
- strcpy(ifname, "stdin");
- strcpy(ofname, "stdout");
+ 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;
+ }
- /* Get the time stamp on the input file. */
- time_stamp = 0; /* time unknown by default */
- ifile_size = -1L; /* convention for unknown size */
+ if (tostdout==1) {
+ /* And get to work */
+ strcpy(ofname, "stdout");
+ outFileNum=fileno(stdout);
+ SET_BINARY_MODE(fileno(stdout));
- clear_bufs(); /* clear input and output buffers */
- part_nb = 0;
+ clear_bufs(); /* clear input and output buffers */
+ part_nb = 0;
- /* Actually do the compression/decompression. Loop over zipped members.
- */
- if ((*work)(fileno(stdin), fileno(stdout)) != OK) return;
+ /* Actually do the compression/decompression. */
+ zip(inFileNum, outFileNum);
+
+ } else {
+
+ /* And get to work */
+ strncpy(ofname, ifname, MAX_PATH_LEN-4);
+ strcat(ofname, ".gz");
+
+
+ /* Open output fille */
+#if (__GLIBC__ >= 2) && (__GLIBC_MINOR__ >= 1)
+ outFileNum=open( ofname, O_RDWR|O_CREAT|O_EXCL|O_NOFOLLOW);
+#else
+ outFileNum=open( ofname, O_RDWR|O_CREAT|O_EXCL);
+#endif
+ 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);
}
/* ========================================================================
/* 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]);