]> glassweightruler.freedombox.rocks Git - Ventoy.git/commitdiff
add image_list plugin
authorlongpanda <admin@ventoy.net>
Wed, 21 Oct 2020 02:23:58 +0000 (10:23 +0800)
committerlongpanda <admin@ventoy.net>
Wed, 21 Oct 2020 02:23:58 +0000 (10:23 +0800)
GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy.c
GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_def.h
GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_plugin.c
INSTALL/grub/debug.cfg

index 23f108493d8c5c124dc06b097932937f36606e6f..960020f3fa7c7375b470a987734aa8d712546375 100644 (file)
@@ -82,6 +82,8 @@ grub_uint32_t g_ventoy_cpio_size = 0;
 cpio_newc_header *g_ventoy_initrd_head = NULL;
 grub_uint8_t *g_ventoy_runtime_buf = NULL;
 
+int g_plugin_image_list = 0;
+
 ventoy_grub_param *g_grub_param = NULL;
 
 ventoy_guid  g_ventoy_guid = VENTOY_GUID;
@@ -1247,7 +1249,16 @@ static int ventoy_colect_img_files(const char *filename, const struct grub_dirho
         {
             return 0;
         }
-    
+
+        if (g_plugin_image_list)
+        {
+            grub_snprintf(g_img_swap_tmp_buf, sizeof(g_img_swap_tmp_buf), "%s%s", node->dir, filename);
+            if (ventoy_plugin_check_image_list(g_img_swap_tmp_buf) == 0)
+            {
+                return 0;
+            }
+        }
+        
         img = grub_zalloc(sizeof(img_info));
         if (img)
         {
@@ -1411,13 +1422,28 @@ static img_info * ventoy_get_min_iso(img_iterator_node *node)
     img_info *minimg = NULL;
     img_info *img = (img_info *)(node->firstiso);
 
-    while (img && (img_iterator_node *)(img->parent) == node)
+    if (g_plugin_image_list)
     {
-        if (img->select == 0 && (NULL == minimg || ventoy_cmp_img(img, minimg) < 0))
+        while (img && (img_iterator_node *)(img->parent) == node)
         {
-            minimg = img;
+            if (img->select == 0)
+            {
+                minimg = img;
+                break;
+            }
+            img = img->next;
+        }
+    }
+    else
+    {
+        while (img && (img_iterator_node *)(img->parent) == node)
+        {
+            if (img->select == 0 && (NULL == minimg || ventoy_cmp_img(img, minimg) < 0))
+            {
+                minimg = img;
+            }
+            img = img->next;
         }
-        img = img->next;
     }
 
     if (minimg)
@@ -1433,13 +1459,28 @@ static img_iterator_node * ventoy_get_min_child(img_iterator_node *node)
     img_iterator_node *Minchild = NULL;
     img_iterator_node *child = node->firstchild;
 
-    while (child && child->parent == node)
+    if (g_plugin_image_list)
+    {
+        while (child && child->parent == node)
+        {
+            if (child->select == 0)
+            {
+                Minchild = child;
+                break;
+            }
+            child = child->next;
+        }
+    }
+    else
     {
-        if (child->select == 0 && (NULL == Minchild || ventoy_cmp_subdir(child->dir, Minchild->dir) < 0))
+        while (child && child->parent == node)
         {
-            Minchild = child;
+            if (child->select == 0 && (NULL == Minchild || ventoy_cmp_subdir(child->dir, Minchild->dir) < 0))
+            {
+                Minchild = child;
+            }
+            child = child->next;
         }
-        child = child->next;
     }
 
     if (Minchild)
@@ -1823,7 +1864,7 @@ static grub_err_t ventoy_cmd_list_img(grub_extcmd_context_t ctxt, int argc, char
     grub_snprintf(g_iso_path, sizeof(g_iso_path), "%s", args[0]);
 
     strdata = ventoy_get_env("VTOY_DEFAULT_SEARCH_ROOT");
-    if (strdata && strdata[0] == '/')
+    if (0 == g_plugin_image_list && strdata && strdata[0] == '/')
     {
         len = grub_snprintf(g_img_iterator_head.dir, sizeof(g_img_iterator_head.dir) - 1, "%s", strdata);
         if (g_img_iterator_head.dir[len - 1] != '/')
@@ -1867,14 +1908,17 @@ static grub_err_t ventoy_cmd_list_img(grub_extcmd_context_t ctxt, int argc, char
         node = tmp;
     }
     
-    /* sort image list by image name */
-    for (cur = g_ventoy_img_list; cur; cur = cur->next)
+    /* sort image list by image name if image_list is not set in ventoy.json */
+    if (0 == g_plugin_image_list)
     {
-        for (tail = cur->next; tail; tail = tail->next)
+        for (cur = g_ventoy_img_list; cur; cur = cur->next)
         {
-            if (ventoy_cmp_img(cur, tail) > 0)
+            for (tail = cur->next; tail; tail = tail->next)
             {
-                ventoy_swap_img(cur, tail);
+                if (ventoy_cmp_img(cur, tail) > 0)
+                {
+                    ventoy_swap_img(cur, tail);
+                }
             }
         }
     }
index 812f5577943375543e2651fe9704f6453066bcb2..ea87c27a896ee5072a1addde6502e28fbc4d42f9 100644 (file)
@@ -778,6 +778,14 @@ typedef struct auto_memdisk
     struct auto_memdisk *next;
 }auto_memdisk;
 
+typedef struct image_list
+{
+    int pathlen;
+    char isopath[256];
+
+    struct image_list *next;
+}image_list;
+
 extern int g_ventoy_menu_esc;
 extern int g_ventoy_suppress_esc;
 extern int g_ventoy_last_entry;
@@ -787,6 +795,7 @@ extern int g_ventoy_iso_uefi_drv;
 extern int g_ventoy_case_insensitive;
 extern grub_uint8_t g_ventoy_chain_type;
 extern int g_vhdboot_enable;
+extern int g_plugin_image_list;
 extern ventoy_gpt_info *g_ventoy_part_info;
 
 #define ventoy_unix_fill_virt(new_data, new_len) \
@@ -819,6 +828,7 @@ const char * ventoy_plugin_get_injection(const char *isopath);
 const char * ventoy_plugin_get_menu_alias(int type, const char *isopath);
 const char * ventoy_plugin_get_menu_class(int type, const char *name);
 int ventoy_plugin_check_memdisk(const char *isopath);
+int ventoy_plugin_check_image_list(const char *isopath);
 int ventoy_get_block_list(grub_file_t file, ventoy_img_chunk_list *chunklist, grub_disk_addr_t start);
 int ventoy_check_block_list(grub_file_t file, ventoy_img_chunk_list *chunklist, grub_disk_addr_t start);
 void ventoy_plugin_dump_persistence(void);
index 2ebf1ca2e6f4d1fef156a210f7e3052c216f8c30..00d537fedd08113ae4b2d23d60b969e28c495ada 100644 (file)
@@ -46,6 +46,7 @@ static menu_alias *g_menu_alias_head = NULL;
 static menu_class *g_menu_class_head = NULL;
 static injection_config *g_injection_head = NULL;
 static auto_memdisk *g_auto_memdisk_head = NULL;
+static image_list *g_image_list_head = NULL;
 
 static int ventoy_plugin_control_check(VTOY_JSON *json, const char *isodisk)
 {
@@ -1096,6 +1097,85 @@ static int ventoy_plugin_auto_memdisk_check(VTOY_JSON *json, const char *isodisk
     return 0;
 }
 
+static int ventoy_plugin_image_list_entry(VTOY_JSON *json, const char *isodisk)
+{
+    VTOY_JSON *pNode = NULL;
+    image_list *node = NULL;
+    image_list *next = NULL;
+
+    (void)isodisk;
+
+    if (json->enDataType != JSON_TYPE_ARRAY)
+    {
+        debug("Not array %d\n", json->enDataType);
+        return 0;
+    }
+
+    if (g_image_list_head)
+    {
+        for (node = g_image_list_head; node; node = next)
+        {
+            next = node->next;
+            grub_free(node);
+        }
+
+        g_image_list_head = NULL;
+    }
+
+    g_plugin_image_list = 1;
+
+    for (pNode = json->pstChild; pNode; pNode = pNode->pstNext)
+    {
+        if (pNode->enDataType == JSON_TYPE_STRING)
+        {
+            node = grub_zalloc(sizeof(image_list));
+            if (node)
+            {
+                node->pathlen = grub_snprintf(node->isopath, sizeof(node->isopath), "%s", pNode->unData.pcStrVal);
+
+                if (g_image_list_head)
+                {
+                    node->next = g_image_list_head;
+                }
+                
+                g_image_list_head = node;
+            }
+        }
+    }
+
+    return 0;
+}
+
+static int ventoy_plugin_image_list_check(VTOY_JSON *json, const char *isodisk)
+{
+    VTOY_JSON *pNode = NULL;
+
+    if (json->enDataType != JSON_TYPE_ARRAY)
+    {
+        grub_printf("Not array %d\n", json->enDataType);
+        return 1;
+    }
+
+    for (pNode = json->pstChild; pNode; pNode = pNode->pstNext)
+    {
+        if (pNode->enDataType == JSON_TYPE_STRING)
+        {
+            grub_printf("<%s> ", pNode->unData.pcStrVal);
+
+            if (ventoy_check_file_exist("%s%s", isodisk, pNode->unData.pcStrVal))
+            {
+                grub_printf(" [OK]\n");
+            }
+            else
+            {
+                grub_printf(" [NOT EXIST]\n");
+            }
+        }
+    }
+
+    return 0;
+}
+
 static plugin_entry g_plugin_entries[] = 
 {
     { "control", ventoy_plugin_control_entry, ventoy_plugin_control_check },
@@ -1106,6 +1186,7 @@ static plugin_entry g_plugin_entries[] =
     { "menu_class", ventoy_plugin_menuclass_entry, ventoy_plugin_menuclass_check },
     { "injection", ventoy_plugin_injection_entry, ventoy_plugin_injection_check },
     { "auto_memdisk", ventoy_plugin_auto_memdisk_entry, ventoy_plugin_auto_memdisk_check },
+    { "image_list", ventoy_plugin_image_list_entry, ventoy_plugin_image_list_check },
 };
 
 static int ventoy_parse_plugin_config(VTOY_JSON *json, const char *isodisk)
@@ -1472,6 +1553,28 @@ int ventoy_plugin_check_memdisk(const char *isopath)
     return 0;
 }
 
+int ventoy_plugin_check_image_list(const char *isopath)
+{
+    int len;
+    image_list *node = NULL;
+
+    if (!g_image_list_head)
+    {
+        return 0;
+    }
+
+    len = (int)grub_strlen(isopath);    
+    for (node = g_image_list_head; node; node = node->next)
+    {
+        if (node->pathlen == len && grub_strncmp(isopath, node->isopath, len) == 0)
+        {
+            return 1;
+        }
+    }
+
+    return 0;
+}
+
 grub_err_t ventoy_cmd_plugin_check_json(grub_extcmd_context_t ctxt, int argc, char **args)
 {
     int i = 0;
index b2ed544b89c5bd10ed4d191762feea1e9b7664c6..46ee3956d4598c91484f20123a5cff3fde6a851b 100644 (file)
@@ -74,7 +74,16 @@ submenu 'Check plugin json configuration (ventoy.json)' --class=debug_json {
         echo -e "\npress ENTER to exit ..."
         read vtInputKey
         unset pager
-    }      
+    }  
+
+    menuentry 'Check image list plugin configuration' --class=debug_imagelist {
+        set pager=1
+        vt_check_plugin_json $vt_plugin_path image_list $vtoy_iso_part
+        
+        echo -e "\npress ENTER to exit ..."
+        read vtInputKey
+        unset pager
+    }
     
     menuentry 'Return to previous menu [Esc]' --class=vtoyret VTOY_RET {
         echo 'Return ...'