#include "unarchive.h"
#include "busybox.h"
-#if (BYTE_ORDER == BIG_ENDIAN)
+#if BB_BIG_ENDIAN
static inline unsigned short
__swap16(unsigned short x) {
return (((uint16_t)(x) & 0xFF) << 8) | (((uint16_t)(x) & 0xFF00) >> 8);
((x & 0xFF0000) >> 8) |
((x & 0xFF000000) >> 24));
}
-#else
-#define __swap16(x) (x)
-#define __swap32(x) (x)
-#endif
+#else /* it's little-endian */
+# define __swap16(x) (x)
+# define __swap32(x) (x)
+#endif /* BB_BIG_ENDIAN */
#define ZIP_FILEHEADER_MAGIC __swap32(0x04034b50)
#define ZIP_CDS_MAGIC __swap32(0x02014b50)
free(name);
}
-static void unzip_extract(zip_header_t *zip_header, int src_fd, int dst_fd)
+static int unzip_extract(zip_header_t *zip_header, int src_fd, int dst_fd)
{
if (zip_header->formated.method == 0) {
/* Method 0 - stored (not compressed) */
/* Validate decompression - crc */
if (zip_header->formated.crc32 != (gunzip_crc ^ 0xffffffffL)) {
bb_error_msg("Invalid compressed data--crc error");
+ return 1;
}
/* Validate decompression - size */
if (zip_header->formated.ucmpsize != gunzip_bytes_out) {
bb_error_msg("Invalid compressed data--length error");
+ return 1;
}
}
+ return 0;
}
-extern int unzip_main(int argc, char **argv)
+int unzip_main(int argc, char **argv)
{
zip_header_t zip_header;
enum {v_silent, v_normal, v_list} verbosity = v_normal;
llist_t *zaccept = NULL;
llist_t *zreject = NULL;
char *base_dir = NULL;
- int i, opt, opt_range = 0, list_header_done = 0;
+ int failed, i, opt, opt_range = 0, list_header_done = 0;
char key_buf[512];
struct stat stat_buf;
case 1: /* Include files */
if (opt == 1) {
- zaccept = llist_add_to(zaccept, optarg);
+ llist_add_to(&zaccept, optarg);
} else if (opt == 'd') {
base_dir = optarg;
case 2 : /* Exclude files */
if (opt == 1) {
- zreject = llist_add_to(zreject, optarg);
+ llist_add_to(&zreject, optarg);
} else if (opt == 'd') { /* Extract to base directory */
base_dir = optarg;
}
/* Change dir if necessary */
- if (base_dir && chdir(base_dir)) {
- bb_perror_msg_and_die("Cannot chdir");
- }
+ if (base_dir)
+ bb_xchdir(base_dir);
if (verbosity != v_silent)
printf("Archive: %s\n", src_fn);
+ failed = 0;
+
while (1) {
unsigned int magic;
/* Read the file header */
unzip_read(src_fd, zip_header.raw, 26);
-#if (BYTE_ORDER == BIG_ENDIAN)
+#if BB_BIG_ENDIAN
zip_header.formated.version = __swap16(zip_header.formated.version);
zip_header.formated.flags = __swap16(zip_header.formated.flags);
zip_header.formated.method = __swap16(zip_header.formated.method);
zip_header.formated.ucmpsize = __swap32(zip_header.formated.ucmpsize);
zip_header.formated.filename_len = __swap16(zip_header.formated.filename_len);
zip_header.formated.extra_len = __swap16(zip_header.formated.extra_len);
-#endif
+#endif /* BB_BIG_ENDIAN */
if ((zip_header.formated.method != 0) && (zip_header.formated.method != 8)) {
bb_error_msg_and_die("Unsupported compression method %d", zip_header.formated.method);
}
if (verbosity == v_normal) {
printf(" inflating: %s\n", dst_fn);
}
- unzip_extract(&zip_header, src_fd, dst_fd);
+ if (unzip_extract(&zip_header, src_fd, dst_fd)) {
+ failed = 1;
+ }
if (dst_fd != STDOUT_FILENO) {
/* closing STDOUT is potentially bad for future business */
close(dst_fd);
"%9d %d files\n", total_size, total_entries);
}
- return(EXIT_SUCCESS);
+ return failed;
}
-
-/* END CODE */
-/*
-Local Variables:
-c-file-style: "linux"
-c-basic-offset: 4
-tab-width: 4
-End:
-*/