]> glassweightruler.freedombox.rocks Git - Ventoy.git/commitdiff
Show file checksum menu title according to the existence of checksum value.
authorlongpanda <admin@ventoy.net>
Tue, 10 Jan 2023 04:23:35 +0000 (12:23 +0800)
committerlongpanda <admin@ventoy.net>
Tue, 10 Jan 2023 04:23:35 +0000 (12:23 +0800)
GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_cmd.c
GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_def.h
INSTALL/grub/checksum.cfg

index 83aa105f30cfdf637aa3a6035d8bd010d6c69bbc..7b57279476d5b395a3dea024c1d4f1d63b0d9472 100644 (file)
@@ -158,7 +158,9 @@ const char *g_menu_prefix[img_type_max] =
     "iso", "wim", "efi", "img", "vhd", "vtoy"
 };
 
-static const char *g_lower_chksum_name[] = { "md5", "sha1", "sha256", "sha512" };
+static const char *g_lower_chksum_name[VTOY_CHKSUM_NUM] = { "md5", "sha1", "sha256", "sha512" };
+static int g_lower_chksum_namelen[VTOY_CHKSUM_NUM] = { 3, 4, 6, 6 };
+static int g_chksum_retlen[VTOY_CHKSUM_NUM] = { 32, 40, 64, 128 };
 
 static int g_vtoy_secondary_need_recover = 0;
 
@@ -6305,36 +6307,6 @@ static grub_err_t ventoy_cmd_load_menu_lang(grub_extcmd_context_t ctxt, int argc
     VENTOY_CMD_RETURN(0);
 }
 
