aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorLasse Collin <lasse.collin@tukaani.org>2010-01-13 18:12:40 +0200
committerLasse Collin <lasse.collin@tukaani.org>2010-01-13 18:12:40 +0200
commit23ac2c44c3ac76994825adb7f9a8f719f78b5ee4 (patch)
treef2e78a1c1998d3be4ca9d12644954f86f2599564 /src
parentUpdated THANKS. (diff)
downloadxz-23ac2c44c3ac76994825adb7f9a8f719f78b5ee4.tar.xz
Don't compress or decompress special files unless writing
to stdout even if --force is used. --force will still enable compression of symlinks, but only in case they point to a regular file. The new way simply seems more reasonable. It matches gzip's behavior while the old one matched bzip2's behavior.
Diffstat (limited to 'src')
-rw-r--r--src/xz/file_io.c15
1 files changed, 10 insertions, 5 deletions
diff --git a/src/xz/file_io.c b/src/xz/file_io.c
index 18b7b044..d94e2321 100644
--- a/src/xz/file_io.c
+++ b/src/xz/file_io.c
@@ -275,9 +275,14 @@ io_open_src(file_pair *pair)
return false;
}
+ // Symlinks are not followed unless writing to stdout or --force
+ // was used.
+ const bool follow_symlinks = opt_stdout || opt_force;
+
// We accept only regular files if we are writing the output
- // to disk too, and if --force was not given.
- const bool reg_files_only = !opt_stdout && !opt_force;
+ // to disk too. bzip2 allows overriding this with --force but
+ // gzip and xz don't.
+ const bool reg_files_only = !opt_stdout;
// Flags for open()
int flags = O_RDONLY | O_BINARY | O_NOCTTY;
@@ -293,13 +298,13 @@ io_open_src(file_pair *pair)
#endif
#if defined(O_NOFOLLOW)
- if (reg_files_only)
+ if (!follow_symlinks)
flags |= O_NOFOLLOW;
#elif !defined(TUKLIB_DOSLIKE)
// Some POSIX-like systems lack O_NOFOLLOW (it's not required
// by POSIX). Check for symlinks with a separate lstat() on
// these systems.
- if (reg_files_only) {
+ if (!follow_symlinks) {
struct stat st;
if (lstat(pair->src_name, &st)) {
message_error("%s: %s", pair->src_name,
@@ -374,7 +379,7 @@ io_open_src(file_pair *pair)
was_symlink = true;
# else
- if (errno == ELOOP && reg_files_only) {
+ if (errno == ELOOP && !follow_symlinks) {
const int saved_errno = errno;
struct stat st;
if (lstat(pair->src_name, &st) == 0