1*44bedb31SLionel Sambuc /* $NetBSD: iowin32.c,v 1.1.1.1 2006/01/14 20:10:57 christos Exp $ */
2*44bedb31SLionel Sambuc
3*44bedb31SLionel Sambuc /* iowin32.c -- IO base function header for compress/uncompress .zip
4*44bedb31SLionel Sambuc files using zlib + zip or unzip API
5*44bedb31SLionel Sambuc This IO API version uses the Win32 API (for Microsoft Windows)
6*44bedb31SLionel Sambuc
7*44bedb31SLionel Sambuc Version 1.01e, February 12th, 2005
8*44bedb31SLionel Sambuc
9*44bedb31SLionel Sambuc Copyright (C) 1998-2005 Gilles Vollant
10*44bedb31SLionel Sambuc */
11*44bedb31SLionel Sambuc
12*44bedb31SLionel Sambuc #include <stdlib.h>
13*44bedb31SLionel Sambuc
14*44bedb31SLionel Sambuc #include "zlib.h"
15*44bedb31SLionel Sambuc #include "ioapi.h"
16*44bedb31SLionel Sambuc #include "iowin32.h"
17*44bedb31SLionel Sambuc
18*44bedb31SLionel Sambuc #ifndef INVALID_HANDLE_VALUE
19*44bedb31SLionel Sambuc #define INVALID_HANDLE_VALUE (0xFFFFFFFF)
20*44bedb31SLionel Sambuc #endif
21*44bedb31SLionel Sambuc
22*44bedb31SLionel Sambuc #ifndef INVALID_SET_FILE_POINTER
23*44bedb31SLionel Sambuc #define INVALID_SET_FILE_POINTER ((DWORD)-1)
24*44bedb31SLionel Sambuc #endif
25*44bedb31SLionel Sambuc
26*44bedb31SLionel Sambuc voidpf ZCALLBACK win32_open_file_func OF((
27*44bedb31SLionel Sambuc voidpf opaque,
28*44bedb31SLionel Sambuc const char* filename,
29*44bedb31SLionel Sambuc int mode));
30*44bedb31SLionel Sambuc
31*44bedb31SLionel Sambuc uLong ZCALLBACK win32_read_file_func OF((
32*44bedb31SLionel Sambuc voidpf opaque,
33*44bedb31SLionel Sambuc voidpf stream,
34*44bedb31SLionel Sambuc void* buf,
35*44bedb31SLionel Sambuc uLong size));
36*44bedb31SLionel Sambuc
37*44bedb31SLionel Sambuc uLong ZCALLBACK win32_write_file_func OF((
38*44bedb31SLionel Sambuc voidpf opaque,
39*44bedb31SLionel Sambuc voidpf stream,
40*44bedb31SLionel Sambuc const void* buf,
41*44bedb31SLionel Sambuc uLong size));
42*44bedb31SLionel Sambuc
43*44bedb31SLionel Sambuc long ZCALLBACK win32_tell_file_func OF((
44*44bedb31SLionel Sambuc voidpf opaque,
45*44bedb31SLionel Sambuc voidpf stream));
46*44bedb31SLionel Sambuc
47*44bedb31SLionel Sambuc long ZCALLBACK win32_seek_file_func OF((
48*44bedb31SLionel Sambuc voidpf opaque,
49*44bedb31SLionel Sambuc voidpf stream,
50*44bedb31SLionel Sambuc uLong offset,
51*44bedb31SLionel Sambuc int origin));
52*44bedb31SLionel Sambuc
53*44bedb31SLionel Sambuc int ZCALLBACK win32_close_file_func OF((
54*44bedb31SLionel Sambuc voidpf opaque,
55*44bedb31SLionel Sambuc voidpf stream));
56*44bedb31SLionel Sambuc
57*44bedb31SLionel Sambuc int ZCALLBACK win32_error_file_func OF((
58*44bedb31SLionel Sambuc voidpf opaque,
59*44bedb31SLionel Sambuc voidpf stream));
60*44bedb31SLionel Sambuc
61*44bedb31SLionel Sambuc typedef struct
62*44bedb31SLionel Sambuc {
63*44bedb31SLionel Sambuc HANDLE hf;
64*44bedb31SLionel Sambuc int error;
65*44bedb31SLionel Sambuc } WIN32FILE_IOWIN;
66*44bedb31SLionel Sambuc
win32_open_file_func(opaque,filename,mode)67*44bedb31SLionel Sambuc voidpf ZCALLBACK win32_open_file_func (opaque, filename, mode)
68*44bedb31SLionel Sambuc voidpf opaque;
69*44bedb31SLionel Sambuc const char* filename;
70*44bedb31SLionel Sambuc int mode;
71*44bedb31SLionel Sambuc {
72*44bedb31SLionel Sambuc const char* mode_fopen = NULL;
73*44bedb31SLionel Sambuc DWORD dwDesiredAccess,dwCreationDisposition,dwShareMode,dwFlagsAndAttributes ;
74*44bedb31SLionel Sambuc HANDLE hFile = 0;
75*44bedb31SLionel Sambuc voidpf ret=NULL;
76*44bedb31SLionel Sambuc
77*44bedb31SLionel Sambuc dwDesiredAccess = dwShareMode = dwFlagsAndAttributes = 0;
78*44bedb31SLionel Sambuc
79*44bedb31SLionel Sambuc if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER)==ZLIB_FILEFUNC_MODE_READ)
80*44bedb31SLionel Sambuc {
81*44bedb31SLionel Sambuc dwDesiredAccess = GENERIC_READ;
82*44bedb31SLionel Sambuc dwCreationDisposition = OPEN_EXISTING;
83*44bedb31SLionel Sambuc dwShareMode = FILE_SHARE_READ;
84*44bedb31SLionel Sambuc }
85*44bedb31SLionel Sambuc else
86*44bedb31SLionel Sambuc if (mode & ZLIB_FILEFUNC_MODE_EXISTING)
87*44bedb31SLionel Sambuc {
88*44bedb31SLionel Sambuc dwDesiredAccess = GENERIC_WRITE | GENERIC_READ;
89*44bedb31SLionel Sambuc dwCreationDisposition = OPEN_EXISTING;
90*44bedb31SLionel Sambuc }
91*44bedb31SLionel Sambuc else
92*44bedb31SLionel Sambuc if (mode & ZLIB_FILEFUNC_MODE_CREATE)
93*44bedb31SLionel Sambuc {
94*44bedb31SLionel Sambuc dwDesiredAccess = GENERIC_WRITE | GENERIC_READ;
95*44bedb31SLionel Sambuc dwCreationDisposition = CREATE_ALWAYS;
96*44bedb31SLionel Sambuc }
97*44bedb31SLionel Sambuc
98*44bedb31SLionel Sambuc if ((filename!=NULL) && (dwDesiredAccess != 0))
99*44bedb31SLionel Sambuc hFile = CreateFile((LPCTSTR)filename, dwDesiredAccess, dwShareMode, NULL,
100*44bedb31SLionel Sambuc dwCreationDisposition, dwFlagsAndAttributes, NULL);
101*44bedb31SLionel Sambuc
102*44bedb31SLionel Sambuc if (hFile == INVALID_HANDLE_VALUE)
103*44bedb31SLionel Sambuc hFile = NULL;
104*44bedb31SLionel Sambuc
105*44bedb31SLionel Sambuc if (hFile != NULL)
106*44bedb31SLionel Sambuc {
107*44bedb31SLionel Sambuc WIN32FILE_IOWIN w32fiow;
108*44bedb31SLionel Sambuc w32fiow.hf = hFile;
109*44bedb31SLionel Sambuc w32fiow.error = 0;
110*44bedb31SLionel Sambuc ret = malloc(sizeof(WIN32FILE_IOWIN));
111*44bedb31SLionel Sambuc if (ret==NULL)
112*44bedb31SLionel Sambuc CloseHandle(hFile);
113*44bedb31SLionel Sambuc else *((WIN32FILE_IOWIN*)ret) = w32fiow;
114*44bedb31SLionel Sambuc }
115*44bedb31SLionel Sambuc return ret;
116*44bedb31SLionel Sambuc }
117*44bedb31SLionel Sambuc
118*44bedb31SLionel Sambuc
win32_read_file_func(opaque,stream,buf,size)119*44bedb31SLionel Sambuc uLong ZCALLBACK win32_read_file_func (opaque, stream, buf, size)
120*44bedb31SLionel Sambuc voidpf opaque;
121*44bedb31SLionel Sambuc voidpf stream;
122*44bedb31SLionel Sambuc void* buf;
123*44bedb31SLionel Sambuc uLong size;
124*44bedb31SLionel Sambuc {
125*44bedb31SLionel Sambuc uLong ret=0;
126*44bedb31SLionel Sambuc HANDLE hFile = NULL;
127*44bedb31SLionel Sambuc if (stream!=NULL)
128*44bedb31SLionel Sambuc hFile = ((WIN32FILE_IOWIN*)stream) -> hf;
129*44bedb31SLionel Sambuc if (hFile != NULL)
130*44bedb31SLionel Sambuc if (!ReadFile(hFile, buf, size, &ret, NULL))
131*44bedb31SLionel Sambuc {
132*44bedb31SLionel Sambuc DWORD dwErr = GetLastError();
133*44bedb31SLionel Sambuc if (dwErr == ERROR_HANDLE_EOF)
134*44bedb31SLionel Sambuc dwErr = 0;
135*44bedb31SLionel Sambuc ((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr;
136*44bedb31SLionel Sambuc }
137*44bedb31SLionel Sambuc
138*44bedb31SLionel Sambuc return ret;
139*44bedb31SLionel Sambuc }
140*44bedb31SLionel Sambuc
141*44bedb31SLionel Sambuc
win32_write_file_func(opaque,stream,buf,size)142*44bedb31SLionel Sambuc uLong ZCALLBACK win32_write_file_func (opaque, stream, buf, size)
143*44bedb31SLionel Sambuc voidpf opaque;
144*44bedb31SLionel Sambuc voidpf stream;
145*44bedb31SLionel Sambuc const void* buf;
146*44bedb31SLionel Sambuc uLong size;
147*44bedb31SLionel Sambuc {
148*44bedb31SLionel Sambuc uLong ret=0;
149*44bedb31SLionel Sambuc HANDLE hFile = NULL;
150*44bedb31SLionel Sambuc if (stream!=NULL)
151*44bedb31SLionel Sambuc hFile = ((WIN32FILE_IOWIN*)stream) -> hf;
152*44bedb31SLionel Sambuc
153*44bedb31SLionel Sambuc if (hFile !=NULL)
154*44bedb31SLionel Sambuc if (!WriteFile(hFile, buf, size, &ret, NULL))
155*44bedb31SLionel Sambuc {
156*44bedb31SLionel Sambuc DWORD dwErr = GetLastError();
157*44bedb31SLionel Sambuc if (dwErr == ERROR_HANDLE_EOF)
158*44bedb31SLionel Sambuc dwErr = 0;
159*44bedb31SLionel Sambuc ((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr;
160*44bedb31SLionel Sambuc }
161*44bedb31SLionel Sambuc
162*44bedb31SLionel Sambuc return ret;
163*44bedb31SLionel Sambuc }
164*44bedb31SLionel Sambuc
win32_tell_file_func(opaque,stream)165*44bedb31SLionel Sambuc long ZCALLBACK win32_tell_file_func (opaque, stream)
166*44bedb31SLionel Sambuc voidpf opaque;
167*44bedb31SLionel Sambuc voidpf stream;
168*44bedb31SLionel Sambuc {
169*44bedb31SLionel Sambuc long ret=-1;
170*44bedb31SLionel Sambuc HANDLE hFile = NULL;
171*44bedb31SLionel Sambuc if (stream!=NULL)
172*44bedb31SLionel Sambuc hFile = ((WIN32FILE_IOWIN*)stream) -> hf;
173*44bedb31SLionel Sambuc if (hFile != NULL)
174*44bedb31SLionel Sambuc {
175*44bedb31SLionel Sambuc DWORD dwSet = SetFilePointer(hFile, 0, NULL, FILE_CURRENT);
176*44bedb31SLionel Sambuc if (dwSet == INVALID_SET_FILE_POINTER)
177*44bedb31SLionel Sambuc {
178*44bedb31SLionel Sambuc DWORD dwErr = GetLastError();
179*44bedb31SLionel Sambuc ((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr;
180*44bedb31SLionel Sambuc ret = -1;
181*44bedb31SLionel Sambuc }
182*44bedb31SLionel Sambuc else
183*44bedb31SLionel Sambuc ret=(long)dwSet;
184*44bedb31SLionel Sambuc }
185*44bedb31SLionel Sambuc return ret;
186*44bedb31SLionel Sambuc }
187*44bedb31SLionel Sambuc
win32_seek_file_func(opaque,stream,offset,origin)188*44bedb31SLionel Sambuc long ZCALLBACK win32_seek_file_func (opaque, stream, offset, origin)
189*44bedb31SLionel Sambuc voidpf opaque;
190*44bedb31SLionel Sambuc voidpf stream;
191*44bedb31SLionel Sambuc uLong offset;
192*44bedb31SLionel Sambuc int origin;
193*44bedb31SLionel Sambuc {
194*44bedb31SLionel Sambuc DWORD dwMoveMethod=0xFFFFFFFF;
195*44bedb31SLionel Sambuc HANDLE hFile = NULL;
196*44bedb31SLionel Sambuc
197*44bedb31SLionel Sambuc long ret=-1;
198*44bedb31SLionel Sambuc if (stream!=NULL)
199*44bedb31SLionel Sambuc hFile = ((WIN32FILE_IOWIN*)stream) -> hf;
200*44bedb31SLionel Sambuc switch (origin)
201*44bedb31SLionel Sambuc {
202*44bedb31SLionel Sambuc case ZLIB_FILEFUNC_SEEK_CUR :
203*44bedb31SLionel Sambuc dwMoveMethod = FILE_CURRENT;
204*44bedb31SLionel Sambuc break;
205*44bedb31SLionel Sambuc case ZLIB_FILEFUNC_SEEK_END :
206*44bedb31SLionel Sambuc dwMoveMethod = FILE_END;
207*44bedb31SLionel Sambuc break;
208*44bedb31SLionel Sambuc case ZLIB_FILEFUNC_SEEK_SET :
209*44bedb31SLionel Sambuc dwMoveMethod = FILE_BEGIN;
210*44bedb31SLionel Sambuc break;
211*44bedb31SLionel Sambuc default: return -1;
212*44bedb31SLionel Sambuc }
213*44bedb31SLionel Sambuc
214*44bedb31SLionel Sambuc if (hFile != NULL)
215*44bedb31SLionel Sambuc {
216*44bedb31SLionel Sambuc DWORD dwSet = SetFilePointer(hFile, offset, NULL, dwMoveMethod);
217*44bedb31SLionel Sambuc if (dwSet == INVALID_SET_FILE_POINTER)
218*44bedb31SLionel Sambuc {
219*44bedb31SLionel Sambuc DWORD dwErr = GetLastError();
220*44bedb31SLionel Sambuc ((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr;
221*44bedb31SLionel Sambuc ret = -1;
222*44bedb31SLionel Sambuc }
223*44bedb31SLionel Sambuc else
224*44bedb31SLionel Sambuc ret=0;
225*44bedb31SLionel Sambuc }
226*44bedb31SLionel Sambuc return ret;
227*44bedb31SLionel Sambuc }
228*44bedb31SLionel Sambuc
win32_close_file_func(opaque,stream)229*44bedb31SLionel Sambuc int ZCALLBACK win32_close_file_func (opaque, stream)
230*44bedb31SLionel Sambuc voidpf opaque;
231*44bedb31SLionel Sambuc voidpf stream;
232*44bedb31SLionel Sambuc {
233*44bedb31SLionel Sambuc int ret=-1;
234*44bedb31SLionel Sambuc
235*44bedb31SLionel Sambuc if (stream!=NULL)
236*44bedb31SLionel Sambuc {
237*44bedb31SLionel Sambuc HANDLE hFile;
238*44bedb31SLionel Sambuc hFile = ((WIN32FILE_IOWIN*)stream) -> hf;
239*44bedb31SLionel Sambuc if (hFile != NULL)
240*44bedb31SLionel Sambuc {
241*44bedb31SLionel Sambuc CloseHandle(hFile);
242*44bedb31SLionel Sambuc ret=0;
243*44bedb31SLionel Sambuc }
244*44bedb31SLionel Sambuc free(stream);
245*44bedb31SLionel Sambuc }
246*44bedb31SLionel Sambuc return ret;
247*44bedb31SLionel Sambuc }
248*44bedb31SLionel Sambuc
win32_error_file_func(opaque,stream)249*44bedb31SLionel Sambuc int ZCALLBACK win32_error_file_func (opaque, stream)
250*44bedb31SLionel Sambuc voidpf opaque;
251*44bedb31SLionel Sambuc voidpf stream;
252*44bedb31SLionel Sambuc {
253*44bedb31SLionel Sambuc int ret=-1;
254*44bedb31SLionel Sambuc if (stream!=NULL)
255*44bedb31SLionel Sambuc {
256*44bedb31SLionel Sambuc ret = ((WIN32FILE_IOWIN*)stream) -> error;
257*44bedb31SLionel Sambuc }
258*44bedb31SLionel Sambuc return ret;
259*44bedb31SLionel Sambuc }
260*44bedb31SLionel Sambuc
fill_win32_filefunc(pzlib_filefunc_def)261*44bedb31SLionel Sambuc void fill_win32_filefunc (pzlib_filefunc_def)
262*44bedb31SLionel Sambuc zlib_filefunc_def* pzlib_filefunc_def;
263*44bedb31SLionel Sambuc {
264*44bedb31SLionel Sambuc pzlib_filefunc_def->zopen_file = win32_open_file_func;
265*44bedb31SLionel Sambuc pzlib_filefunc_def->zread_file = win32_read_file_func;
266*44bedb31SLionel Sambuc pzlib_filefunc_def->zwrite_file = win32_write_file_func;
267*44bedb31SLionel Sambuc pzlib_filefunc_def->ztell_file = win32_tell_file_func;
268*44bedb31SLionel Sambuc pzlib_filefunc_def->zseek_file = win32_seek_file_func;
269*44bedb31SLionel Sambuc pzlib_filefunc_def->zclose_file = win32_close_file_func;
270*44bedb31SLionel Sambuc pzlib_filefunc_def->zerror_file = win32_error_file_func;
271*44bedb31SLionel Sambuc pzlib_filefunc_def->opaque=NULL;
272*44bedb31SLionel Sambuc }
273