X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=archival%2Fbbunzip.c;h=75489f2a5a96519299c8c0321e5f2f3346547844;hb=4e12b1a2a9e68685dff61acaee1e1f6c377d978c;hp=09a4eb9eb38b092ad521174a5356710908973eb2;hpb=a04cc47f1c53c34e81a7271d687d8b68d0489892;p=oweals%2Fbusybox.git diff --git a/archival/bbunzip.c b/archival/bbunzip.c index 09a4eb9eb..75489f2a5 100644 --- a/archival/bbunzip.c +++ b/archival/bbunzip.c @@ -28,15 +28,16 @@ int open_to_or_warn(int to_fd, const char *filename, int flags, int mode) return 0; } -int bbunpack(char **argv, +int FAST_FUNC bbunpack(char **argv, char* (*make_new_name)(char *filename), - USE_DESKTOP(long long) int (*unpacker)(void) + USE_DESKTOP(long long) int (*unpacker)(unpack_info_t *info) ) { struct stat stat_buf; USE_DESKTOP(long long) int status; char *filename, *new_name; smallint exitcode = 0; + unpack_info_t info; do { /* NB: new_name is *maybe* malloc'ed! */ @@ -92,14 +93,29 @@ int bbunpack(char **argv, "use -f to force it"); } - status = unpacker(); + /* memset(&info, 0, sizeof(info)); */ + info.mtime = 0; /* so far it has one member only */ + status = unpacker(&info); if (status < 0) exitcode = 1; if (filename) { char *del = new_name; if (status >= 0) { - /* TODO: restore user/group/times here? */ + /* TODO: restore other things? */ + if (info.mtime) { + struct utimbuf times; + + times.actime = info.mtime; + times.modtime = info.mtime; + /* Close first. + * On some systems calling utime + * then closing resets the mtime. */ + close(STDOUT_FILENO); + /* Ignoring errors */ + utime(new_name, ×); + } + /* Delete _compressed_ file */ del = filename; /* restore extension (unless tgz -> tar case) */ @@ -159,13 +175,13 @@ char* make_new_name_bunzip2(char *filename) } static -USE_DESKTOP(long long) int unpack_bunzip2(void) +USE_DESKTOP(long long) int unpack_bunzip2(unpack_info_t *info UNUSED_PARAM) { - return unpack_bz2_stream(STDIN_FILENO, STDOUT_FILENO); + return unpack_bz2_stream_prime(STDIN_FILENO, STDOUT_FILENO); } int bunzip2_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; -int bunzip2_main(int argc ATTRIBUTE_UNUSED, char **argv) +int bunzip2_main(int argc UNUSED_PARAM, char **argv) { getopt32(argv, "cfvdt"); argv += optind; @@ -218,8 +234,8 @@ char* make_new_name_gunzip(char *filename) extension++; if (strcmp(extension, "tgz" + 1) == 0 -#if ENABLE_FEATURE_GUNZIP_UNCOMPRESS - || strcmp(extension, "Z") == 0 +#if ENABLE_FEATURE_SEAMLESS_Z + || (extension[0] == 'Z' && extension[1] == '\0') #endif ) { extension[-1] = '\0'; @@ -235,7 +251,7 @@ char* make_new_name_gunzip(char *filename) } static -USE_DESKTOP(long long) int unpack_gunzip(void) +USE_DESKTOP(long long) int unpack_gunzip(unpack_info_t *info) { USE_DESKTOP(long long) int status = -1; @@ -244,10 +260,10 @@ USE_DESKTOP(long long) int unpack_gunzip(void) unsigned char magic2; magic2 = xread_char(STDIN_FILENO); - if (ENABLE_FEATURE_GUNZIP_UNCOMPRESS && magic2 == 0x9d) { - status = uncompress(STDIN_FILENO, STDOUT_FILENO); + if (ENABLE_FEATURE_SEAMLESS_Z && magic2 == 0x9d) { + status = unpack_Z_stream(STDIN_FILENO, STDOUT_FILENO); } else if (magic2 == 0x8b) { - status = unpack_gz_stream(STDIN_FILENO, STDOUT_FILENO); + status = unpack_gz_stream_with_info(STDIN_FILENO, STDOUT_FILENO, info); } else { goto bad_magic; } @@ -277,7 +293,7 @@ USE_DESKTOP(long long) int unpack_gunzip(void) */ int gunzip_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; -int gunzip_main(int argc ATTRIBUTE_UNUSED, char **argv) +int gunzip_main(int argc UNUSED_PARAM, char **argv) { getopt32(argv, "cfvdtn"); argv += optind; @@ -309,13 +325,13 @@ char* make_new_name_unlzma(char *filename) } static -USE_DESKTOP(long long) int unpack_unlzma(void) +USE_DESKTOP(long long) int unpack_unlzma(unpack_info_t *info UNUSED_PARAM) { return unpack_lzma_stream(STDIN_FILENO, STDOUT_FILENO); } int unlzma_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; -int unlzma_main(int argc ATTRIBUTE_UNUSED, char **argv) +int unlzma_main(int argc UNUSED_PARAM, char **argv) { getopt32(argv, "cf"); argv += optind; @@ -344,20 +360,20 @@ char* make_new_name_uncompress(char *filename) } static -USE_DESKTOP(long long) int unpack_uncompress(void) +USE_DESKTOP(long long) int unpack_uncompress(unpack_info_t *info UNUSED_PARAM) { USE_DESKTOP(long long) int status = -1; if ((xread_char(STDIN_FILENO) != 0x1f) || (xread_char(STDIN_FILENO) != 0x9d)) { bb_error_msg("invalid magic"); } else { - status = uncompress(STDIN_FILENO, STDOUT_FILENO); + status = unpack_Z_stream(STDIN_FILENO, STDOUT_FILENO); } return status; } int uncompress_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; -int uncompress_main(int argc ATTRIBUTE_UNUSED, char **argv) +int uncompress_main(int argc UNUSED_PARAM, char **argv) { getopt32(argv, "cf"); argv += optind;