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