[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v5] gzip: add "--keep" option to keep (don't delete) input files
From: |
Rodrigo Campos |
Subject: |
[PATCH v5] gzip: add "--keep" option to keep (don't delete) input files |
Date: |
Sat, 16 Feb 2013 18:12:13 -0300 |
By default it is disabled to keep everything working as before. And as a
short option "-k" is used to be consistent with lzip, bzip2 and friends.
As it may not be clear in the diff, this patch just puts the unlink code inside
an if.
---
Changes in v5:
* When running with "--keep" was not updating timestamp, mode, etc. from
input file to output file
Changes in v4:
* Don't make "--stdout" imply "--keep"
Changes in v3:
* Add doc of "--keep" option to gunzip.in
Changes in v2:
* Improve documentation
* Use "-k", instead of "-K", as a short option
---
gunzip.in | 1 +
gzip.1 | 9 ++++++---
gzip.c | 35 ++++++++++++++++++++++-------------
3 files changed, 29 insertions(+), 16 deletions(-)
diff --git a/gunzip.in b/gunzip.in
index b95e973..dbfd04b 100644
--- a/gunzip.in
+++ b/gunzip.in
@@ -38,6 +38,7 @@ Mandatory arguments to long options are mandatory for short
options too.
-c, --stdout write on standard output, keep original files unchanged
-f, --force force overwrite of output file and compress links
+ -k, --keep keep (don't delete) input files
-l, --list list compressed file contents
-n, --no-name do not save or restore the original name and time stamp
-N, --name save or restore the original name and time stamp
diff --git a/gzip.1 b/gzip.1
index c97aeb1..71e097c 100644
--- a/gzip.1
+++ b/gzip.1
@@ -4,7 +4,7 @@ gzip, gunzip, zcat \- compress or expand files
.SH SYNOPSIS
.ll +8
.B gzip
-.RB [ " \-acdfhlLnNrtvV19 " ]
+.RB [ " \-acdfhklLnNrtvV19 " ]
.RB [ \-S\ suffix ]
[
.I "name \&..."
@@ -12,7 +12,7 @@ gzip, gunzip, zcat \- compress or expand files
.ll -8
.br
.B gunzip
-.RB [ " \-acfhlLnNrtvV " ]
+.RB [ " \-acfhklLnNrtvV " ]
.RB [ \-S\ suffix ]
[
.I "name \&..."
@@ -218,6 +218,9 @@ prompts to verify whether an existing file should be
overwritten.
.B \-h --help
Display a help screen and quit.
.TP
+.B \-k --keep
+Keep (don't delete) input files during compression or decompression.
+.TP
.B \-l --list
For each compressed file, list the following fields:
@@ -392,7 +395,7 @@ Internet RFC 1951 (May 1996).
Exit status is normally 0;
if an error occurs, exit status is 1. If a warning occurs, exit status is 2.
.TP
-Usage: gzip [-cdfhlLnNrtvV19] [-S suffix] [file ...]
+Usage: gzip [-cdfhklLnNrtvV19] [-S suffix] [file ...]
Invalid options were specified on the command line.
.TP
\fIfile\fP\^: not in gzip format
diff --git a/gzip.c b/gzip.c
index 66529e0..93cc738 100644
--- a/gzip.c
+++ b/gzip.c
@@ -167,6 +167,7 @@ static int ascii = 0; /* convert end-of-lines to
local OS conventions */
int to_stdout = 0; /* output to stdout (-c) */
static int decompress = 0; /* decompress (-d) */
static int force = 0; /* don't ask questions, compress links (-f) */
+static int keep = 0; /* keep (don't delete) input files */
static int no_name = -1; /* don't save or restore the original file name */
static int no_time = -1; /* don't save or restore the original file time */
static int recursive = 0; /* recurse through directories (-r) */
@@ -256,6 +257,7 @@ static const struct option longopts[] =
{"force", 0, 0, 'f'}, /* force overwrite of output file */
{"help", 0, 0, 'h'}, /* give help */
/* {"pkzip", 0, 0, 'k'}, force output in pkzip format */
+ {"keep", 0, 0, 'k'}, /* keep (don't delete) input files */
{"list", 0, 0, 'l'}, /* list .gz file contents */
{"license", 0, 0, 'L'}, /* display software license */
{"no-name", 0, 0, 'n'}, /* don't save or restore original name & time */
@@ -334,6 +336,7 @@ local void help()
" -f, --force force overwrite of output file and compress links",
" -h, --help give this help",
/* -k, --pkzip force output in pkzip format */
+ " -k, --keep keep (don't delete) input files",
" -l, --list list compressed file contents",
" -L, --license display software license",
#ifdef UNDOCUMENTED
@@ -437,7 +440,7 @@ int main (int argc, char **argv)
z_suffix = Z_SUFFIX;
z_len = strlen(z_suffix);
- while ((optc = getopt_long (argc, argv, "ab:cdfhH?lLmMnNqrS:tvVZ123456789",
+ while ((optc = getopt_long (argc, argv,
"ab:cdfhH?klLmMnNqrS:tvVZ123456789",
longopts, (int *)0)) != -1) {
switch (optc) {
case 'a':
@@ -460,6 +463,8 @@ int main (int argc, char **argv)
force++; break;
case 'h': case 'H':
help(); do_exit(OK); break;
+ case 'k':
+ keep = 1; break;
case 'l':
list = decompress = to_stdout = 1; break;
case 'L':
@@ -851,25 +856,29 @@ local void treat_file(iname)
if (!to_stdout)
{
- sigset_t oldset;
- int unlink_errno;
copy_stat (&istat);
if (close (ofd) != 0)
write_error ();
- sigprocmask (SIG_BLOCK, &caught_signals, &oldset);
- remove_ofname_fd = -1;
- unlink_errno = xunlink (ifname) == 0 ? 0 : errno;
- sigprocmask (SIG_SETMASK, &oldset, NULL);
-
- if (unlink_errno)
+ if (!keep)
{
- WARN ((stderr, "%s: ", program_name));
- if (!quiet)
+ sigset_t oldset;
+ int unlink_errno;
+
+ sigprocmask (SIG_BLOCK, &caught_signals, &oldset);
+ remove_ofname_fd = -1;
+ unlink_errno = xunlink (ifname) == 0 ? 0 : errno;
+ sigprocmask (SIG_SETMASK, &oldset, NULL);
+
+ if (unlink_errno)
{
- errno = unlink_errno;
- perror (ifname);
+ WARN ((stderr, "%s: ", program_name));
+ if (!quiet)
+ {
+ errno = unlink_errno;
+ perror (ifname);
+ }
}
}
}
--
1.7.10.4
- [PATCH v5] gzip: add "--keep" option to keep (don't delete) input files,
Rodrigo Campos <=