annotate src/zlib-1.2.7/contrib/minizip/iowin32.c @ 83:ae30d91d2ffe

Replace these with versions built using an older toolset (so as to avoid ABI compatibilities when linking on Ubuntu 14.04 for packaging purposes)
author Chris Cannam
date Fri, 07 Feb 2020 11:51:13 +0000
parents e13257ea84a4
children
rev   line source
Chris@4 1 /* iowin32.c -- IO base function header for compress/uncompress .zip
Chris@4 2 Version 1.1, February 14h, 2010
Chris@4 3 part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html )
Chris@4 4
Chris@4 5 Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html )
Chris@4 6
Chris@4 7 Modifications for Zip64 support
Chris@4 8 Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com )
Chris@4 9
Chris@4 10 For more info read MiniZip_info.txt
Chris@4 11
Chris@4 12 */
Chris@4 13
Chris@4 14 #include <stdlib.h>
Chris@4 15
Chris@4 16 #include "zlib.h"
Chris@4 17 #include "ioapi.h"
Chris@4 18 #include "iowin32.h"
Chris@4 19
Chris@4 20 #ifndef INVALID_HANDLE_VALUE
Chris@4 21 #define INVALID_HANDLE_VALUE (0xFFFFFFFF)
Chris@4 22 #endif
Chris@4 23
Chris@4 24 #ifndef INVALID_SET_FILE_POINTER
Chris@4 25 #define INVALID_SET_FILE_POINTER ((DWORD)-1)
Chris@4 26 #endif
Chris@4 27
Chris@4 28 voidpf ZCALLBACK win32_open_file_func OF((voidpf opaque, const char* filename, int mode));
Chris@4 29 uLong ZCALLBACK win32_read_file_func OF((voidpf opaque, voidpf stream, void* buf, uLong size));
Chris@4 30 uLong ZCALLBACK win32_write_file_func OF((voidpf opaque, voidpf stream, const void* buf, uLong size));
Chris@4 31 ZPOS64_T ZCALLBACK win32_tell64_file_func OF((voidpf opaque, voidpf stream));
Chris@4 32 long ZCALLBACK win32_seek64_file_func OF((voidpf opaque, voidpf stream, ZPOS64_T offset, int origin));
Chris@4 33 int ZCALLBACK win32_close_file_func OF((voidpf opaque, voidpf stream));
Chris@4 34 int ZCALLBACK win32_error_file_func OF((voidpf opaque, voidpf stream));
Chris@4 35
Chris@4 36 typedef struct
Chris@4 37 {
Chris@4 38 HANDLE hf;
Chris@4 39 int error;
Chris@4 40 } WIN32FILE_IOWIN;
Chris@4 41
Chris@4 42
Chris@4 43 static void win32_translate_open_mode(int mode,
Chris@4 44 DWORD* lpdwDesiredAccess,
Chris@4 45 DWORD* lpdwCreationDisposition,
Chris@4 46 DWORD* lpdwShareMode,
Chris@4 47 DWORD* lpdwFlagsAndAttributes)
Chris@4 48 {
Chris@4 49 *lpdwDesiredAccess = *lpdwShareMode = *lpdwFlagsAndAttributes = *lpdwCreationDisposition = 0;
Chris@4 50
Chris@4 51 if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER)==ZLIB_FILEFUNC_MODE_READ)
Chris@4 52 {
Chris@4 53 *lpdwDesiredAccess = GENERIC_READ;
Chris@4 54 *lpdwCreationDisposition = OPEN_EXISTING;
Chris@4 55 *lpdwShareMode = FILE_SHARE_READ;
Chris@4 56 }
Chris@4 57 else if (mode & ZLIB_FILEFUNC_MODE_EXISTING)
Chris@4 58 {
Chris@4 59 *lpdwDesiredAccess = GENERIC_WRITE | GENERIC_READ;
Chris@4 60 *lpdwCreationDisposition = OPEN_EXISTING;
Chris@4 61 }
Chris@4 62 else if (mode & ZLIB_FILEFUNC_MODE_CREATE)
Chris@4 63 {
Chris@4 64 *lpdwDesiredAccess = GENERIC_WRITE | GENERIC_READ;
Chris@4 65 *lpdwCreationDisposition = CREATE_ALWAYS;
Chris@4 66 }
Chris@4 67 }
Chris@4 68
Chris@4 69 static voidpf win32_build_iowin(HANDLE hFile)
Chris@4 70 {
Chris@4 71 voidpf ret=NULL;
Chris@4 72
Chris@4 73 if ((hFile != NULL) && (hFile != INVALID_HANDLE_VALUE))
Chris@4 74 {
Chris@4 75 WIN32FILE_IOWIN w32fiow;
Chris@4 76 w32fiow.hf = hFile;
Chris@4 77 w32fiow.error = 0;
Chris@4 78 ret = malloc(sizeof(WIN32FILE_IOWIN));
Chris@4 79
Chris@4 80 if (ret==NULL)
Chris@4 81 CloseHandle(hFile);
Chris@4 82 else
Chris@4 83 *((WIN32FILE_IOWIN*)ret) = w32fiow;
Chris@4 84 }
Chris@4 85 return ret;
Chris@4 86 }
Chris@4 87
Chris@4 88 voidpf ZCALLBACK win32_open64_file_func (voidpf opaque,const void* filename,int mode)
Chris@4 89 {
Chris@4 90 const char* mode_fopen = NULL;
Chris@4 91 DWORD dwDesiredAccess,dwCreationDisposition,dwShareMode,dwFlagsAndAttributes ;
Chris@4 92 HANDLE hFile = NULL;
Chris@4 93
Chris@4 94 win32_translate_open_mode(mode,&dwDesiredAccess,&dwCreationDisposition,&dwShareMode,&dwFlagsAndAttributes);
Chris@4 95
Chris@4 96 if ((filename!=NULL) && (dwDesiredAccess != 0))
Chris@4 97 hFile = CreateFile((LPCTSTR)filename, dwDesiredAccess, dwShareMode, NULL, dwCreationDisposition, dwFlagsAndAttributes, NULL);
Chris@4 98
Chris@4 99 return win32_build_iowin(hFile);
Chris@4 100 }
Chris@4 101
Chris@4 102
Chris@4 103 voidpf ZCALLBACK win32_open64_file_funcA (voidpf opaque,const void* filename,int mode)
Chris@4 104 {
Chris@4 105 const char* mode_fopen = NULL;
Chris@4 106 DWORD dwDesiredAccess,dwCreationDisposition,dwShareMode,dwFlagsAndAttributes ;
Chris@4 107 HANDLE hFile = NULL;
Chris@4 108
Chris@4 109 win32_translate_open_mode(mode,&dwDesiredAccess,&dwCreationDisposition,&dwShareMode,&dwFlagsAndAttributes);
Chris@4 110
Chris@4 111 if ((filename!=NULL) && (dwDesiredAccess != 0))
Chris@4 112 hFile = CreateFileA((LPCSTR)filename, dwDesiredAccess, dwShareMode, NULL, dwCreationDisposition, dwFlagsAndAttributes, NULL);
Chris@4 113
Chris@4 114 return win32_build_iowin(hFile);
Chris@4 115 }
Chris@4 116
Chris@4 117
Chris@4 118 voidpf ZCALLBACK win32_open64_file_funcW (voidpf opaque,const void* filename,int mode)
Chris@4 119 {
Chris@4 120 const char* mode_fopen = NULL;
Chris@4 121 DWORD dwDesiredAccess,dwCreationDisposition,dwShareMode,dwFlagsAndAttributes ;
Chris@4 122 HANDLE hFile = NULL;
Chris@4 123
Chris@4 124 win32_translate_open_mode(mode,&dwDesiredAccess,&dwCreationDisposition,&dwShareMode,&dwFlagsAndAttributes);
Chris@4 125
Chris@4 126 if ((filename!=NULL) && (dwDesiredAccess != 0))
Chris@4 127 hFile = CreateFileW((LPCWSTR)filename, dwDesiredAccess, dwShareMode, NULL, dwCreationDisposition, dwFlagsAndAttributes, NULL);
Chris@4 128
Chris@4 129 return win32_build_iowin(hFile);
Chris@4 130 }
Chris@4 131
Chris@4 132
Chris@4 133 voidpf ZCALLBACK win32_open_file_func (voidpf opaque,const char* filename,int mode)
Chris@4 134 {
Chris@4 135 const char* mode_fopen = NULL;
Chris@4 136 DWORD dwDesiredAccess,dwCreationDisposition,dwShareMode,dwFlagsAndAttributes ;
Chris@4 137 HANDLE hFile = NULL;
Chris@4 138
Chris@4 139 win32_translate_open_mode(mode,&dwDesiredAccess,&dwCreationDisposition,&dwShareMode,&dwFlagsAndAttributes);
Chris@4 140
Chris@4 141 if ((filename!=NULL) && (dwDesiredAccess != 0))
Chris@4 142 hFile = CreateFile((LPCTSTR)filename, dwDesiredAccess, dwShareMode, NULL, dwCreationDisposition, dwFlagsAndAttributes, NULL);
Chris@4 143
Chris@4 144 return win32_build_iowin(hFile);
Chris@4 145 }
Chris@4 146
Chris@4 147
Chris@4 148 uLong ZCALLBACK win32_read_file_func (voidpf opaque, voidpf stream, void* buf,uLong size)
Chris@4 149 {
Chris@4 150 uLong ret=0;
Chris@4 151 HANDLE hFile = NULL;
Chris@4 152 if (stream!=NULL)
Chris@4 153 hFile = ((WIN32FILE_IOWIN*)stream) -> hf;
Chris@4 154
Chris@4 155 if (hFile != NULL)
Chris@4 156 {
Chris@4 157 if (!ReadFile(hFile, buf, size, &ret, NULL))
Chris@4 158 {
Chris@4 159 DWORD dwErr = GetLastError();
Chris@4 160 if (dwErr == ERROR_HANDLE_EOF)
Chris@4 161 dwErr = 0;
Chris@4 162 ((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr;
Chris@4 163 }
Chris@4 164 }
Chris@4 165
Chris@4 166 return ret;
Chris@4 167 }
Chris@4 168
Chris@4 169
Chris@4 170 uLong ZCALLBACK win32_write_file_func (voidpf opaque,voidpf stream,const void* buf,uLong size)
Chris@4 171 {
Chris@4 172 uLong ret=0;
Chris@4 173 HANDLE hFile = NULL;
Chris@4 174 if (stream!=NULL)
Chris@4 175 hFile = ((WIN32FILE_IOWIN*)stream) -> hf;
Chris@4 176
Chris@4 177 if (hFile != NULL)
Chris@4 178 {
Chris@4 179 if (!WriteFile(hFile, buf, size, &ret, NULL))
Chris@4 180 {
Chris@4 181 DWORD dwErr = GetLastError();
Chris@4 182 if (dwErr == ERROR_HANDLE_EOF)
Chris@4 183 dwErr = 0;
Chris@4 184 ((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr;
Chris@4 185 }
Chris@4 186 }
Chris@4 187
Chris@4 188 return ret;
Chris@4 189 }
Chris@4 190
Chris@4 191 long ZCALLBACK win32_tell_file_func (voidpf opaque,voidpf stream)
Chris@4 192 {
Chris@4 193 long ret=-1;
Chris@4 194 HANDLE hFile = NULL;
Chris@4 195 if (stream!=NULL)
Chris@4 196 hFile = ((WIN32FILE_IOWIN*)stream) -> hf;
Chris@4 197 if (hFile != NULL)
Chris@4 198 {
Chris@4 199 DWORD dwSet = SetFilePointer(hFile, 0, NULL, FILE_CURRENT);
Chris@4 200 if (dwSet == INVALID_SET_FILE_POINTER)
Chris@4 201 {
Chris@4 202 DWORD dwErr = GetLastError();
Chris@4 203 ((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr;
Chris@4 204 ret = -1;
Chris@4 205 }
Chris@4 206 else
Chris@4 207 ret=(long)dwSet;
Chris@4 208 }
Chris@4 209 return ret;
Chris@4 210 }
Chris@4 211
Chris@4 212 ZPOS64_T ZCALLBACK win32_tell64_file_func (voidpf opaque, voidpf stream)
Chris@4 213 {
Chris@4 214 ZPOS64_T ret= (ZPOS64_T)-1;
Chris@4 215 HANDLE hFile = NULL;
Chris@4 216 if (stream!=NULL)
Chris@4 217 hFile = ((WIN32FILE_IOWIN*)stream)->hf;
Chris@4 218
Chris@4 219 if (hFile)
Chris@4 220 {
Chris@4 221 LARGE_INTEGER li;
Chris@4 222 li.QuadPart = 0;
Chris@4 223 li.u.LowPart = SetFilePointer(hFile, li.u.LowPart, &li.u.HighPart, FILE_CURRENT);
Chris@4 224 if ( (li.LowPart == 0xFFFFFFFF) && (GetLastError() != NO_ERROR))
Chris@4 225 {
Chris@4 226 DWORD dwErr = GetLastError();
Chris@4 227 ((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr;
Chris@4 228 ret = (ZPOS64_T)-1;
Chris@4 229 }
Chris@4 230 else
Chris@4 231 ret=li.QuadPart;
Chris@4 232 }
Chris@4 233 return ret;
Chris@4 234 }
Chris@4 235
Chris@4 236
Chris@4 237 long ZCALLBACK win32_seek_file_func (voidpf opaque,voidpf stream,uLong offset,int origin)
Chris@4 238 {
Chris@4 239 DWORD dwMoveMethod=0xFFFFFFFF;
Chris@4 240 HANDLE hFile = NULL;
Chris@4 241
Chris@4 242 long ret=-1;
Chris@4 243 if (stream!=NULL)
Chris@4 244 hFile = ((WIN32FILE_IOWIN*)stream) -> hf;
Chris@4 245 switch (origin)
Chris@4 246 {
Chris@4 247 case ZLIB_FILEFUNC_SEEK_CUR :
Chris@4 248 dwMoveMethod = FILE_CURRENT;
Chris@4 249 break;
Chris@4 250 case ZLIB_FILEFUNC_SEEK_END :
Chris@4 251 dwMoveMethod = FILE_END;
Chris@4 252 break;
Chris@4 253 case ZLIB_FILEFUNC_SEEK_SET :
Chris@4 254 dwMoveMethod = FILE_BEGIN;
Chris@4 255 break;
Chris@4 256 default: return -1;
Chris@4 257 }
Chris@4 258
Chris@4 259 if (hFile != NULL)
Chris@4 260 {
Chris@4 261 DWORD dwSet = SetFilePointer(hFile, offset, NULL, dwMoveMethod);
Chris@4 262 if (dwSet == INVALID_SET_FILE_POINTER)
Chris@4 263 {
Chris@4 264 DWORD dwErr = GetLastError();
Chris@4 265 ((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr;
Chris@4 266 ret = -1;
Chris@4 267 }
Chris@4 268 else
Chris@4 269 ret=0;
Chris@4 270 }
Chris@4 271 return ret;
Chris@4 272 }
Chris@4 273
Chris@4 274 long ZCALLBACK win32_seek64_file_func (voidpf opaque, voidpf stream,ZPOS64_T offset,int origin)
Chris@4 275 {
Chris@4 276 DWORD dwMoveMethod=0xFFFFFFFF;
Chris@4 277 HANDLE hFile = NULL;
Chris@4 278 long ret=-1;
Chris@4 279
Chris@4 280 if (stream!=NULL)
Chris@4 281 hFile = ((WIN32FILE_IOWIN*)stream)->hf;
Chris@4 282
Chris@4 283 switch (origin)
Chris@4 284 {
Chris@4 285 case ZLIB_FILEFUNC_SEEK_CUR :
Chris@4 286 dwMoveMethod = FILE_CURRENT;
Chris@4 287 break;
Chris@4 288 case ZLIB_FILEFUNC_SEEK_END :
Chris@4 289 dwMoveMethod = FILE_END;
Chris@4 290 break;
Chris@4 291 case ZLIB_FILEFUNC_SEEK_SET :
Chris@4 292 dwMoveMethod = FILE_BEGIN;
Chris@4 293 break;
Chris@4 294 default: return -1;
Chris@4 295 }
Chris@4 296
Chris@4 297 if (hFile)
Chris@4 298 {
Chris@4 299 LARGE_INTEGER* li = (LARGE_INTEGER*)&offset;
Chris@4 300 DWORD dwSet = SetFilePointer(hFile, li->u.LowPart, &li->u.HighPart, dwMoveMethod);
Chris@4 301 if (dwSet == INVALID_SET_FILE_POINTER)
Chris@4 302 {
Chris@4 303 DWORD dwErr = GetLastError();
Chris@4 304 ((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr;
Chris@4 305 ret = -1;
Chris@4 306 }
Chris@4 307 else
Chris@4 308 ret=0;
Chris@4 309 }
Chris@4 310 return ret;
Chris@4 311 }
Chris@4 312
Chris@4 313 int ZCALLBACK win32_close_file_func (voidpf opaque, voidpf stream)
Chris@4 314 {
Chris@4 315 int ret=-1;
Chris@4 316
Chris@4 317 if (stream!=NULL)
Chris@4 318 {
Chris@4 319 HANDLE hFile;
Chris@4 320 hFile = ((WIN32FILE_IOWIN*)stream) -> hf;
Chris@4 321 if (hFile != NULL)
Chris@4 322 {
Chris@4 323 CloseHandle(hFile);
Chris@4 324 ret=0;
Chris@4 325 }
Chris@4 326 free(stream);
Chris@4 327 }
Chris@4 328 return ret;
Chris@4 329 }
Chris@4 330
Chris@4 331 int ZCALLBACK win32_error_file_func (voidpf opaque,voidpf stream)
Chris@4 332 {
Chris@4 333 int ret=-1;
Chris@4 334 if (stream!=NULL)
Chris@4 335 {
Chris@4 336 ret = ((WIN32FILE_IOWIN*)stream) -> error;
Chris@4 337 }
Chris@4 338 return ret;
Chris@4 339 }
Chris@4 340
Chris@4 341 void fill_win32_filefunc (zlib_filefunc_def* pzlib_filefunc_def)
Chris@4 342 {
Chris@4 343 pzlib_filefunc_def->zopen_file = win32_open_file_func;
Chris@4 344 pzlib_filefunc_def->zread_file = win32_read_file_func;
Chris@4 345 pzlib_filefunc_def->zwrite_file = win32_write_file_func;
Chris@4 346 pzlib_filefunc_def->ztell_file = win32_tell_file_func;
Chris@4 347 pzlib_filefunc_def->zseek_file = win32_seek_file_func;
Chris@4 348 pzlib_filefunc_def->zclose_file = win32_close_file_func;
Chris@4 349 pzlib_filefunc_def->zerror_file = win32_error_file_func;
Chris@4 350 pzlib_filefunc_def->opaque = NULL;
Chris@4 351 }
Chris@4 352
Chris@4 353 void fill_win32_filefunc64(zlib_filefunc64_def* pzlib_filefunc_def)
Chris@4 354 {
Chris@4 355 pzlib_filefunc_def->zopen64_file = win32_open64_file_func;
Chris@4 356 pzlib_filefunc_def->zread_file = win32_read_file_func;
Chris@4 357 pzlib_filefunc_def->zwrite_file = win32_write_file_func;
Chris@4 358 pzlib_filefunc_def->ztell64_file = win32_tell64_file_func;
Chris@4 359 pzlib_filefunc_def->zseek64_file = win32_seek64_file_func;
Chris@4 360 pzlib_filefunc_def->zclose_file = win32_close_file_func;
Chris@4 361 pzlib_filefunc_def->zerror_file = win32_error_file_func;
Chris@4 362 pzlib_filefunc_def->opaque = NULL;
Chris@4 363 }
Chris@4 364
Chris@4 365
Chris@4 366 void fill_win32_filefunc64A(zlib_filefunc64_def* pzlib_filefunc_def)
Chris@4 367 {
Chris@4 368 pzlib_filefunc_def->zopen64_file = win32_open64_file_funcA;
Chris@4 369 pzlib_filefunc_def->zread_file = win32_read_file_func;
Chris@4 370 pzlib_filefunc_def->zwrite_file = win32_write_file_func;
Chris@4 371 pzlib_filefunc_def->ztell64_file = win32_tell64_file_func;
Chris@4 372 pzlib_filefunc_def->zseek64_file = win32_seek64_file_func;
Chris@4 373 pzlib_filefunc_def->zclose_file = win32_close_file_func;
Chris@4 374 pzlib_filefunc_def->zerror_file = win32_error_file_func;
Chris@4 375 pzlib_filefunc_def->opaque = NULL;
Chris@4 376 }
Chris@4 377
Chris@4 378
Chris@4 379 void fill_win32_filefunc64W(zlib_filefunc64_def* pzlib_filefunc_def)
Chris@4 380 {
Chris@4 381 pzlib_filefunc_def->zopen64_file = win32_open64_file_funcW;
Chris@4 382 pzlib_filefunc_def->zread_file = win32_read_file_func;
Chris@4 383 pzlib_filefunc_def->zwrite_file = win32_write_file_func;
Chris@4 384 pzlib_filefunc_def->ztell64_file = win32_tell64_file_func;
Chris@4 385 pzlib_filefunc_def->zseek64_file = win32_seek64_file_func;
Chris@4 386 pzlib_filefunc_def->zclose_file = win32_close_file_func;
Chris@4 387 pzlib_filefunc_def->zerror_file = win32_error_file_func;
Chris@4 388 pzlib_filefunc_def->opaque = NULL;
Chris@4 389 }