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>
link_libraries(${LIBZIP_LIBRARIES})
add_definitions(-DUSE_LIBZIP=1)
else(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)
###########################################################################
endif(USE_LIBZIP)
###########################################################################
-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[])
+ char *binary;
+
+ binary = getbin(name);
+ if (binary == NULL) {
+ ERROR("error while forking in zrun: can't find %s", name);
+ return -1;
+ }
+ 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 < 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)
/* wait termination of the child */
rc = waitid(P_PID, (id_t)rc, &si, WEXITED);
if (rc)
args[5] = NULL;
file_reset();
args[5] = NULL;
file_reset();
- rc = zrun(PATH_TO_UNZIP, args);
+ rc = zrun(args[0], args);
if (!rc)
rc = fill_files();
return rc;
if (!rc)
rc = fill_files();
return rc;
args[4] = workdir;
args[5] = NULL;
args[4] = workdir;
args[5] = NULL;
- return zrun(PATH_TO_ZIP, args);
+ return zrun(args[0], args);