From 9549e8c28032c2d1fb578c43f1b340d1457b3c70 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Jos=C3=A9=20Bollo?= Date: Wed, 23 Dec 2015 15:31:09 +0100 Subject: [PATCH] zip/unzip: don't only rely on libzip Change-Id: I2bd2cf0c9447a47fdb56661c15e852e52e9dcba7 --- CMakeLists.txt | 8 +++-- src/CMakeLists.txt | 13 +++++++- src/wgtpkg-zip.c | 95 ++++++++++++++++++++++++++++++++++++++++++++++++++---- 3 files changed, 106 insertions(+), 10 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index b76abb3..2e6995c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -16,18 +16,20 @@ # limitations under the License. ########################################################################### -cmake_minimum_required(VERSION 2.8) +project(afm-main C) -project("afm-main" LANGUAGES "C") +cmake_minimum_required(VERSION 2.8) include(GNUInstallDirs) macro(setc name value) if(NOT DEFINED ${name}) - set(${name} "${value}") + set(${name} ${value}) endif(NOT DEFINED ${name}) endmacro(setc) +setc(USE_LIBZIP 1) + setc(afm_name "aglfwk") setc(afm_confdir "${CMAKE_INSTALL_FULL_SYSCONFDIR}/${afm_name}") setc(afm_datadir "${CMAKE_INSTALL_FULL_DATADIR}/${afm_name}") diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 499d38a..89d4d51 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -21,7 +21,6 @@ cmake_minimum_required(VERSION 2.8) include(FindPkgConfig) pkg_check_modules(EXTRAS REQUIRED - libzip>=0.11 libxml-2.0 openssl xmlsec1 xmlsec1-openssl @@ -33,6 +32,18 @@ add_compile_options(${EXTRAS_CFLAGS}) include_directories(${EXTRAS_INCLUDE_DIRS}) link_libraries(${EXTRAS_LIBRARIES}) +if(USE_LIBZIP) + pkg_check_modules(LIBZIP REQUIRED libzip>=0.11) + add_compile_options(${LIBZIP_CFLAGS}) + include_directories(${LIBZIP_INCLUDE_DIRS}) + link_libraries(${LIBZIP_LIBRARIES}) + add_definitions(-DUSE_LIBZIP=1) +else(USE_LIBZIP) + find_program(PATH_TO_ZIP zip) + find_program(PATH_TO_UNZIP unzip) + add_definitions(-DUSE_LIBZIP=0 -DPATH_TO_ZIP="${PATH_TO_ZIP}" -DPATH_TO_UNZIP="${PATH_TO_UNZIP}") +endif(USE_LIBZIP) + ########################################################################### include_directories(simulation) diff --git a/src/wgtpkg-zip.c b/src/wgtpkg-zip.c index 75cb164..0b1234b 100644 --- a/src/wgtpkg-zip.c +++ b/src/wgtpkg-zip.c @@ -19,7 +19,6 @@ #define _BSD_SOURCE /* see readdir */ #include -#include #include #include #include @@ -32,14 +31,20 @@ #include "verbose.h" #include "wgtpkg.h" - -#if !defined(MODE_OF_FILE_CREATION) #define MODE_OF_FILE_CREATION 0640 -#endif -#if !defined(MODE_OF_DIRECTORY_CREATION) #define MODE_OF_DIRECTORY_CREATION 0750 + +#if !defined(USE_LIBZIP) +# define USE_LIBZIP 1 #endif +/*********************************************************** + * USING LIBZIP + ***********************************************************/ +#if USE_LIBZIP + +#include + static int is_valid_filename(const char *filename) { int lastsp = 0; @@ -340,12 +345,90 @@ int zwrite(const char *zipfile) return err; } +/*********************************************************** + * NOT USING LIBZIP: FORKING + ***********************************************************/ +#else + +#include + +extern char **environ; + +static int zrun(const char *path, const char *args[]) +{ + int rc; + siginfo_t si; + + rc = fork(); + if (rc < 0) { + /* can't fork */ + ERROR("error while forking in zrun: %m"); + return rc; + } + if (!rc) { + rc = execve(realpath(path, NULL), (char * const*)args, environ); + ERROR("can't execute %s in zrun: %m", args[0]); + _exit(1); + return rc; + } + /* wait termination of the child */ + rc = waitid(P_PID, (id_t)rc, &si, WEXITED); + if (rc) + ERROR("unexpected wait status in zrun of %s: %m", args[0]); + else if (si.si_code != CLD_EXITED) + ERROR("unexpected termination status of %s in zrun", args[0]); + else if (si.si_status != 0) + ERROR("child for %s terminated with error code %d in zwrite", args[0], si.si_status); + else + return 0; + return -1; +} + +/* read (extract) 'zipfile' in current directory */ +int zread(const char *zipfile, unsigned long long maxsize) +{ + int rc; + const char *args[6]; + + args[0] = "unzip"; + args[1] = "-q"; + args[2] = "-d"; + args[3] = workdir; + args[4] = zipfile; + args[5] = NULL; + + file_reset(); + rc = zrun(PATH_TO_UNZIP, args); + if (!rc) + rc = fill_files(); + return rc; +} + +/* write (pack) content of the current directory in 'zipfile' */ +int zwrite(const char *zipfile) +{ + const char *args[6]; + + args[0] = "zip"; + args[1] = "-q"; + args[2] = "-r"; + args[3] = workdir; + args[4] = zipfile; + args[5] = NULL; + + return zrun(PATH_TO_ZIP, args); +} + +#endif +/*********************************************************** +* TESTING +***********************************************************/ #if defined(TEST_READ) int main(int ac, char **av) { for(av++ ; *av ; av++) - zread(*av); + zread(*av, 0); return 0; } #endif -- 2.16.6