-static grub_err_t ventoy_cmd_vtoychksum_exist(grub_extcmd_context_t ctxt, int argc, char **args)
-{
-    int cnt;
-    char c;
-    char *pos = NULL;
-    
-    (void)ctxt;
-    (void)argc;
-
-    cnt = ventoy_str_chrcnt(args[1], '/');
-    if (cnt > 1)
-    {
-        pos = grub_strrchr(args[1], '/');
-        c = *pos;
-        *pos = 0;
-        if (ventoy_check_file_exist("%s%s/VENTOY_CHECKSUM", args[0], args[1]))
-        {
-            VENTOY_CMD_RETURN(GRUB_ERR_NONE);
-        }
-        *pos = c;
-    }
-
-    if (ventoy_check_file_exist("%s/VENTOY_CHECKSUM", args[0]))
-    {
-        VENTOY_CMD_RETURN(GRUB_ERR_NONE);
-    }
-
-    return 1;
-}
-
 static int ventoy_chksum_pathcmp(int chktype, char *rlpath, char *rdpath)
 {
     char *pos1 = NULL;
@@ -6485,13 +6457,12 @@ static grub_err_t ventoy_cmd_cmp_checksum(grub_extcmd_context_t ctxt, int argc,
     char fchksum[64];
     char readchk[256] = {0};
     char filebuf[512] = {0};
-    int retlen[] = { 32, 40, 64, 128 };
     char uchkname[16];
 
     (void)ctxt;
 
     index = (int)grub_strtol(args[0], NULL, 10);
-    if (argc != 2 || index < 0 || index >= (int)ARRAY_SIZE(retlen))
+    if (argc != 2 || index < 0 || index >= VTOY_CHKSUM_NUM)
     {
         return 1;
     }
@@ -6519,17 +6490,17 @@ static grub_err_t ventoy_cmd_cmp_checksum(grub_extcmd_context_t ctxt, int argc,
         if (pos)
         {
             VTOY_SKIP_SPACE_NEXT(pos, 1);
-            grub_memcpy(readchk, pos, retlen[index]);
+            grub_memcpy(readchk, pos, g_chksum_retlen[index]);
         }
         else
         {
-            grub_memcpy(readchk, filebuf, retlen[index]);
+            grub_memcpy(readchk, filebuf, g_chksum_retlen[index]);
         }
     }
     else if (chktype == 3 || chktype == 4)
     {
         grub_snprintf(fchksum, sizeof(fchksum), "global VENTOY_CHECKSUM");
-        ventoy_find_checksum(file, uchkname, retlen[index], args[1], chktype, readchk);
+        ventoy_find_checksum(file, uchkname, g_chksum_retlen[index], args[1], chktype, readchk);
         if (readchk[0] == 0)
         {
             grub_printf("\n\n%s value not found in %s.\n", uchkname, fchksum);
@@ -6539,7 +6510,7 @@ static grub_err_t ventoy_cmd_cmp_checksum(grub_extcmd_context_t ctxt, int argc,
     else
     {
         grub_snprintf(fchksum, sizeof(fchksum), "local VENTOY_CHECKSUM");
-        ventoy_find_checksum(file, uchkname, retlen[index], args[1], chktype, readchk);
+        ventoy_find_checksum(file, uchkname, g_chksum_retlen[index], args[1], chktype, readchk);
         if (readchk[0] == 0)
         {
             grub_file_close(file);
@@ -6547,7 +6518,7 @@ static grub_err_t ventoy_cmd_cmp_checksum(grub_extcmd_context_t ctxt, int argc,
             if (file)
             {
                 grub_snprintf(fchksum, sizeof(fchksum), "global VENTOY_CHECKSUM");
-                ventoy_find_checksum(file, uchkname, retlen[index], args[1], 3, readchk);
+                ventoy_find_checksum(file, uchkname, g_chksum_retlen[index], args[1], 3, readchk);
                 if (readchk[0] == 0)
                 {
                     grub_printf("\n\n%s value not found in both local and global VENTOY_CHECKSUM.\n", uchkname);
@@ -6573,6 +6544,181 @@ end:
     VENTOY_CMD_RETURN(0);
 }
 
+static int ventoy_find_all_checksum
+(
+    grub_file_t file, 
+    char *path,
+    int chktype,
+    int exists[VTOY_CHKSUM_NUM],
+    int *ptotexist
+)
+{
+    int i;
+    int ulen;
+    int tot = 0;
+    char c = 0;
+    char *pos = NULL;
+    char *pos1 = NULL;
+    char *pos2 = NULL;
+    char *buf = NULL;
+    char *currline = NULL;
+    char *nextline = NULL;
+    const char *uname = NULL;
+
+    tot = *ptotexist;
+
+    /* read file to buffer */
+    buf = grub_malloc(file->size + 4);
+    if (!buf)
+    {
+        return 1;
+    }
+    grub_file_read(file, buf, file->size);
+    buf[file->size] = 0;
+
+    /* parse each line */
+    for (currline = buf; currline; currline = nextline)
+    {
+        nextline = ventoy_get_line(currline);
+        VTOY_SKIP_SPACE(currline);
+
+        for (i = 0; i < VTOY_CHKSUM_NUM; i++)
+        {
+            if (exists[i])
+            {
+                continue;
+            }
+        
+            uname = g_lower_chksum_name[i];
+            ulen = g_lower_chksum_namelen[i];
+
+            if (grub_strncasecmp(currline, uname, ulen) == 0)
+            {
+                pos = grub_strchr(currline, '=');
+                pos1 = grub_strchr(currline, '(');
+                pos2 = grub_strchr(currline, ')');
+                
+                if (pos && pos1 && pos2)
+                {
+                    c = *pos2;
+                    *pos2 = 0;
+                    if (ventoy_chksum_pathcmp(chktype, path, pos1 + 1) == 0)
+                    {
+                        exists[i] = 1;
+                        tot++;
+                    }
+                    *pos2 = c;
+                }
+            }
+            else if (ventoy_str_len_alnum(currline, g_chksum_retlen[i]))
+            {
+                VTOY_SKIP_SPACE_NEXT_EX(pos, currline, g_chksum_retlen[i]);
+                if (ventoy_chksum_pathcmp(chktype, path, pos) == 0)
+                {
+                    exists[i] = 1;
+                    tot++;
+                }
+            }
+
+            if (tot >= VTOY_CHKSUM_NUM)
+            {
+                goto end;
+            }
+        }
+    }
+
+end:
+
+    *ptotexist = tot;
+    grub_free(buf);
+    return 0;
+}
+
+static grub_err_t ventoy_cmd_vtoychksum_exist(grub_extcmd_context_t ctxt, int argc, char **args)
+{
+    int i = 0;
+    int cnt = 0;
+    char c = 0;
+    int tip = 0;
+    char *pos = NULL;
+    grub_file_t file = NULL;
+    const char *isopart = NULL;
+    int exists[VTOY_CHKSUM_NUM] = { 0, 0, 0, 0 };
+    int totexist = 0;
+
+    (void)argc;
+    (void)ctxt;
+    
+    isopart = grub_env_get("vtoy_iso_part");
+
+    for (i = 0; i < VTOY_CHKSUM_NUM; i++)
+    {
+        if (ventoy_check_file_exist("%s%s.%s", isopart, args[0], g_lower_chksum_name[i]))
+        {
+            exists[i] = 1;
+            totexist++;
+        }
+    }
+
+    if (totexist == VTOY_CHKSUM_NUM)
+    {
+        goto end;
+    }
+
+    cnt = ventoy_str_chrcnt(args[0], '/');
+    if (cnt > 1)
+    {
+        pos = grub_strrchr(args[0], '/');
+        c = *pos;
+        *pos = 0;
+        file = ventoy_grub_file_open(VENTOY_FILE_TYPE, "%s%s/VENTOY_CHECKSUM", isopart, args[0]);
+        *pos = c;
+        
+        if (file)
+        {
+            if (tip == 0 && file->size > (32 * VTOY_SIZE_1KB))
+            {
+                tip = 1;
+                grub_printf("Reading checksum file...\n");
+                grub_refresh();
+            }
+        
+            debug("parse local VENTOY_CHECKSUM\n");
+            ventoy_find_all_checksum(file, args[0], 2, exists, &totexist);
+            grub_file_close(file);
+        }
+    }
+
+    if (totexist == VTOY_CHKSUM_NUM)
+    {
+        goto end;
+    }
+
+    file = ventoy_grub_file_open(VENTOY_FILE_TYPE, "%s/VENTOY_CHECKSUM", isopart);
+    if (file)
+    {
+        if (tip == 0 && file->size > (32 * VTOY_SIZE_1KB))
+        {
+            tip = 1;
+            grub_printf("Reading checksum file...\n");
+            grub_refresh();
+        }
+
+        debug("parse global VENTOY_CHECKSUM\n");
+        ventoy_find_all_checksum(file, args[0], (cnt > 1) ? 3 : 4, exists, &totexist);
+        grub_file_close(file);
+    }
+
+end:
+
+    ventoy_env_int_set("VT_EXIST_MD5", exists[0]);
+    ventoy_env_int_set("VT_EXIST_SHA1", exists[1]);
+    ventoy_env_int_set("VT_EXIST_SHA256", exists[2]);
+    ventoy_env_int_set("VT_EXIST_SHA512", exists[3]);
+
+    VENTOY_CMD_RETURN(0);
+}
+
 
 static const char * ventoy_menu_lang_read_hook(struct grub_env_var *var, const char *val)
 {
index 115e2ce5f36b61903b274e65496d8eef0c1eded0..df424323ec323cd319698d963c61ec03400f6a58 100644 (file)
@@ -62,6 +62,8 @@
 
 #define VTOY_WARNING  "!!!!!!!!!!!!! WARNING !!!!!!!!!!!!!"
 
+#define VTOY_CHKSUM_NUM  4
+
 #define VTOY_PLAT_I386_UEFI     0x49413332
 #define VTOY_PLAT_ARM64_UEFI    0x41413634
 #define VTOY_PLAT_X86_64_UEFI   0x55454649
index a3dc890ddde360fe106bee02f37b8a0edfd36880..df045ec5ff462dbdd45a8f9ae96accd37a8d4487 100644 (file)
@@ -1,9 +1,8 @@
 
 unset vtchkdef
-vt_vtoychksum_exist "${vtoy_iso_part}" "${VTOY_CHKSUM_FILE_PATH}" 
-set vtchksumfile=$?
+vt_vtoychksum_exist "${VTOY_CHKSUM_FILE_PATH}" 
 
-if [ -f "${vtoy_iso_part}${VTOY_CHKSUM_FILE_PATH}.md5" -o $vtchksumfile -eq 0 ]; then
+if [ "$VT_EXIST_MD5" = "1" ]; then
     if [ -z "$vtchkdef" ]; then
         set default=0
         set vtchkdef=1
@@ -24,7 +23,7 @@ else
     }
 fi
 
-if [ -f "${vtoy_iso_part}${VTOY_CHKSUM_FILE_PATH}.sha1" -o $vtchksumfile -eq 0 ]; then
+if [ "$VT_EXIST_SHA1" = "1" ]; then
     if [ -z "$vtchkdef" ]; then
         set default=1
         set vtchkdef=1
@@ -47,7 +46,7 @@ fi
 
 
 
-if [ -f "${vtoy_iso_part}${VTOY_CHKSUM_FILE_PATH}.sha256" -o $vtchksumfile -eq 0 ]; then
+if [ "$VT_EXIST_SHA256" = "1" ]; then
     if [ -z "$vtchkdef" ]; then
         set default=2
         set vtchkdef=1
@@ -70,7 +69,7 @@ fi
 
 
 
-if [ -f "${vtoy_iso_part}${VTOY_CHKSUM_FILE_PATH}.sha512" -o $vtchksumfile -eq 0 ]; then
+if [ "$VT_EXIST_SHA512" = "1" ]; then
     if [ -z "$vtchkdef" ]; then
         set default=3
         set vtchkdef=1