Magellan Linux

Annotation of /trunk/mkinitrd-magellan/busybox/archival/libunarchive/check_header_gzip.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 532 - (hide annotations) (download)
Sat Sep 1 22:45:15 2007 UTC (16 years, 8 months ago) by niro
File MIME type: text/plain
File size: 1391 byte(s)
-import if magellan mkinitrd; it is a fork of redhats mkinitrd-5.0.8 with all magellan patches and features; deprecates magellan-src/mkinitrd

1 niro 532 /* vi: set sw=4 ts=4: */
2     /*
3     * Licensed under GPLv2 or later, see file LICENSE in this tarball for details.
4     */
5     #include <stdlib.h>
6     #include <unistd.h>
7     #include "libbb.h"
8     #include "unarchive.h" /* for external decl of check_header_gzip */
9    
10     void check_header_gzip(int src_fd)
11     {
12     union {
13     unsigned char raw[8];
14     struct {
15     unsigned char method;
16     unsigned char flags;
17     unsigned int mtime;
18     unsigned char xtra_flags;
19     unsigned char os_flags;
20     } formatted;
21     } header;
22    
23     xread(src_fd, header.raw, 8);
24    
25     /* Check the compression method */
26     if (header.formatted.method != 8) {
27     bb_error_msg_and_die("unknown compression method %d",
28     header.formatted.method);
29     }
30    
31     if (header.formatted.flags & 0x04) {
32     /* bit 2 set: extra field present */
33     unsigned char extra_short;
34    
35     extra_short = xread_char(src_fd) + (xread_char(src_fd) << 8);
36     while (extra_short > 0) {
37     /* Ignore extra field */
38     xread_char(src_fd);
39     extra_short--;
40     }
41     }
42    
43     /* Discard original name if any */
44     if (header.formatted.flags & 0x08) {
45     /* bit 3 set: original file name present */
46     while (xread_char(src_fd) != 0);
47     }
48    
49     /* Discard file comment if any */
50     if (header.formatted.flags & 0x10) {
51     /* bit 4 set: file comment present */
52     while (xread_char(src_fd) != 0);
53     }
54    
55     /* Read the header checksum */
56     if (header.formatted.flags & 0x02) {
57     xread_char(src_fd);
58     xread_char(src_fd);
59     }
60    
61     return;
62     }