| 1 | /* |
| 2 | This libary has been modified for use by the MySQL Archive Engine. |
| 3 | -Brian Aker |
| 4 | */ |
| 5 | |
| 6 | /* zlib.h -- interface of the 'zlib' general purpose compression library |
| 7 | version 1.2.3, July 18th, 2005 |
| 8 | |
| 9 | Copyright (C) 1995-2005 Jean-loup Gailly and Mark Adler |
| 10 | |
| 11 | This software is provided 'as-is', without any express or implied |
| 12 | warranty. In no event will the authors be held liable for any damages |
| 13 | arising from the use of this software. |
| 14 | |
| 15 | Permission is granted to anyone to use this software for any purpose, |
| 16 | including commercial applications, and to alter it and redistribute it |
| 17 | freely, subject to the following restrictions: |
| 18 | |
| 19 | 1. The origin of this software must not be misrepresented; you must not |
| 20 | claim that you wrote the original software. If you use this software |
| 21 | in a product, an acknowledgment in the product documentation would be |
| 22 | appreciated but is not required. |
| 23 | 2. Altered source versions must be plainly marked as such, and must not be |
| 24 | misrepresented as being the original software. |
| 25 | 3. This notice may not be removed or altered from any source distribution. |
| 26 | |
| 27 | Jean-loup Gailly Mark Adler |
| 28 | jloup@gzip.org madler@alumni.caltech.edu |
| 29 | |
| 30 | |
| 31 | The data format used by the zlib library is described by RFCs (Request for |
| 32 | Comments) 1950 to 1952 in the files http://www.ietf.org/rfc/rfc1950.txt |
| 33 | (zlib format), rfc1951.txt (deflate format) and rfc1952.txt (gzip format). |
| 34 | */ |
| 35 | |
| 36 | #include "../../mysys/mysys_priv.h" |
| 37 | #include <my_dir.h> |
| 38 | #include <zlib.h> |
| 39 | |
| 40 | #ifdef __cplusplus |
| 41 | extern "C" { |
| 42 | #endif |
| 43 | /* Start of MySQL Specific Information */ |
| 44 | |
| 45 | /* |
| 46 | ulonglong + ulonglong + ulonglong + ulonglong + uchar |
| 47 | */ |
| 48 | #define AZMETA_BUFFER_SIZE sizeof(unsigned long long) \ |
| 49 | + sizeof(unsigned long long) + sizeof(unsigned long long) + sizeof(unsigned long long) \ |
| 50 | + sizeof(unsigned int) + sizeof(unsigned int) \ |
| 51 | + sizeof(unsigned int) + sizeof(unsigned int) \ |
| 52 | + sizeof(unsigned char) |
| 53 | |
| 54 | #define 29 |
| 55 | |
| 56 | #define AZ_MAGIC_POS 0 |
| 57 | #define AZ_VERSION_POS 1 |
| 58 | #define AZ_MINOR_VERSION_POS 2 |
| 59 | #define AZ_BLOCK_POS 3 |
| 60 | #define AZ_STRATEGY_POS 4 |
| 61 | #define AZ_FRM_POS 5 |
| 62 | #define AZ_FRM_LENGTH_POS 9 |
| 63 | #define AZ_META_POS 13 |
| 64 | #define AZ_META_LENGTH_POS 17 |
| 65 | #define AZ_START_POS 21 |
| 66 | #define AZ_ROW_POS 29 |
| 67 | #define AZ_FLUSH_POS 37 |
| 68 | #define AZ_CHECK_POS 45 |
| 69 | #define AZ_AUTOINCREMENT_POS 53 |
| 70 | #define AZ_LONGEST_POS 61 |
| 71 | #define AZ_SHORTEST_POS 65 |
| 72 | #define 69 |
| 73 | #define 73 |
| 74 | #define AZ_DIRTY_POS 77 |
| 75 | |
| 76 | |
| 77 | /* |
| 78 | Flags for state |
| 79 | */ |
| 80 | #define AZ_STATE_CLEAN 0 |
| 81 | #define AZ_STATE_DIRTY 1 |
| 82 | #define AZ_STATE_SAVED 2 |
| 83 | #define AZ_STATE_CRASHED 3 |
| 84 | |
| 85 | /* |
| 86 | The 'zlib' compression library provides in-memory compression and |
| 87 | decompression functions, including integrity checks of the uncompressed |
| 88 | data. This version of the library supports only one compression method |
| 89 | (deflation) but other algorithms will be added later and will have the same |
| 90 | stream interface. |
| 91 | |
| 92 | Compression can be done in a single step if the buffers are large |
| 93 | enough (for example if an input file is mmap'ed), or can be done by |
| 94 | repeated calls of the compression function. In the latter case, the |
| 95 | application must provide more input and/or consume the output |
| 96 | (providing more output space) before each call. |
| 97 | |
| 98 | The compressed data format used by default by the in-memory functions is |
| 99 | the zlib format, which is a zlib wrapper documented in RFC 1950, wrapped |
| 100 | around a deflate stream, which is itself documented in RFC 1951. |
| 101 | |
| 102 | The library also supports reading and writing files in gzip (.gz) format |
| 103 | with an interface similar to that of stdio using the functions that start |
| 104 | with "gz". The gzip format is different from the zlib format. gzip is a |
| 105 | gzip wrapper, documented in RFC 1952, wrapped around a deflate stream. |
| 106 | |
| 107 | This library can optionally read and write gzip streams in memory as well. |
| 108 | |
| 109 | The zlib format was designed to be compact and fast for use in memory |
| 110 | and on communications channels. The gzip format was designed for single- |
| 111 | file compression on file systems, has a larger header than zlib to maintain |
| 112 | directory information, and uses a different, slower check method than zlib. |
| 113 | |
| 114 | The library does not install any signal handler. The decoder checks |
| 115 | the consistency of the compressed data, so the library should never |
| 116 | crash even in case of corrupted input. |
| 117 | */ |
| 118 | |
| 119 | |
| 120 | /* |
| 121 | The application must update next_in and avail_in when avail_in has |
| 122 | dropped to zero. It must update next_out and avail_out when avail_out |
| 123 | has dropped to zero. The application must initialize zalloc, zfree and |
| 124 | opaque before calling the init function. All other fields are set by the |
| 125 | compression library and must not be updated by the application. |
| 126 | |
| 127 | The opaque value provided by the application will be passed as the first |
| 128 | parameter for calls of zalloc and zfree. This can be useful for custom |
| 129 | memory management. The compression library attaches no meaning to the |
| 130 | opaque value. |
| 131 | |
| 132 | zalloc must return Z_NULL if there is not enough memory for the object. |
| 133 | If zlib is used in a multi-threaded application, zalloc and zfree must be |
| 134 | thread safe. |
| 135 | |
| 136 | On 16-bit systems, the functions zalloc and zfree must be able to allocate |
| 137 | exactly 65536 bytes, but will not be required to allocate more than this |
| 138 | if the symbol MAXSEG_64K is defined (see zconf.h). WARNING: On MSDOS, |
| 139 | pointers returned by zalloc for objects of exactly 65536 bytes *must* |
| 140 | have their offset normalized to zero. The default allocation function |
| 141 | provided by this library ensures this (see zutil.c). To reduce memory |
| 142 | requirements and avoid any allocation of 64K objects, at the expense of |
| 143 | compression ratio, compile the library with -DMAX_WBITS=14 (see zconf.h). |
| 144 | |
| 145 | The fields total_in and total_out can be used for statistics or |
| 146 | progress reports. After compression, total_in holds the total size of |
| 147 | the uncompressed data and may be saved for use in the decompressor |
| 148 | (particularly if the decompressor wants to decompress everything in |
| 149 | a single step). |
| 150 | */ |
| 151 | |
| 152 | /* constants */ |
| 153 | |
| 154 | #define Z_NO_FLUSH 0 |
| 155 | #define Z_PARTIAL_FLUSH 1 /* will be removed, use Z_SYNC_FLUSH instead */ |
| 156 | #define Z_SYNC_FLUSH 2 |
| 157 | #define Z_FULL_FLUSH 3 |
| 158 | #define Z_FINISH 4 |
| 159 | #define Z_BLOCK 5 |
| 160 | /* Allowed flush values; see deflate() and inflate() below for details */ |
| 161 | |
| 162 | #define Z_OK 0 |
| 163 | #define Z_STREAM_END 1 |
| 164 | #define Z_NEED_DICT 2 |
| 165 | #define Z_ERRNO (-1) |
| 166 | #define Z_STREAM_ERROR (-2) |
| 167 | #define Z_DATA_ERROR (-3) |
| 168 | #define Z_MEM_ERROR (-4) |
| 169 | #define Z_BUF_ERROR (-5) |
| 170 | #define Z_VERSION_ERROR (-6) |
| 171 | /* Return codes for the compression/decompression functions. Negative |
| 172 | * values are errors, positive values are used for special but normal events. |
| 173 | */ |
| 174 | |
| 175 | #define Z_NO_COMPRESSION 0 |
| 176 | #define Z_BEST_SPEED 1 |
| 177 | #define Z_BEST_COMPRESSION 9 |
| 178 | #define Z_DEFAULT_COMPRESSION (-1) |
| 179 | /* compression levels */ |
| 180 | |
| 181 | #define Z_FILTERED 1 |
| 182 | #define Z_HUFFMAN_ONLY 2 |
| 183 | #define Z_RLE 3 |
| 184 | #define Z_FIXED 4 |
| 185 | #define Z_DEFAULT_STRATEGY 0 |
| 186 | /* compression strategy; see deflateInit2() below for details */ |
| 187 | |
| 188 | #define Z_BINARY 0 |
| 189 | #define Z_TEXT 1 |
| 190 | #define Z_ASCII Z_TEXT /* for compatibility with 1.2.2 and earlier */ |
| 191 | #define Z_UNKNOWN 2 |
| 192 | /* Possible values of the data_type field (though see inflate()) */ |
| 193 | |
| 194 | #define Z_DEFLATED 8 |
| 195 | /* The deflate compression method (the only one supported in this version) */ |
| 196 | |
| 197 | #define Z_NULL 0 /* for initializing zalloc, zfree, opaque */ |
| 198 | #define AZ_BUFSIZE_READ 32768 |
| 199 | #define AZ_BUFSIZE_WRITE 16384 |
| 200 | |
| 201 | #define AZ_FRMVER_LEN 16 /* same as MY_UUID_SIZE in 10.0.2 */ |
| 202 | |
| 203 | typedef struct azio_stream { |
| 204 | z_stream stream; |
| 205 | int z_err; /* error code for last stream operation */ |
| 206 | int z_eof; /* set if end of input file */ |
| 207 | File file; /* .gz file */ |
| 208 | Byte inbuf[AZ_BUFSIZE_READ]; /* input buffer */ |
| 209 | Byte outbuf[AZ_BUFSIZE_WRITE]; /* output buffer */ |
| 210 | uLong crc; /* crc32 of uncompressed data */ |
| 211 | char *msg; /* error message */ |
| 212 | int transparent; /* 1 if input file is not a .gz file */ |
| 213 | char mode; /* 'w' or 'r' */ |
| 214 | my_off_t start; /* start of compressed data in file (header skipped) */ |
| 215 | my_off_t in; /* bytes into deflate or inflate */ |
| 216 | my_off_t out; /* bytes out of deflate or inflate */ |
| 217 | int back; /* one character push-back */ |
| 218 | int last; /* true if push-back is last character */ |
| 219 | unsigned char version; /* Version */ |
| 220 | unsigned char minor_version; /* Version */ |
| 221 | unsigned int block_size; /* Block Size */ |
| 222 | unsigned long long check_point; /* Last position we checked */ |
| 223 | unsigned long long forced_flushes; /* Forced Flushes */ |
| 224 | unsigned long long rows; /* rows */ |
| 225 | unsigned long long auto_increment; /* auto increment field */ |
| 226 | unsigned int longest_row; /* Longest row */ |
| 227 | unsigned int shortest_row; /* Shortest row */ |
| 228 | unsigned char dirty; /* State of file */ |
| 229 | unsigned int frm_start_pos; /* Position for start of FRM */ |
| 230 | unsigned int frm_length; /* Position for start of FRM */ |
| 231 | unsigned char frmver[AZ_FRMVER_LEN]; |
| 232 | unsigned int frmver_length; |
| 233 | unsigned int ; /* Position for start of comment */ |
| 234 | unsigned int ; /* Position for start of comment */ |
| 235 | } azio_stream; |
| 236 | |
| 237 | /* basic functions */ |
| 238 | |
| 239 | extern int azopen(azio_stream *s, const char *path, int Flags); |
| 240 | /* |
| 241 | Opens a gzip (.gz) file for reading or writing. The mode parameter |
| 242 | is as in fopen ("rb" or "wb") but can also include a compression level |
| 243 | ("wb9") or a strategy: 'f' for filtered data as in "wb6f", 'h' for |
| 244 | Huffman only compression as in "wb1h", or 'R' for run-length encoding |
| 245 | as in "wb1R". (See the description of deflateInit2 for more information |
| 246 | about the strategy parameter.) |
| 247 | |
| 248 | azopen can be used to read a file which is not in gzip format; in this |
| 249 | case gzread will directly read from the file without decompression. |
| 250 | |
| 251 | azopen returns NULL if the file could not be opened or if there was |
| 252 | insufficient memory to allocate the (de)compression state; errno |
| 253 | can be checked to distinguish the two cases (if errno is zero, the |
| 254 | zlib error is Z_MEM_ERROR). */ |
| 255 | |
| 256 | int azdopen(azio_stream *s,File fd, int Flags); |
| 257 | /* |
| 258 | azdopen() associates a azio_stream with the file descriptor fd. File |
| 259 | descriptors are obtained from calls like open, dup, creat, pipe or |
| 260 | fileno (in the file has been previously opened with fopen). |
| 261 | The mode parameter is as in azopen. |
| 262 | The next call of gzclose on the returned azio_stream will also close the |
| 263 | file descriptor fd, just like fclose(fdopen(fd), mode) closes the file |
| 264 | descriptor fd. If you want to keep fd open, use azdopen(dup(fd), mode). |
| 265 | azdopen returns NULL if there was insufficient memory to allocate |
| 266 | the (de)compression state. |
| 267 | */ |
| 268 | |
| 269 | |
| 270 | extern unsigned int azread ( azio_stream *s, voidp buf, size_t len, int *error); |
| 271 | /* |
| 272 | Reads the given number of uncompressed bytes from the compressed file. |
| 273 | If the input file was not in gzip format, gzread copies the given number |
| 274 | of bytes into the buffer. |
| 275 | gzread returns the number of uncompressed bytes actually read (0 for |
| 276 | end of file, -1 for error). */ |
| 277 | |
| 278 | extern unsigned int azwrite (azio_stream *s, const voidp buf, unsigned int len); |
| 279 | /* |
| 280 | Writes the given number of uncompressed bytes into the compressed file. |
| 281 | azwrite returns the number of uncompressed bytes actually written |
| 282 | (0 in case of error). |
| 283 | */ |
| 284 | |
| 285 | |
| 286 | extern int azflush(azio_stream *file, int flush); |
| 287 | /* |
| 288 | Flushes all pending output into the compressed file. The parameter |
| 289 | flush is as in the deflate() function. The return value is the zlib |
| 290 | error number (see function gzerror below). gzflush returns Z_OK if |
| 291 | the flush parameter is Z_FINISH and all output could be flushed. |
| 292 | gzflush should be called only when strictly necessary because it can |
| 293 | degrade compression. |
| 294 | */ |
| 295 | |
| 296 | extern my_off_t azseek (azio_stream *file, |
| 297 | my_off_t offset, int whence); |
| 298 | /* |
| 299 | Sets the starting position for the next gzread or gzwrite on the |
| 300 | given compressed file. The offset represents a number of bytes in the |
| 301 | uncompressed data stream. The whence parameter is defined as in lseek(2); |
| 302 | the value SEEK_END is not supported. |
| 303 | If the file is opened for reading, this function is emulated but can be |
| 304 | extremely slow. If the file is opened for writing, only forward seeks are |
| 305 | supported; gzseek then compresses a sequence of zeroes up to the new |
| 306 | starting position. |
| 307 | |
| 308 | gzseek returns the resulting offset location as measured in bytes from |
| 309 | the beginning of the uncompressed stream, or -1 in case of error, in |
| 310 | particular if the file is opened for writing and the new starting position |
| 311 | would be before the current position. |
| 312 | */ |
| 313 | |
| 314 | extern int azrewind(azio_stream *file); |
| 315 | /* |
| 316 | Rewinds the given file. This function is supported only for reading. |
| 317 | |
| 318 | gzrewind(file) is equivalent to (int)gzseek(file, 0L, SEEK_SET) |
| 319 | */ |
| 320 | |
| 321 | extern my_off_t aztell(azio_stream *file); |
| 322 | /* |
| 323 | Returns the starting position for the next gzread or gzwrite on the |
| 324 | given compressed file. This position represents a number of bytes in the |
| 325 | uncompressed data stream. |
| 326 | |
| 327 | gztell(file) is equivalent to gzseek(file, 0L, SEEK_CUR) |
| 328 | */ |
| 329 | |
| 330 | extern int azclose(azio_stream *file); |
| 331 | /* |
| 332 | Flushes all pending output if necessary, closes the compressed file |
| 333 | and deallocates all the (de)compression state. The return value is the zlib |
| 334 | error number (see function gzerror below). |
| 335 | */ |
| 336 | |
| 337 | extern int azwrite_frm (azio_stream *s, const uchar *blob,size_t length); |
| 338 | extern int azread_frm (azio_stream *s, uchar *blob); |
| 339 | extern int (azio_stream *s, const char *blob, |
| 340 | size_t length); |
| 341 | extern int (azio_stream *s, char *blob); |
| 342 | |
| 343 | #ifdef __cplusplus |
| 344 | } |
| 345 | #endif |
| 346 | |