X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=src%2Fwgtpkg-zip.c;h=f7813c4907e2315f93f3cb89f0f9500d4a513e06;hb=fac693de3881f996d50508d2e1891cc6f18276ac;hp=4b87a41e4ab873d8c92f54020316b2656611c874;hpb=df95c86712d96754a4d660e9ddf98bdbad746cf4;p=src%2Fapp-framework-main.git diff --git a/src/wgtpkg-zip.c b/src/wgtpkg-zip.c index 4b87a41..f7813c4 100644 --- a/src/wgtpkg-zip.c +++ b/src/wgtpkg-zip.c @@ -150,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 */ @@ -187,7 +177,9 @@ int zread(const char *zipfile, unsigned long long maxsize) assert(fdesc != NULL); err = zip_stat_index(zip, fdesc->zindex, ZIP_FL_ENC_GUESS, &zstat); assert(zstat.name[0] != '/'); - if (zstat.size == 0) { + len = strlen(zstat.name); + assert(len > 0); + if (zstat.name[len - 1] == '/') { /* directory name */ err = create_directory((char*)zstat.name, MODE_OF_DIRECTORY_CREATION); if (err && errno != EEXIST) @@ -357,23 +349,55 @@ int zwrite(const char *zipfile) 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) @@ -401,7 +425,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; @@ -415,11 +439,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