3 |
* Licensed under GPLv2 or later, see file LICENSE in this tarball for details. |
* Licensed under GPLv2 or later, see file LICENSE in this tarball for details. |
4 |
*/ |
*/ |
5 |
|
|
|
#include <stdlib.h> |
|
|
|
|
6 |
#include "libbb.h" |
#include "libbb.h" |
7 |
#include "unarchive.h" |
#include "unarchive.h" |
8 |
|
|
9 |
char get_header_tar_gz(archive_handle_t *archive_handle) |
char FAST_FUNC get_header_tar_gz(archive_handle_t *archive_handle) |
10 |
{ |
{ |
11 |
|
#if BB_MMU |
12 |
unsigned char magic[2]; |
unsigned char magic[2]; |
13 |
|
#endif |
14 |
|
|
15 |
/* Can't lseek over pipes */ |
/* Can't lseek over pipes */ |
16 |
archive_handle->seek = seek_by_read; |
archive_handle->seek = seek_by_read; |
17 |
|
|
18 |
|
/* Check gzip magic only if open_transformer will invoke unpack_gz_stream (MMU case). |
19 |
|
* Otherwise, it will invoke an external helper "gunzip -cf" (NOMMU case) which will |
20 |
|
* need the header. */ |
21 |
|
#if BB_MMU |
22 |
xread(archive_handle->src_fd, &magic, 2); |
xread(archive_handle->src_fd, &magic, 2); |
23 |
|
/* Can skip this check, but error message will be less clear */ |
24 |
if ((magic[0] != 0x1f) || (magic[1] != 0x8b)) { |
if ((magic[0] != 0x1f) || (magic[1] != 0x8b)) { |
25 |
bb_error_msg_and_die("invalid gzip magic"); |
bb_error_msg_and_die("invalid gzip magic"); |
26 |
} |
} |
27 |
|
#endif |
28 |
|
|
29 |
check_header_gzip(archive_handle->src_fd); |
open_transformer(archive_handle->src_fd, unpack_gz_stream, "gunzip"); |
|
|
|
|
archive_handle->src_fd = open_transformer(archive_handle->src_fd, inflate_gunzip); |
|
30 |
archive_handle->offset = 0; |
archive_handle->offset = 0; |
31 |
while (get_header_tar(archive_handle) == EXIT_SUCCESS) /**/; |
while (get_header_tar(archive_handle) == EXIT_SUCCESS) |
32 |
|
continue; |
33 |
|
|
34 |
/* Can only do one file at a time */ |
/* Can only do one file at a time */ |
35 |
return EXIT_FAILURE; |
return EXIT_FAILURE; |