Fix to install preload-rw packages first 78/302878/5
authorSangyoon Jang <jeremy.jang@samsung.com>
Fri, 15 Dec 2023 04:03:13 +0000 (13:03 +0900)
committerSangyoon Jang <jeremy.jang@samsung.com>
Fri, 15 Dec 2023 05:11:43 +0000 (14:11 +0900)
Install preload-rw packages first to make more free space in the RO partition
during installation.

Change-Id: I5a208aba8e4149b84daa2717ea22a5e920397a88
Signed-off-by: Sangyoon Jang <jeremy.jang@samsung.com>
src/install_preload_pkg/install_preload_pkg.c

index 7235de8..32dbda5 100644 (file)
@@ -92,6 +92,7 @@ typedef struct pkgfile_info {
 } pkgfile_info;
 
 GList *pkgfile_info_list;
+GList *rw_pkgfile_info_list;
 
 static void __free_pkgfile_info_list(gpointer data)
 {
@@ -140,8 +141,9 @@ static void __make_preload_rw_list(GList *pkg_list)
        fclose(file);
 }
 
-static int _add_pkgfile_info(const char *backend, const char *directory,
-               install_type type, bool skip_check_reference) {
+static int _add_pkgfile_info(GList **list, const char *backend,
+               const char *directory, install_type type,
+               bool skip_check_reference) {
        DIR *dir;
        struct dirent *file_info;
        char err_buf[BUFSZE];
@@ -210,7 +212,7 @@ static int _add_pkgfile_info(const char *backend, const char *directory,
                pkgfile->pkg_size = ftell(fp);
                fclose(fp);
 
-               pkgfile_info_list = g_list_prepend(pkgfile_info_list, pkgfile);
+               *list = g_list_prepend(*list, pkgfile);
        }
 
        closedir(dir);
@@ -234,6 +236,9 @@ static gint __pkgfileinfo_compare(gconstpointer a, gconstpointer b)
 
 static void _sort_pkgfile_info_list() {
        pkgfile_info_list = g_list_sort(pkgfile_info_list, __pkgfileinfo_compare);
+       rw_pkgfile_info_list = g_list_sort(rw_pkgfile_info_list, __pkgfileinfo_compare);
+        pkgfile_info_list = g_list_concat(rw_pkgfile_info_list, pkgfile_info_list);
+        rw_pkgfile_info_list = NULL;
 }
 
 static int _install_pkg_with_pkginfo()
@@ -273,7 +278,7 @@ static int _install_pkg_with_pkginfo()
                        int status = 0;
                        waitpid(pid, &status, 0);
                        if (WIFEXITED(status) == 0 || WEXITSTATUS(status) != 0) {
-                               _E("Execution failed : %s", file_info->backend_type);
+                               _E("Install failed : %s, %s", file_info->backend_type, file_info->path);
                                g_list_free_full(preload_rw_pkg_list, __free_pkginfo);
                                return -1;
                        }
@@ -424,31 +429,33 @@ int main(int argc, char *argv[])
        }
 
        if (is_default) {
-               if (_add_pkgfile_info(TPK_BACKEND_CMD, TPK_DIR,
+               if (_add_pkgfile_info(&pkgfile_info_list, TPK_BACKEND_CMD, TPK_DIR,
                                INSTALL_TYPE_PRELOAD, skip_check_reference) != 0)
                        goto error;
 
-               if (_add_pkgfile_info(TPK_BACKEND_CMD, TPK_RW_DIR,
+               if (_add_pkgfile_info(&rw_pkgfile_info_list, TPK_BACKEND_CMD, TPK_RW_DIR,
                                INSTALL_TYPE_PRELOAD_RW, skip_check_reference) != 0)
                        goto error;
 
-               if (_add_pkgfile_info(WGT_BACKEND_CMD, WGT_DIR,
+               if (_add_pkgfile_info(&pkgfile_info_list, WGT_BACKEND_CMD, WGT_DIR,
                                INSTALL_TYPE_PRELOAD, skip_check_reference) != 0)
                        goto error;
 
-               if (_add_pkgfile_info(WGT_BACKEND_CMD, WGT_RW_DIR,
+               if (_add_pkgfile_info(&rw_pkgfile_info_list, WGT_BACKEND_CMD, WGT_RW_DIR,
                                INSTALL_TYPE_PRELOAD_RW, skip_check_reference) != 0)
                        goto error;
 
-               if (_add_pkgfile_info(UNIFIED_BACKEND_CMD, RPK_DIR,
+               if (_add_pkgfile_info(&pkgfile_info_list, UNIFIED_BACKEND_CMD, RPK_DIR,
                                INSTALL_TYPE_PRELOAD, skip_check_reference) != 0)
                        goto error;
 
-               if (_add_pkgfile_info(UNIFIED_BACKEND_CMD, RPK_RW_DIR,
+               if (_add_pkgfile_info(&rw_pkgfile_info_list, UNIFIED_BACKEND_CMD, RPK_RW_DIR,
                                INSTALL_TYPE_PRELOAD_RW, skip_check_reference) != 0)
                        goto error;
 
-
+               /* sort pkgfile_info_list and rw_pkgfile_info_list first,
+                * and concat rw_pkgfile_info_list to pkgfile_info_list
+                */
                _sort_pkgfile_info_list();
 
                if (_install_pkg_with_pkginfo() != 0)
@@ -471,7 +478,7 @@ int main(int argc, char *argv[])
        else
                backend_cmd = WGT_BACKEND_CMD;
 
-       if (_add_pkgfile_info(backend_cmd, pkg_path,
+       if (_add_pkgfile_info(&pkgfile_info_list, backend_cmd, pkg_path,
                        op_type, skip_check_reference) != 0)
                goto error;