| Index: chrome/common/zip_internal.cc
|
| diff --git a/chrome/common/zip_internal.cc b/chrome/common/zip_internal.cc
|
| index ddcfd00a360fb1d01383d27f04aa75669e92d7f5..7a158956ff8bca87becc57df1b9fde4aa2d64e2d 100644
|
| --- a/chrome/common/zip_internal.cc
|
| +++ b/chrome/common/zip_internal.cc
|
| @@ -9,6 +9,8 @@
|
| #include "third_party/zlib/contrib/minizip/zip.h"
|
| #if defined(OS_WIN)
|
| #include "third_party/zlib/contrib/minizip/iowin32.h"
|
| +#elif defined(OS_POSIX)
|
| +#include "third_party/zlib/contrib/minizip/ioapi.h"
|
| #endif
|
|
|
| namespace {
|
| @@ -65,6 +67,45 @@ void* ZipOpenFunc(void *opaque, const char* filename, int mode) {
|
| }
|
| #endif
|
|
|
| +#if defined(OS_POSIX)
|
| +// Callback function for zlib that opens a file stream from a file descriptor.
|
| +void* FdOpenFileFunc(void* opaque, const char* filename, int mode) {
|
| + FILE* file = NULL;
|
| + const char* mode_fopen = NULL;
|
| +
|
| + if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER) == ZLIB_FILEFUNC_MODE_READ)
|
| + mode_fopen = "rb";
|
| + else if (mode & ZLIB_FILEFUNC_MODE_EXISTING)
|
| + mode_fopen = "r+b";
|
| + else if (mode & ZLIB_FILEFUNC_MODE_CREATE)
|
| + mode_fopen = "wb";
|
| +
|
| + if ((filename != NULL) && (mode_fopen != NULL))
|
| + file = fdopen(*static_cast<int*>(opaque), mode_fopen);
|
| +
|
| + return file;
|
| +}
|
| +
|
| +// We don't actually close the file stream since that would close
|
| +// the underlying file descriptor, and we don't own it. We do free
|
| +// |opaque| since we malloc'ed it in FillFdOpenFileFunc.
|
| +int CloseFileFunc(void* opaque, void* stream) {
|
| + free(opaque);
|
| + return 0;
|
| +}
|
| +
|
| +// Fills |pzlib_filecunc_def| appropriately to handle the zip file
|
| +// referred to by |fd|.
|
| +void FillFdOpenFileFunc(zlib_filefunc_def* pzlib_filefunc_def, int fd) {
|
| + fill_fopen_filefunc(pzlib_filefunc_def);
|
| + pzlib_filefunc_def->zopen_file = FdOpenFileFunc;
|
| + pzlib_filefunc_def->zclose_file = CloseFileFunc;
|
| + int* ptr_fd = static_cast<int*>(malloc(sizeof(fd)));
|
| + *ptr_fd = fd;
|
| + pzlib_filefunc_def->opaque = ptr_fd;
|
| +}
|
| +#endif // defined(OS_POSIX)
|
| +
|
| } // namespace
|
|
|
| namespace zip {
|
| @@ -81,6 +122,15 @@ unzFile OpenForUnzipping(const std::string& file_name_utf8) {
|
| return unzOpen2(file_name_utf8.c_str(), zip_func_ptrs);
|
| }
|
|
|
| +#if defined(OS_POSIX)
|
| +unzFile OpenFdForUnzipping(int zip_fd) {
|
| + zlib_filefunc_def zip_funcs;
|
| + FillFdOpenFileFunc(&zip_funcs, zip_fd);
|
| + // Passing dummy "fd" filename to zlib.
|
| + return unzOpen2("fd", &zip_funcs);
|
| +}
|
| +#endif
|
| +
|
| zipFile OpenForZipping(const std::string& file_name_utf8, int append_flag) {
|
| zlib_filefunc_def* zip_func_ptrs = NULL;
|
| #if defined(OS_WIN)
|
|
|