From 0ff9aa7b3cab793036b732e8ba8245222ee045c9 Mon Sep 17 00:00:00 2001 From: Twinaphex Date: Sat, 18 Aug 2012 19:52:35 +0200 Subject: [PATCH] (RZlib) Now extracts directories in ZIP file too --- console/rarch_console_rzlib.c | 28 ++++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/console/rarch_console_rzlib.c b/console/rarch_console_rzlib.c index 302e947a50..41aa64ec9e 100644 --- a/console/rarch_console_rzlib.c +++ b/console/rarch_console_rzlib.c @@ -18,6 +18,7 @@ #include #include #include +#include #include "../boolean.h" #ifdef HAVE_LIBRETRO_MANAGEMENT @@ -29,6 +30,7 @@ static int rarch_extract_currentfile_in_zip(unzFile uf, const char *current_dir, char *slash, char *write_filename, size_t write_filename_size, unsigned extract_zip_mode) { char filename_inzip[PATH_MAX]; + bool is_dir = false; FILE *file_out = NULL; unz_file_info file_info; @@ -63,19 +65,33 @@ static int rarch_extract_currentfile_in_zip(unzFile uf, const char *current_dir, #endif } + if(filename_inzip[strlen(filename_inzip) - 1] == '/') + is_dir = true; + ret = unzOpenCurrentFile(uf); if (ret != UNZ_OK) RARCH_ERR("Error %d while trying to open ZIP file.\n", ret); else { /* success */ - file_out = fopen(write_filename, "wb"); + if(is_dir) + { +#ifdef _WIN32 + mkdir(write_filename); +#else + mkdir(write_filename, S_IRWXU | S_IRWXG | S_IRWXO | S_IFDIR); +#endif + } + else + { + file_out = fopen(write_filename, "wb"); - if (!file_out) - RARCH_ERR("Error opening %s.\n", write_filename); + if (!file_out) + RARCH_ERR("Error opening %s.\n", write_filename); + } } - if (file_out) + if (is_dir || file_out) { RARCH_LOG("Extracting: %s..\n", write_filename); @@ -88,7 +104,7 @@ static int rarch_extract_currentfile_in_zip(unzFile uf, const char *current_dir, break; } - if (ret > 0) + if (ret > 0 && !is_dir) { if (fwrite(buf, ret, 1, file_out) != 1) { @@ -99,7 +115,7 @@ static int rarch_extract_currentfile_in_zip(unzFile uf, const char *current_dir, } }while (ret > 0); - if (file_out) + if (!is_dir && file_out) fclose(file_out); }