goto err;
} else {
/* "clever zcat" with FILE */
- int fd = open_zipped(filename);
+ /* fail_if_not_compressed because zcat refuses uncompressed input */
+ int fd = open_zipped(filename, /*fail_if_not_compressed:*/ 1);
if (fd < 0)
goto err_name;
xmove_fd(fd, STDIN_FILENO);
} else
if (option_mask32 & SEAMLESS_MAGIC) {
/* "clever zcat" on stdin */
- if (setup_unzip_on_fd(STDIN_FILENO, /*fail_if_not_detected*/ 0))
+ if (setup_unzip_on_fd(STDIN_FILENO, /*fail_if_not_compressed*/ 1))
goto err;
}
* or not first block (false positive, it's not .gz/.bz2!) */
if (lseek(archive_handle->src_fd, -i, SEEK_CUR) != 0)
goto err;
- if (setup_unzip_on_fd(archive_handle->src_fd, /*fail_if_not_detected:*/ 0) != 0)
+ if (setup_unzip_on_fd(archive_handle->src_fd, /*fail_if_not_compressed:*/ 0) != 0)
err:
bb_error_msg_and_die("invalid tar magic");
archive_handle->offset = 0;
/* Used by e.g. rpm which gives us a fd without filename,
* thus we can't guess the format from filename's extension.
*/
-int FAST_FUNC setup_unzip_on_fd(int fd, int fail_if_not_detected)
+int FAST_FUNC setup_unzip_on_fd(int fd, int fail_if_not_compressed)
{
union {
uint8_t b[4];
}
/* No known magic seen */
- if (fail_if_not_detected)
+ if (fail_if_not_compressed)
bb_error_msg_and_die("no gzip"
IF_FEATURE_SEAMLESS_BZ2("/bzip2")
IF_FEATURE_SEAMLESS_XZ("/xz")
return 0;
}
-int FAST_FUNC open_zipped(const char *fname)
+int FAST_FUNC open_zipped(const char *fname, int fail_if_not_compressed)
{
int fd;
|| (ENABLE_FEATURE_SEAMLESS_BZ2)
|| (ENABLE_FEATURE_SEAMLESS_XZ)
) {
- /*
- * Do we want to fail_if_not_detected?
- * In most cases, no: think "insmod non_compressed_module".
- * A case which would like to fail is "zcat uncompressed_file":
- * otherwise, it happily outputs uncompressed_file as-is,
- * which is, strictly speaking, not what is expected.
- * If this ever becomes a problem, we can add
- * fail_if_not_detected bool argument to open_zipped().
- */
- setup_unzip_on_fd(fd, /*fail_if_not_detected:*/ 0);
+ setup_unzip_on_fd(fd, fail_if_not_compressed);
}
return fd;
int fd;
char *image;
- fd = open_zipped(fname);
+ fd = open_zipped(fname, /*fail_if_not_compressed:*/ 0);
if (fd < 0)
return NULL;
archive_handle->src_fd = fd;
/*archive_handle->offset = 0; - init_handle() did it */
- setup_unzip_on_fd(archive_handle->src_fd, /*fail_if_not_detected:*/ 1);
+ setup_unzip_on_fd(archive_handle->src_fd, /*fail_if_not_compressed:*/ 1);
while (get_header_cpio(archive_handle) == EXIT_SUCCESS)
continue;
}
// signal(SIGCHLD, check_errors_in_children);
/* This works, but doesn't report uncompress errors (they happen in child) */
- setup_unzip_on_fd(rpm_fd, /*fail_if_not_detected:*/ 1);
+ setup_unzip_on_fd(rpm_fd, /*fail_if_not_compressed:*/ 1);
if (bb_copyfd_eof(rpm_fd, STDOUT_FILENO) < 0)
bb_error_msg_and_die("error unpacking");
&& flags == O_RDONLY
&& !(opt & OPT_ANY_COMPRESS)
) {
- tar_handle->src_fd = open_zipped(tar_filename);
+ tar_handle->src_fd = open_zipped(tar_filename, /*fail_if_not_compressed:*/ 0);
if (tar_handle->src_fd < 0)
bb_perror_msg_and_die("can't open '%s'", tar_filename);
} else {
#if SEAMLESS_COMPRESSION
/* Autodetects gzip/bzip2 formats. fd may be in the middle of the file! */
-extern int setup_unzip_on_fd(int fd, int fail_if_not_detected) FAST_FUNC;
+extern int setup_unzip_on_fd(int fd, int fail_if_not_compressed) FAST_FUNC;
/* Autodetects .gz etc */
-extern int open_zipped(const char *fname) FAST_FUNC;
+extern int open_zipped(const char *fname, int fail_if_not_compressed) FAST_FUNC;
#else
# define setup_unzip_on_fd(...) (0)
-# define open_zipped(fname) open((fname), O_RDONLY);
+# define open_zipped(fname, fail_if_not_compressed) open((fname), O_RDONLY);
#endif
extern void *xmalloc_open_zipped_read_close(const char *fname, size_t *maxsz_p) FAST_FUNC RETURNS_MALLOC;
if (LONE_DASH(G.image_filename)) {
theme_file = stdin;
} else {
- int fd = open_zipped(G.image_filename);
+ int fd = open_zipped(G.image_filename, /*fail_if_not_compressed:*/ 0);
if (fd < 0)
bb_simple_perror_msg_and_die(G.image_filename);
theme_file = xfdopen_for_read(fd);
ordinary_manpage:
close(STDIN_FILENO);
- open_zipped(man_filename); /* guaranteed to use fd 0 (STDIN_FILENO) */
+ open_zipped(man_filename, /*fail_if_not_compressed:*/ 0); /* guaranteed to use fd 0 (STDIN_FILENO) */
/* "2>&1" is added so that nroff errors are shown in pager too.
* Otherwise it may show just empty screen */
cmd = xasprintf(