X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=src%2Fwgtpkg-zip.c;h=0b1234b66ab99364a5fff0d0c1f9e9666f2f5f50;hb=9549e8c28032c2d1fb578c43f1b340d1457b3c70;hp=75cb164ea9b355ec6ea333c814a99c52502b9873;hpb=dacfe1eeef622d7db8824392db9b6be877ee6a8c;p=src%2Fapp-framework-main.git 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