X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=src%2Fwgtpkg-zip.c;h=8fe17c4600e81e936f69a4eb4bfaf883327d20ec;hb=7d6a4222f3c4fda1ea2d69ae057ba7cc31343ffe;hp=0b1234b66ab99364a5fff0d0c1f9e9666f2f5f50;hpb=9549e8c28032c2d1fb578c43f1b340d1457b3c70;p=src%2Fapp-framework-main.git diff --git a/src/wgtpkg-zip.c b/src/wgtpkg-zip.c index 0b1234b..8fe17c4 100644 --- a/src/wgtpkg-zip.c +++ b/src/wgtpkg-zip.c @@ -16,7 +16,7 @@ limitations under the License. */ -#define _BSD_SOURCE /* see readdir */ +#define _DEFAULT_SOURCE #include #include @@ -29,7 +29,9 @@ #include #include "verbose.h" -#include "wgtpkg.h" +#include "wgtpkg-files.h" +#include "wgtpkg-workdir.h" +#include "wgtpkg-zip.h" #define MODE_OF_FILE_CREATION 0640 #define MODE_OF_DIRECTORY_CREATION 0750 @@ -148,20 +150,10 @@ int zread(const char *zipfile, unsigned long long maxsize) ERROR("empty entry found in %s", zipfile); goto error; } - if (zstat.size == 0) { - /* directory name */ - if (zstat.name[len - 1] != '/') { - ERROR("bad directory name %s in %s", zstat.name, zipfile); - goto error; - } + if (zstat.name[len - 1] == '/') /* record */ fdesc = file_add_directory(zstat.name); - } else { - /* directory name */ - if (zstat.name[len - 1] == '/') { - ERROR("bad file name %s in %s", zstat.name, zipfile); - goto error; - } + else { /* get the size */ esize += zstat.size; /* record */ @@ -351,26 +343,59 @@ int zwrite(const char *zipfile) #else #include +#include extern char **environ; -static int zrun(const char *path, const char *args[]) +static char *getbin(const char *progname) +{ + char name[PATH_MAX]; + char *path; + int i; + + if (progname[0] == '/') + return access(progname, X_OK) ? NULL : strdup(progname); + + path = getenv("PATH"); + while(path && *path) { + for (i = 0 ; path[i] && path[i] != ':' ; i++) + name[i] = path[i]; + path += i + !!path[i]; + name[i] = '/'; + strcpy(name + i + 1, progname); + if (access(name, X_OK) == 0) + return realpath(name, NULL); + } + return NULL; +} + +static int zrun(const char *name, const char *args[]) { int rc; siginfo_t si; + char *binary; + + binary = getbin(name); + if (binary == NULL) { + ERROR("error while forking in zrun: can't find %s", name); + return -1; + } rc = fork(); + if (rc == 0) { + rc = execve(binary, (char * const*)args, environ); + ERROR("can't execute %s in zrun: %m", args[0]); + _exit(1); + return rc; + } + + free(binary); 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) @@ -398,7 +423,7 @@ int zread(const char *zipfile, unsigned long long maxsize) args[5] = NULL; file_reset(); - rc = zrun(PATH_TO_UNZIP, args); + rc = zrun(args[0], args); if (!rc) rc = fill_files(); return rc; @@ -412,11 +437,11 @@ int zwrite(const char *zipfile) args[0] = "zip"; args[1] = "-q"; args[2] = "-r"; - args[3] = workdir; - args[4] = zipfile; + args[3] = zipfile; + args[4] = workdir; args[5] = NULL; - return zrun(PATH_TO_ZIP, args); + return zrun(args[0], args); } #endif