wgtpkg-zip: use PATH for retriving programs
authorJosé Bollo <jose.bollo@iot.bzh>
Mon, 4 Jan 2016 14:09:36 +0000 (15:09 +0100)
committerJosé Bollo <jose.bollo@iot.bzh>
Mon, 4 Jan 2016 14:44:27 +0000 (15:44 +0100)
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>
src/CMakeLists.txt
src/wgtpkg-zip.c

index c47e632..fb55e60 100644 (file)
@@ -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)
 
 ###########################################################################
index a810e50..916d0cd 100644 (file)
@@ -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