From 7ca04f328e22fcbee4659d73f9a72dfdf1dd6a23 Mon Sep 17 00:00:00 2001 From: Glenn L McGrath Date: Wed, 25 Sep 2002 02:47:48 +0000 Subject: New common unarchive code. --- archival/libunarchive/check_header_gzip.c | 75 +++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 archival/libunarchive/check_header_gzip.c (limited to 'archival/libunarchive/check_header_gzip.c') diff --git a/archival/libunarchive/check_header_gzip.c b/archival/libunarchive/check_header_gzip.c new file mode 100644 index 000000000..508d30924 --- /dev/null +++ b/archival/libunarchive/check_header_gzip.c @@ -0,0 +1,75 @@ +#include +#include +#include "libbb.h" + +extern void check_header_gzip(int src_fd) +{ + union { + unsigned char raw[10]; + struct { + unsigned char magic[2]; + unsigned char method; + unsigned char flags; + unsigned int mtime; + unsigned char xtra_flags; + unsigned char os_flags; + } formated; + } header; + + xread_all(src_fd, header.raw, 10); + + /* Magic header for gzip files, 1F 8B = \037\213 */ + if ((header.formated.magic[0] != 0x1F) + || (header.formated.magic[1] != 0x8b)) { + error_msg_and_die("Invalid gzip magic"); + } + + /* Check the compression method */ + if (header.formated.method != 8) { + error_msg_and_die("Unknown compression method %d", + header.formated.method); + } + + if (header.formated.flags & 0x04) { + /* bit 2 set: extra field present */ + unsigned char extra_short; + + extra_short = xread_char(src_fd); + extra_short += xread_char(src_fd) << 8; + while (extra_short > 0) { + /* Ignore extra field */ + xread_char(src_fd); + extra_short--; + } + } + + /* Discard original name if any */ + if (header.formated.flags & 0x08) { + /* bit 3 set: original file name present */ + char tmp; + + do { + read(src_fd, &tmp, 1); + } while (tmp != 0); + } + + /* Discard file comment if any */ + if (header.formated.flags & 0x10) { + /* bit 4 set: file comment present */ + char tmp; + + do { + read(src_fd, &tmp, 1); + } while (tmp != 0); + } + + /* Read the header checksum */ + if (header.formated.flags & 0x02) { + char tmp; + + read(src_fd, &tmp, 1); + read(src_fd, &tmp, 1); + } + + return; +} -- cgit v1.2.3