]> glassweightruler.freedombox.rocks Git - Ventoy.git/commitdiff
Display warning message if ISO file has an invalid size.
authorlongpanda <admin@ventoy.net>
Wed, 3 Feb 2021 05:56:28 +0000 (13:56 +0800)
committerlongpanda <admin@ventoy.net>
Wed, 3 Feb 2021 05:56:28 +0000 (13:56 +0800)
GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy.c
GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_def.h
INSTALL/grub/grub.cfg

index 6fb113639135e90c60e8edd55ac49f64ed3304ed..75ec17d1329ff36b8f611c1f26476e0ebb5f9144 100644 (file)
@@ -534,6 +534,26 @@ static grub_err_t ventoy_cmd_incr(grub_extcmd_context_t ctxt, int argc, char **a
     VENTOY_CMD_RETURN(GRUB_ERR_NONE);
 }
 
+static grub_err_t ventoy_cmd_mod(grub_extcmd_context_t ctxt, int argc, char **args)
+{
+    long value1 = 0;
+    long value2 = 0;
+    char buf[32];
+    
+    if (argc != 3)
+    {
+        return grub_error(GRUB_ERR_BAD_ARGUMENT, "Usage: %s {Int} {Int} {Variable}", cmd_raw_name);
+    }
+
+    value1 = grub_strtol(args[0], NULL, 10);
+    value2 = grub_strtol(args[1], NULL, 10);
+
+    grub_snprintf(buf, sizeof(buf), "%ld", (value1 % value2));
+    grub_env_set(args[2], buf);
+
+    VENTOY_CMD_RETURN(GRUB_ERR_NONE);
+}
+
 static grub_err_t ventoy_cmd_file_size(grub_extcmd_context_t ctxt, int argc, char **args)
 {
     int rc = 1;
@@ -3236,14 +3256,15 @@ static grub_err_t ventoy_cmd_parse_volume(grub_extcmd_context_t ctxt, int argc,
     int len;
     grub_file_t file;
     char buf[64];
+    grub_uint64_t size;
     ventoy_iso9660_vd pvd;
         
     (void)ctxt;
     (void)argc;
 
-    if (argc != 3)
+    if (argc != 4)
     {
-        return grub_error(GRUB_ERR_BAD_ARGUMENT, "Usage: %s sysid volid \n", cmd_raw_name); 
+        return grub_error(GRUB_ERR_BAD_ARGUMENT, "Usage: %s sysid volid space \n", cmd_raw_name); 
     }
 
     file = ventoy_grub_file_open(VENTOY_FILE_TYPE, "%s", args[0]);
@@ -3269,6 +3290,11 @@ static grub_err_t ventoy_cmd_parse_volume(grub_extcmd_context_t ctxt, int argc,
     grub_memcpy(buf, pvd.vol, sizeof(pvd.vol));
     ventoy_set_env(args[2], buf);
 
+    size = pvd.space;
+    size *= 2048;
+    grub_snprintf(buf, sizeof(buf), "%llu", (ulonglong)size);
+    ventoy_set_env(args[3], buf);
+    
 end:
     grub_file_close(file);
     
@@ -4050,6 +4076,7 @@ static int ventoy_env_init(void)
 static cmd_para ventoy_cmds[] = 
 {
     { "vt_incr",  ventoy_cmd_incr,  0, NULL, "{Var} {INT}",   "Increase integer variable",    NULL },
+    { "vt_mod",  ventoy_cmd_mod,  0, NULL, "{Int} {Int} {Var}",   "mod integer variable",    NULL },
     { "vt_strstr",  ventoy_cmd_strstr,  0, NULL, "",   "",    NULL },
     { "vt_str_begin",  ventoy_cmd_strbegin,  0, NULL, "",   "",    NULL },
     { "vt_debug", ventoy_cmd_debug, 0, NULL, "{on|off}",   "turn debug on/off",    NULL },
index c074d772ac5e52f55783a77380b6dc8eb920b0b5..e228574d3e7a7d816bcc219fd681865da461da68 100644 (file)
@@ -163,6 +163,8 @@ typedef struct ventoy_iso9660_vd
     grub_uint8_t res;
     char sys[32];
     char vol[32];
+    grub_uint8_t res2[8];
+    grub_uint32_t space;
 }ventoy_iso9660_vd;
 
 #pragma pack()
index 15fe1e61f34bf4f74c9a529b21e03b8cefa3bc34..2a61314fd12810a9a0f2c0e1724937b4cf5cd115 100644 (file)
@@ -964,7 +964,19 @@ function iso_common_menuentry {
     unset vt_volume_id
     
     vt_chosen_img_path vt_chosen_path vt_chosen_size
-    vt_parse_iso_volume "${vtoy_iso_part}${vt_chosen_path}" vt_system_id vt_volume_id
+
+    vt_parse_iso_volume "${vtoy_iso_part}${vt_chosen_path}" vt_system_id vt_volume_id vt_volume_space
+    if [ $vt_volume_space -ne $vt_chosen_size ]; then        
+        vt_mod $vt_chosen_size 2048 vt_chosen_size_mod
+        if [ $vt_volume_space -gt $vt_chosen_size -o $vt_chosen_size_mod -ne 0 ]; then
+            echo -e "\n $vt_volume_space $vt_chosen_size $vt_chosen_size_mod\n"
+            echo -e "\n The size of the iso file \"$vt_chosen_size\" is invalid. File corrupted ?\n"
+            echo -e " 此ISO文件的大小 \"$vt_chosen_size\" 有问题,请确认文件是否损坏。\n"
+            echo -e "\n press ENTER to exit (请按 回车 键返回) ..."
+            read vtInputKey
+            return
+        fi
+    fi
     
     if vt_check_password "${vt_chosen_path}"; then
         return