1 /*
2  * Author:
3  *	Guido Draheim <guidod@gmx.de>
4  *	Tomi Ollila <Tomi.Ollila@iki.fi>
5  *
6  * Copyright (c) Guido Draheim, use under copyleft (LPGL,MPL)
7  *
8  * if you see "unknown symbol" errors, check first that `-I ..` is part of
9  * your compiler options - a special hint to VC/IDE users who tend to make up
10  * their own workspace files. All includes look like #include <zzip|*.h>, so
11  * you need to add an include path to the dir containing (!!) the ./zzip/ dir
12  */
13 
14 #ifndef _ZZIP_ZZIP_H /* zziplib.h */
15 #define _ZZIP_ZZIP_H
16 
17 #include <zzip/types.h>
18 
19 #ifdef __cplusplus
20 extern "C" {
21 #endif
22 
23 /* the zzip_error_t is also used to pass back ZLIB errors... */
24 #define ZZIP_ERROR -4096
25 
26 typedef enum
27 {
28     ZZIP_NO_ERROR = 0,	/* no error, may be used if user sets it. */
29     ZZIP_OUTOFMEM =      ZZIP_ERROR-20, /* out of memory */
30     ZZIP_DIR_OPEN =      ZZIP_ERROR-21, /* failed to open zipfile, see errno for details */
31     ZZIP_DIR_STAT =      ZZIP_ERROR-22, /* failed to fstat zipfile, see errno for details */
32     ZZIP_DIR_SEEK =      ZZIP_ERROR-23, /* failed to lseek zipfile, see errno for details */
33     ZZIP_DIR_READ =      ZZIP_ERROR-24, /* failed to read zipfile, see errno for details */
34     ZZIP_DIR_TOO_SHORT = ZZIP_ERROR-25,
35     ZZIP_DIR_EDH_MISSING = ZZIP_ERROR-26,
36     ZZIP_DIRSIZE =       ZZIP_ERROR-27,
37     ZZIP_ENOENT =        ZZIP_ERROR-28,
38     ZZIP_UNSUPP_COMPR =  ZZIP_ERROR-29,
39     ZZIP_CORRUPTED =     ZZIP_ERROR-31,
40     ZZIP_UNDEF =         ZZIP_ERROR-32,
41     ZZIP_DIR_LARGEFILE = ZZIP_ERROR-33
42 } zzip_error_t;
43 
44 /*
45  * zzip_open flags.
46  */
47 #define ZZIP_CASEINSENSITIVE	O_APPEND /* do not use anymore. use CASLESS */
48 #define ZZIP_IGNOREPATH	        O_TRUNC  /* do not use anymore. use NOPATHS */
49 #define ZZIP_EXTRAFLAGS         (ZZIP_CASEINSENSITIVE|ZZIP_IGNOREPATH)
50 
51 /* zzip_open_ext_io o_modes flags : new style. use these from now on! */
52 #define ZZIP_CASELESS           (1<<12) /* ignore filename case inside zips */
53 #define ZZIP_NOPATHS            (1<<13) /* ignore subdir paths, just filename*/
54 #define ZZIP_PREFERZIP          (1<<14) /* try first zipped file, then real*/
55 #define ZZIP_ONLYZIP            (1<<16) /* try _only_ zipped file, skip real*/
56 #define ZZIP_FACTORY            (1<<17) /* old file handle is not closed */
57 #define ZZIP_ALLOWREAL          (1<<18) /* real files use default_io (magic) */
58 #define ZZIP_THREADED           (1<<19) /* try to be safe for multithreading */
59 
60 /*
61  * zzip largefile renames
62  */
63 #ifdef ZZIP_LARGEFILE_RENAME
64 #define zzip_telldir zzip_telldir64
65 #define zzip_seekdir zzip_seekdir64
66 #endif
67 
68 /*
69  * zzip typedefs
70  */
71 /* zzip_strings_t ext[] = { ".zip", ".jar", ".pk3", 0 } */
72 typedef  char _zzip_const * _zzip_const zzip_strings_t;
73 typedef  char _zzip_const       zzip_char_t;
74 typedef struct zzip_dir		ZZIP_DIR;
75 typedef struct zzip_file	ZZIP_FILE;
76 typedef struct zzip_dirent 	ZZIP_DIRENT;
77 typedef struct zzip_dirent 	ZZIP_STAT;
78 
79 struct zzip_dirent
80 {
81     int	 	d_compr;	/* compression method */
82     int         d_csize;        /* compressed size */
83     int	 	st_size;	/* file size / decompressed size */
84     char * 	d_name;		/* file name / strdupped name */
85 };
86 
87 /*
88  * Getting error strings
89  * zzip/err.c
90  */
91 _zzip_export    /* error in _opendir : */
92 zzip_char_t* 	zzip_strerror(int errcode);
93 _zzip_export    /* error in other functions : */
94 zzip_char_t* 	zzip_strerror_of(ZZIP_DIR * dir);
95 _zzip_export    /* error mapped to errno.h defines : */
96 int    	 	zzip_errno(int errcode);
97 
98 
99 /*
100  * Functions to grab information from ZZIP_DIR/ZZIP_FILE structure
101  * (if ever needed)
102  * zzip/info.c
103  */
104 _zzip_export
105 int  	 	zzip_error(ZZIP_DIR * dir);
106 _zzip_export
107 void 	 	zzip_seterror(ZZIP_DIR * dir, int errcode);
108 _zzip_export
109 zzip_char_t* 	zzip_compr_str(int compr);
110 
111 _zzip_export
112 ZZIP_DIR * 	zzip_dirhandle(ZZIP_FILE * fp);
113 _zzip_export
114 int           	zzip_dirfd(ZZIP_DIR * dir);
115 _zzip_export
116 int            	zzip_dir_real(ZZIP_DIR * dir);
117 _zzip_export
118 int      	zzip_file_real(ZZIP_FILE * fp);
119 _zzip_export
120 void*           zzip_realdir(ZZIP_DIR * dir);
121 _zzip_export
122 int             zzip_realfd(ZZIP_FILE * fp);
123 
124 /*
125  * zip handle management
126  * zzip/zip.c
127  */
128 _zzip_export
129 ZZIP_DIR *      zzip_dir_alloc(zzip_strings_t* fileext);
130 _zzip_export
131 int             zzip_dir_free(ZZIP_DIR *);
132 
133 /*
134  * Opening/closing a zip archive
135  * zzip-zip.c
136  */
137 _zzip_export
138 ZZIP_DIR *  	zzip_dir_fdopen(int fd, zzip_error_t * errcode_p);
139 _zzip_export
140 ZZIP_DIR *  	zzip_dir_open(zzip_char_t* filename, zzip_error_t * errcode_p);
141 _zzip_export
142 int	  	zzip_dir_close(ZZIP_DIR * dir);
143 _zzip_export
144 int             zzip_dir_read(ZZIP_DIR * dir, ZZIP_DIRENT * dirent);
145 
146 
147 /*
148  * Scanning files in zip archive
149  * zzip/dir.c
150  * zzip/zip.c
151  */
152 _zzip_export
153 ZZIP_DIR * 	zzip_opendir(zzip_char_t* filename);
154 _zzip_export
155 int          	zzip_closedir(ZZIP_DIR * dir);
156 _zzip_export
157 ZZIP_DIRENT * 	zzip_readdir(ZZIP_DIR * dir);
158 _zzip_export
159 void 	 	zzip_rewinddir(ZZIP_DIR * dir);
160 _zzip_export
161 zzip_off_t  	zzip_telldir(ZZIP_DIR * dir);
162 _zzip_export
163 void	 	zzip_seekdir(ZZIP_DIR * dir, zzip_off_t offset);
164 
165 /*
166  * 'opening', 'closing' and reading individual files in zip archive.
167  * zzip/file.c
168  */
169 _zzip_export
170 ZZIP_FILE * 	zzip_file_open(ZZIP_DIR * dir, zzip_char_t* name, int flags);
171 _zzip_export
172 int  		zzip_file_close(ZZIP_FILE * fp);
173 _zzip_export
174 zzip_ssize_t	zzip_file_read(ZZIP_FILE * fp, void* buf, zzip_size_t len);
175 
176 _zzip_export
177 ZZIP_FILE * 	zzip_open(zzip_char_t* name, int flags);
178 _zzip_export
179 int	 	zzip_close(ZZIP_FILE * fp);
180 _zzip_export
181 zzip_ssize_t	zzip_read(ZZIP_FILE * fp, void * buf, zzip_size_t len);
182 
183 /*
184  * Read data from the specified offset.  Depending on the
185  * implementation, this may or may not move the file pointer.
186  */
187 _zzip_export
188 zzip_size_t
189 zzip_pread(ZZIP_FILE *file, void *ptr, zzip_size_t size, zzip_off_t offset);
190 
191 /*
192  * the stdc variant to open/read/close files. - Take note of the freopen()
193  * call as it may reuse an existing preparsed copy of a zip central directory
194  */
195 _zzip_export
196 ZZIP_FILE*      zzip_freopen(zzip_char_t* name, zzip_char_t* mode, ZZIP_FILE*);
197 _zzip_export
198 ZZIP_FILE*      zzip_fopen(zzip_char_t* name, zzip_char_t* mode);
199 _zzip_export
200 zzip_size_t     zzip_fread(void *ptr, zzip_size_t size, zzip_size_t nmemb,
201 			   ZZIP_FILE * file);
202 _zzip_export
203 int  		zzip_fclose(ZZIP_FILE * fp);
204 
205 /*
206  *  seek and tell functions
207  */
208 _zzip_export
209 int             zzip_rewind(ZZIP_FILE *fp);
210 _zzip_export
211 zzip_off_t      zzip_seek(ZZIP_FILE * fp, zzip_off_t offset, int whence);
212 _zzip_export
213 zzip_off_t      zzip_tell(ZZIP_FILE * fp);
214 
215 /*
216  * reading info of a single file
217  * zzip/stat.c
218  */
219 _zzip_export
220 int		zzip_dir_stat(ZZIP_DIR * dir, zzip_char_t* name,
221 			      ZZIP_STAT * zs, int flags);
222 _zzip_export
223 int		zzip_file_stat(ZZIP_FILE * fp, ZZIP_STAT * zs);
224 _zzip_export
225 int		zzip_fstat(ZZIP_FILE * fp, ZZIP_STAT * zs);
226 
227 #ifdef ZZIP_LARGEFILE_RENAME
228 #define zzip_open_shared_io  zzip_open_shared_io64
229 #define zzip_open_ext_io     zzip_open_ext_io64
230 #define zzip_opendir_ext_io  zzip_opendir_ext_io64
231 #define zzip_dir_open_ext_io zzip_dir_open_ext_io64
232 #define zzip_plugin_io_t     zzip_plugin_io64_t
233 #endif
234 
235 /*
236  * all ext_io functions can be called with a default of ext/io == zero/zero
237  * which will default to a ".zip" extension and posix io of the system.
238  */
239 typedef union _zzip_plugin_io _zzip_const * zzip_plugin_io_t;
240 
241 _zzip_export
242 ZZIP_FILE * zzip_open_shared_io(ZZIP_FILE* stream,
243 				zzip_char_t* name, int o_flags, int o_modes,
244 				zzip_strings_t* ext, zzip_plugin_io_t io);
245 
246 _zzip_export
247 ZZIP_FILE * zzip_open_ext_io(zzip_char_t* name, int o_flags, int o_modes,
248 			     zzip_strings_t* ext, zzip_plugin_io_t io);
249 
250 _zzip_export
251 ZZIP_DIR *  zzip_opendir_ext_io(zzip_char_t* name, int o_modes,
252 				zzip_strings_t* ext, zzip_plugin_io_t io);
253 
254 _zzip_export
255 ZZIP_DIR *  zzip_dir_open_ext_io(zzip_char_t* filename,
256 				 zzip_error_t* errcode_p,
257 				 zzip_strings_t* ext, zzip_plugin_io_t io);
258 
259 /* zzip_file_open_ext_io => zzip_dir_open_ext_io + zzip_file_open */
260 
261 #ifdef __cplusplus
262 }
263 #endif
264 
265 #endif /* _ZZIPLIB_H */
266 
267 /*
268  * Local variables:
269  * c-file-style: "stroustrup"
270  * End:
271  */
272