1
0
Fork 0
mirror of https://git.tukaani.org/xz.git synced 2024-04-04 12:36:23 +02:00

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.
This commit is contained in:
Lasse Collin 2010-01-13 18:12:40 +02:00
parent cee12aa852
commit 23ac2c44c3

View file

@ -275,9 +275,14 @@ io_open_src(file_pair *pair)
return false; 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 // We accept only regular files if we are writing the output
// to disk too, and if --force was not given. // to disk too. bzip2 allows overriding this with --force but
const bool reg_files_only = !opt_stdout && !opt_force; // gzip and xz don't.
const bool reg_files_only = !opt_stdout;
// Flags for open() // Flags for open()
int flags = O_RDONLY | O_BINARY | O_NOCTTY; int flags = O_RDONLY | O_BINARY | O_NOCTTY;
@ -293,13 +298,13 @@ io_open_src(file_pair *pair)
#endif #endif
#if defined(O_NOFOLLOW) #if defined(O_NOFOLLOW)
if (reg_files_only) if (!follow_symlinks)
flags |= O_NOFOLLOW; flags |= O_NOFOLLOW;
#elif !defined(TUKLIB_DOSLIKE) #elif !defined(TUKLIB_DOSLIKE)
// Some POSIX-like systems lack O_NOFOLLOW (it's not required // Some POSIX-like systems lack O_NOFOLLOW (it's not required
// by POSIX). Check for symlinks with a separate lstat() on // by POSIX). Check for symlinks with a separate lstat() on
// these systems. // these systems.
if (reg_files_only) { if (!follow_symlinks) {
struct stat st; struct stat st;
if (lstat(pair->src_name, &st)) { if (lstat(pair->src_name, &st)) {
message_error("%s: %s", pair->src_name, message_error("%s: %s", pair->src_name,
@ -374,7 +379,7 @@ io_open_src(file_pair *pair)
was_symlink = true; was_symlink = true;
# else # else
if (errno == ELOOP && reg_files_only) { if (errno == ELOOP && !follow_symlinks) {
const int saved_errno = errno; const int saved_errno = errno;
struct stat st; struct stat st;
if (lstat(pair->src_name, &st) == 0 if (lstat(pair->src_name, &st) == 0