libclamav/unzip.h
0968c257
 /*
  *  Copyright (C) 2003 - 2006 Tomasz Kojm <tkojm@clamav.net>
  *
  *  The code of this module was based on zziplib 0.12.83:
  *  (c) 1999 - 2002 Guido Draheim <guidod@gmx.de>, published under
  *  the Lesser GNU General Public License
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
  *  the Free Software Foundation; either version 2 of the License, or
  *  (at your option) any later version.
  *
  *  This program is distributed in the hope that it will be useful,
  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  *  GNU General Public License for more details.
  *
  *  You should have received a copy of the GNU General Public License
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
  *  MA 02110-1301, USA.
  */
 
 #ifndef __UNZIP_H
 #define __UNZIP_H
 
 #if HAVE_CONFIG_H
 #include "clamav-config.h"
 #endif
 
 #include <stddef.h>
 #include <stdio.h>
 #include <sys/types.h>
 
 #include "cltypes.h"
 
59afa53d
 #ifndef HAVE_ATTRIB_PACKED
 #define __attribute__(x)
 #endif
 
 #ifdef HAVE_PRAGMA_PACK
 #pragma pack(1)
 #endif
0968c257
 
 /******** Zip format structures *********/
 
 /* Local file header */
 struct zip_file_header
 {
 #   define ZIP_FILE_HEADER_MAGIC 0x04034b50
027e3a84
     uint32_t	    z_magic;	    /* local file header signature */
0968c257
     uint16_t	    z_version;	    /* version needed to extract */
     uint16_t	    z_flags;	    /* general purpose bit flag */
     uint16_t	    z_compr;	    /* compression method */
     uint16_t	    z_modtime;	    /* last mod file time */
     uint16_t	    z_moddate;	    /* last mod file date */
     uint32_t	    z_crc32;	    /* crc-32 */
     uint32_t	    z_csize;	    /* compressed size */
     uint32_t	    z_usize;	    /* uncompressed size */
     uint16_t	    z_namlen;	    /* file name length */
     uint16_t	    z_extras;	    /* extra field length */
 
     /* followed by filename (of variable size) */
     /* followed by extra field (of variable size) */
 } __attribute__((packed));
 
 /* Data descriptor (only if bit 3 of z_flags is set) */
 struct zip_file_trailer
 {
 #   define ZIP_FILE_TRAILER_MAGIC 0x08074B50
     uint32_t z_magic; /* data descriptor signature (0x08074b50) */
     uint32_t z_crc32; /* crc-32 */
     uint32_t z_csize; /* compressed size */
     uint32_t z_usize; /* uncompressed size */
 } __attribute__((packed));
 
 /* Central file header */
 struct zip_root_dirent
 {
 #   define ZIP_ROOT_DIRENT_MAGIC 0x02014b50
027e3a84
     uint32_t	    z_magic;	    /* central file header signature */
0968c257
     uint16_t	    z_version1;	    /* version made by */
     uint16_t	    z_version2;	    /* version needed to extract */
     uint16_t	    z_flags;	    /* general purpose bit flag */
     uint16_t	    z_compr;	    /* compression method */
     uint16_t	    z_modtime;	    /* last mod file time */
     uint16_t	    z_moddate;	    /* last mod file date */
     uint32_t	    z_crc32;	    /* crc-32 */
     uint32_t	    z_csize;	    /* compressed size */
     uint32_t	    z_usize;	    /* uncompressed size */
     uint16_t	    z_namlen;	    /* file name length */
     uint16_t	    z_extras;	    /* extra field length */
     uint16_t	    z_comment;	    /* file comment length */
     uint16_t	    z_diskstart;    /* disk number start */
     uint16_t	    z_filetype;	    /* internal file attributes */
     uint32_t	    z_filemode;	    /* extrnal file attributes */
     uint32_t	    z_off;	    /* relative offset of local header */
 
     /* followed by filename (of variable size) */
     /* followed by extra field (of variable size) */
     /* followed by file comment (of variable size) */
 } __attribute__((packed));
 
 /* End of central directory record */
 struct zip_disk_trailer
 {
 #   define	    ZIP_DISK_TRAILER_MAGIC 0x06054b50
027e3a84
     uint32_t	    z_magic;		/* end of central dir signature */
0968c257
     uint16_t	    z_disk;		/* number of this disk */
     uint16_t	    z_finaldisk;	/* number of the disk with the start
 					 * of the central dir
 					 */
     uint16_t	    z_entries;		/* total number of entries in the
 					 * central dir on this disk
 					 */
     uint16_t	    z_finalentries;	/* total number of entries in the
 					 * central dir
 					 */
     uint32_t	    z_rootsize;		/* size of the central directory */
     uint32_t	    z_rootseek;		/* offset of start of central directory
 					 * with respect to the starting disk
 					 * number
 					 */
     uint16_t	    z_comment;		/* zipfile comment length */
 
     /* followed by zipfile comment (of variable size) */
 } __attribute__((packed));
 
 #define ZIP_METHOD_STORED	    0
 #define ZIP_METHOD_SHRUNK	    1
 #define ZIP_METHOD_REDUCEDx1	    2
 #define ZIP_METHOD_REDUCEDx2	    3
 #define ZIP_METHOD_REDUCEDx3	    4
 #define ZIP_METHOD_REDUCEDx4	    5
 #define ZIP_METHOD_IMPLODED	    6
 #define ZIP_METHOD_TOKENIZED	    7
 #define ZIP_METHOD_DEFLATED	    8
 #define ZIP_METHOD_DEFLATED64	    9
 #define ZIP_METHOD_IMPLODED_DCL	    10
 #define ZIP_METHOD_BZIP2	    12
 #define ZIP_METHOD_AES		    99
 
 
 /******** Internal structures *********/
 
 struct __zip_file
 {
     struct __zip_dir *dir; 
     uint16_t method;
     size_t restlen;
     size_t crestlen;
     size_t usize;
     size_t csize;
     char *buf32k;
     z_stream d_stream;
 };
 
 struct __zip_dir_hdr
 {
     uint32_t    d_usize;	/* uncompressed size */
     uint32_t    d_csize;        /* compressed size */
     uint32_t    d_crc32;        /* crc-32 */
     uint32_t    d_off;          /* offset of file in zipfile */
     uint16_t    d_reclen;       /* next dir_hdr structure offset */
     uint16_t    d_namlen;       /* explicit namelen of d_name */
     uint16_t    d_compr;        /* compression type */
     uint16_t	d_flags;	/* general purpose flags */
     char        d_name[1];      /* actual name of the entry */
 };
 
 struct __zip_dirent
 {
     uint16_t 	d_compr;	/* compression method */
     uint32_t    d_csize;        /* compressed size */
     uint32_t 	st_size;	/* file size / decompressed size */
     uint16_t	d_flags;	/* general purpose flags */
     char	*d_name;	/* file name / strdupped name */
     uint32_t    d_crc32;        /* crc-32 */
     uint32_t    d_off;          /* the offset in the file */
 };
 
 struct __zip_dir
 {
     int fd;
     int errcode;
     struct {
         struct __zip_file *fp;
         char *buf32k;
     } cache;
     struct __zip_dir_hdr *hdr0;
     struct __zip_dir_hdr *hdr;
     struct __zip_dirent dirent;
 }; 
 
 /* typedefs */
 typedef struct __zip_dir	zip_dir;
 typedef struct __zip_dir_hdr	zip_dir_hdr;
 typedef struct __zip_file	zip_file;
 typedef struct __zip_dirent 	zip_dirent;
 
 zip_dir *zip_dir_open(int fd, off_t start, int *errcode_p);
 int zip_dir_read(zip_dir *dir, zip_dirent *d);
 zip_file *zip_file_open(zip_dir *dir, const char *name, int d_off);
 ssize_t zip_file_read(zip_file *fp, char *buf, size_t len);
 int zip_file_close(zip_file *fp);
 int zip_dir_close(zip_dir *dir);
 
 #endif /* __UNZIP_H */