diff options
author | José Bollo <jose.bollo@iot.bzh> | 2015-12-23 15:31:09 +0100 |
---|---|---|
committer | José Bollo <jose.bollo@iot.bzh> | 2015-12-23 16:17:24 +0100 |
commit | 9549e8c28032c2d1fb578c43f1b340d1457b3c70 (patch) | |
tree | 1e6e1681c05375f83f45de35f57f43a66afaf502 /src | |
parent | dacfe1eeef622d7db8824392db9b6be877ee6a8c (diff) |
zip/unzip: don't only rely on libzip
Change-Id: I2bd2cf0c9447a47fdb56661c15e852e52e9dcba7
Diffstat (limited to 'src')
-rw-r--r-- | src/CMakeLists.txt | 13 | ||||
-rw-r--r-- | src/wgtpkg-zip.c | 95 |
2 files changed, 101 insertions, 7 deletions
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 <limits.h> -#include <zip.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> @@ -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 <zip.h> + 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 <sys/wait.h> + +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 |