Add a signal handler for SIGINT which removes output file when necessary.
While I'm there, move unlink_input() slightly down to after closing the output file, in uncompression path. MFC after: 2 weeks
This commit is contained in:
parent
8fbd99ea26
commit
6776eaaf24
@ -43,7 +43,6 @@ __RCSID("$FreeBSD$");
|
||||
*
|
||||
* TODO:
|
||||
* - use mmap where possible
|
||||
* - handle some signals better (remove outfile?)
|
||||
* - make bzip2/compress -v/-t/-l support work as well as possible
|
||||
*/
|
||||
|
||||
@ -194,6 +193,7 @@ static int qflag; /* quiet mode */
|
||||
static int rflag; /* recursive mode */
|
||||
static int tflag; /* test */
|
||||
static int vflag; /* verbose mode */
|
||||
static const char *remove_file = NULL; /* file to be removed upon SIGINT */
|
||||
#else
|
||||
#define qflag 0
|
||||
#define tflag 0
|
||||
@ -231,6 +231,7 @@ static void usage(void);
|
||||
static void display_version(void);
|
||||
#ifndef SMALL
|
||||
static void display_license(void);
|
||||
static void sigint_handler(int);
|
||||
#endif
|
||||
static const suffixes_t *check_suffix(char *, int);
|
||||
static ssize_t read_retry(int, void *, size_t);
|
||||
@ -300,11 +301,10 @@ main(int argc, char **argv)
|
||||
#endif
|
||||
int ch;
|
||||
|
||||
/* XXX set up signals */
|
||||
|
||||
#ifndef SMALL
|
||||
if ((gzip = getenv("GZIP")) != NULL)
|
||||
prepend_gzip(gzip, &argc, &argv);
|
||||
signal(SIGINT, sigint_handler);
|
||||
#endif
|
||||
|
||||
/*
|
||||
@ -1171,6 +1171,15 @@ unlink_input(const char *file, const struct stat *sb)
|
||||
return;
|
||||
unlink(file);
|
||||
}
|
||||
|
||||
static void
|
||||
sigint_handler(int signo __unused)
|
||||
{
|
||||
|
||||
if (remove_file != NULL)
|
||||
unlink(remove_file);
|
||||
exit(2);
|
||||
}
|
||||
#endif
|
||||
|
||||
static const suffixes_t *
|
||||
@ -1257,6 +1266,9 @@ file_compress(char *file, char *outfile, size_t outsize)
|
||||
fclose(stdin);
|
||||
return -1;
|
||||
}
|
||||
#ifndef SMALL
|
||||
remove_file = outfile;
|
||||
#endif
|
||||
} else
|
||||
out = STDOUT_FILENO;
|
||||
|
||||
@ -1288,6 +1300,7 @@ file_compress(char *file, char *outfile, size_t outsize)
|
||||
}
|
||||
|
||||
copymodes(out, &isb, outfile);
|
||||
remove_file = NULL;
|
||||
#endif
|
||||
if (close(out) == -1)
|
||||
maybe_warn("couldn't close output");
|
||||
@ -1424,6 +1437,9 @@ file_uncompress(char *file, char *outfile, size_t outsize)
|
||||
maybe_warn("can't open %s", outfile);
|
||||
goto lose;
|
||||
}
|
||||
#ifndef SMALL
|
||||
remove_file = outfile;
|
||||
#endif
|
||||
} else
|
||||
zfd = STDOUT_FILENO;
|
||||
|
||||
@ -1555,11 +1571,12 @@ file_uncompress(char *file, char *outfile, size_t outsize)
|
||||
unlink(outfile);
|
||||
return -1;
|
||||
}
|
||||
unlink_input(file, &isb);
|
||||
#ifndef SMALL
|
||||
copymodes(ofd, &isb, outfile);
|
||||
remove_file = NULL;
|
||||
#endif
|
||||
close(ofd);
|
||||
unlink_input(file, &isb);
|
||||
return size;
|
||||
|
||||
unexpected_EOF:
|
||||
|
Loading…
x
Reference in New Issue
Block a user