1/*
2 * Copyright (c) 2001, 2016, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.  Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26#define ushort unsigned short
27#define uint   unsigned int
28#define uchar  unsigned char
29
30struct unpacker;
31
32struct jar {
33  // JAR file writer
34  FILE*       jarfp;
35  int         default_modtime;
36
37  const char* jarname;
38
39  // Used by unix2dostime:
40  int         modtime_cache;
41  uLong       dostime_cache;
42
43  // Private members
44  fillbytes   central_directory;
45  uint        central_directory_count;
46  uint        output_file_offset;
47  fillbytes   deflated;  // temporary buffer
48
49  // pointer to outer unpacker, for error checks etc.
50  unpacker* u;
51
52  // Public Methods
53  void openJarFile(const char* fname);
54  void addJarEntry(const char* fname,
55                   bool deflate_hint, int modtime,
56                   bytes& head, bytes& tail);
57  void addDirectoryToJarFile(const char* dir_name);
58  void closeJarFile(bool central);
59
60  void init(unpacker* u_);
61
62  void free() {
63    central_directory.free();
64    deflated.free();
65  }
66
67  void reset() {
68    free();
69    init(u);
70  }
71
72  // Private Methods
73  void write_data(void* ptr, size_t len);
74  void write_data(bytes& b) { write_data(b.ptr, b.len); }
75  void add_to_jar_directory(const char* fname, bool store, int modtime,
76                            int len, int clen, uLong crc);
77  void write_jar_header(const char* fname, bool store, int modtime,
78                        int len, int clen, unsigned int crc);
79  void write_jar_extra(int len, int clen, unsigned int crc);
80  void write_central_directory();
81  uLong dostime(int y, int n, int d, int h, int m, int s);
82  uLong get_dostime(int modtime);
83
84  // The definitions of these depend on the NO_ZLIB option:
85  bool deflate_bytes(bytes& head, bytes& tail);
86  static uint get_crc32(uint c, unsigned char *ptr, uint len);
87
88  // error handling
89  void abort(const char* msg) { unpack_abort(msg, u); }
90  bool aborting()             { return unpack_aborting(u); }
91};
92
93struct gunzip {
94  // optional gzip input stream control block
95
96  // pointer to outer unpacker, for error checks etc.
97  unpacker* u;
98
99  void* read_input_fn;  // underlying byte stream
100  void* zstream;        // inflater state
101  char inbuf[1 << 14];   // input buffer
102
103  uint  gzcrc;      // CRC gathered from gzip *container* content
104  uint  gzlen;      // CRC gathered length
105
106  void init(unpacker* u_);  // pushes new value on u->read_input_fn
107
108  void free();
109
110  void start(int magic);
111
112  // private stuff
113  void read_fixed_field(char* buf, size_t buflen);
114
115  // error handling
116  void abort(const char* msg) { unpack_abort(msg, u); }
117  bool aborting()             { return unpack_aborting(u); }
118};
119