aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJosé Bollo <jose.bollo@iot.bzh>2016-01-04 15:09:36 +0100
committerJosé Bollo <jose.bollo@iot.bzh>2016-01-04 15:44:27 +0100
commitcda8f0470953975c45c66b8f3b7249f36f064d78 (patch)
treed125c68406e56693770e24018331e5f963b16230
parent07c512dad1762f3791cc796a3014b43a0211345b (diff)
wgtpkg-zip: use PATH for retriving programs
When using yocto, the directive 'find_program' of cmake returns a path that matches the host path when builing, not the path of the file on the target. Using the standard algorithm for seeking programs using PATH should solve the problem. Change-Id: I426a88fe044a1d1b3a72124da17ca8a188caad9c Signed-off-by: José Bollo <jose.bollo@iot.bzh>
-rw-r--r--src/CMakeLists.txt4
-rw-r--r--src/wgtpkg-zip.c50
2 files changed, 42 insertions, 12 deletions
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index c47e632..fb55e60 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -39,9 +39,7 @@ if(USE_LIBZIP)
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}")
+ add_definitions(-DUSE_LIBZIP=0)
endif(USE_LIBZIP)
###########################################################################
diff --git a/src/wgtpkg-zip.c b/src/wgtpkg-zip.c
index a810e50..916d0cd 100644
--- a/src/wgtpkg-zip.c
+++ b/src/wgtpkg-zip.c
@@ -357,23 +357,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 +433,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;
@@ -419,7 +451,7 @@ int zwrite(const char *zipfile)
args[4] = workdir;
args[5] = NULL;
- return zrun(PATH_TO_ZIP, args);
+ return zrun(args[0], args);
}
#endif