wgtpkg-zip: fix bug of modes
[src/app-framework-main.git] / src / wgtpkg-zip.c
index a810e50..caae1c9 100644 (file)
@@ -33,8 +33,8 @@
 #include "wgtpkg-workdir.h"
 #include "wgtpkg-zip.h"
 
-#define MODE_OF_FILE_CREATION 0640
-#define MODE_OF_DIRECTORY_CREATION 0750
+#define MODE_OF_FILE_CREATION 0644
+#define MODE_OF_DIRECTORY_CREATION 0755
 
 #if !defined(USE_LIBZIP)
 #      define USE_LIBZIP 1
@@ -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;
@@ -419,7 +443,7 @@ int zwrite(const char *zipfile)
        args[4] = workdir;
        args[5] = NULL;
 
-       return zrun(PATH_TO_ZIP, args);
+       return zrun(args[0], args);
 }
 
 #endif