Support * fuzzy matching for file path in some plugins

This commit is contained in:
longpanda 2021-04-24 16:03:38 +08:00
parent b15a96b747
commit c6be35f2c0
3 changed files with 90 additions and 24 deletions

View File

@ -148,6 +148,38 @@ void ventoy_debug(const char *fmt, ...)
va_end (args); va_end (args);
} }
int ventoy_strcmp(const char *pattern, const char *str)
{
while (*pattern && *str)
{
if ((*pattern != *str) && (*pattern != '*'))
break;
pattern++;
str++;
}
return (int)(grub_uint8_t)*pattern - (int)(grub_uint8_t)*str;
}
int ventoy_strncmp (const char *pattern, const char *str, grub_size_t n)
{
if (n == 0)
return 0;
while (*pattern && *str && --n)
{
if ((*pattern != *str) && (*pattern != '*'))
break;
pattern++;
str++;
}
return (int)(grub_uint8_t)*pattern - (int)(grub_uint8_t)*str;
}
void ventoy_debug_dump_guid(const char *prefix, grub_uint8_t *guid) void ventoy_debug_dump_guid(const char *prefix, grub_uint8_t *guid)
{ {
int i; int i;

View File

@ -527,7 +527,8 @@ typedef struct plugin_entry
ventoy_plugin_check_pf checkfunc; ventoy_plugin_check_pf checkfunc;
}plugin_entry; }plugin_entry;
int ventoy_strcmp(const char *pattern, const char *str);
int ventoy_strncmp (const char *pattern, const char *str, grub_size_t n);
void ventoy_fill_os_param(grub_file_t file, ventoy_os_param *param); void ventoy_fill_os_param(grub_file_t file, ventoy_os_param *param);
grub_err_t ventoy_cmd_isolinux_initrd_collect(grub_extcmd_context_t ctxt, int argc, char **args); grub_err_t ventoy_cmd_isolinux_initrd_collect(grub_extcmd_context_t ctxt, int argc, char **args);
grub_err_t ventoy_cmd_grub_initrd_collect(grub_extcmd_context_t ctxt, int argc, char **args); grub_err_t ventoy_cmd_grub_initrd_collect(grub_extcmd_context_t ctxt, int argc, char **args);

View File

@ -481,6 +481,7 @@ static int ventoy_plugin_auto_install_check(VTOY_JSON *json, const char *isodisk
{ {
int pathnum = 0; int pathnum = 0;
int autosel = 0; int autosel = 0;
char *pos = NULL;
const char *iso = NULL; const char *iso = NULL;
VTOY_JSON *pNode = NULL; VTOY_JSON *pNode = NULL;
@ -500,9 +501,10 @@ static int ventoy_plugin_auto_install_check(VTOY_JSON *json, const char *isodisk
iso = vtoy_json_get_string_ex(pNode->pstChild, "image"); iso = vtoy_json_get_string_ex(pNode->pstChild, "image");
if (iso) if (iso)
{ {
if (0 == ventoy_plugin_check_path(isodisk, iso)) pos = grub_strchr(iso, '*');
if (pos || 0 == ventoy_plugin_check_path(isodisk, iso))
{ {
grub_printf("image: %s [OK]\n", iso); grub_printf("image: %s [%s]\n", iso, (pos ? "*" : "OK"));
ventoy_plugin_check_fullpath(pNode->pstChild, isodisk, "template", &pathnum); ventoy_plugin_check_fullpath(pNode->pstChild, isodisk, "template", &pathnum);
if (JSON_SUCCESS == vtoy_json_get_int(pNode->pstChild, "autosel", &autosel)) if (JSON_SUCCESS == vtoy_json_get_int(pNode->pstChild, "autosel", &autosel))
@ -599,6 +601,7 @@ static int ventoy_plugin_auto_install_entry(VTOY_JSON *json, const char *isodisk
static int ventoy_plugin_dud_check(VTOY_JSON *json, const char *isodisk) static int ventoy_plugin_dud_check(VTOY_JSON *json, const char *isodisk)
{ {
int pathnum = 0; int pathnum = 0;
char *pos = NULL;
const char *iso = NULL; const char *iso = NULL;
VTOY_JSON *pNode = NULL; VTOY_JSON *pNode = NULL;
@ -618,9 +621,10 @@ static int ventoy_plugin_dud_check(VTOY_JSON *json, const char *isodisk)
iso = vtoy_json_get_string_ex(pNode->pstChild, "image"); iso = vtoy_json_get_string_ex(pNode->pstChild, "image");
if (iso) if (iso)
{ {
if (0 == ventoy_plugin_check_path(isodisk, iso)) pos = grub_strchr(iso, '*');
if (pos || 0 == ventoy_plugin_check_path(isodisk, iso))
{ {
grub_printf("image: %s [OK]\n", iso); grub_printf("image: %s [%s]\n", iso, (pos ? "*" : "OK"));
ventoy_plugin_check_fullpath(pNode->pstChild, isodisk, "dud", &pathnum); ventoy_plugin_check_fullpath(pNode->pstChild, isodisk, "dud", &pathnum);
} }
else else
@ -884,6 +888,7 @@ static int ventoy_plugin_pwd_entry(VTOY_JSON *json, const char *isodisk)
static int ventoy_plugin_pwd_check(VTOY_JSON *json, const char *isodisk) static int ventoy_plugin_pwd_check(VTOY_JSON *json, const char *isodisk)
{ {
char *pos = NULL;
const char *iso = NULL; const char *iso = NULL;
const char *pwd = NULL; const char *pwd = NULL;
VTOY_JSON *pNode = NULL; VTOY_JSON *pNode = NULL;
@ -922,13 +927,14 @@ static int ventoy_plugin_pwd_check(VTOY_JSON *json, const char *isodisk)
iso = vtoy_json_get_string_ex(pCNode->pstChild, "file"); iso = vtoy_json_get_string_ex(pCNode->pstChild, "file");
if (iso) if (iso)
{ {
if (0 == ventoy_plugin_check_path(isodisk, iso)) pos = grub_strchr(iso, '*');
if (pos || 0 == ventoy_plugin_check_path(isodisk, iso))
{ {
pwd = vtoy_json_get_string_ex(pCNode->pstChild, "pwd"); pwd = vtoy_json_get_string_ex(pCNode->pstChild, "pwd");
if (0 == ventoy_plugin_parse_pwdstr((char *)pwd, NULL)) if (0 == ventoy_plugin_parse_pwdstr((char *)pwd, NULL))
{ {
grub_printf("file:<%s> [OK]\n", iso); grub_printf("file:<%s> [%s]\n", iso, (pos ? "*" : "OK"));
grub_printf("pwd:<%s>\n\n", pwd); grub_printf("pwd:<%s>\n\n", pwd);
} }
else else
@ -956,6 +962,7 @@ static int ventoy_plugin_persistence_check(VTOY_JSON *json, const char *isodisk)
{ {
int autosel = 0; int autosel = 0;
int pathnum = 0; int pathnum = 0;
char *pos = NULL;
const char *iso = NULL; const char *iso = NULL;
VTOY_JSON *pNode = NULL; VTOY_JSON *pNode = NULL;
@ -975,9 +982,10 @@ static int ventoy_plugin_persistence_check(VTOY_JSON *json, const char *isodisk)
iso = vtoy_json_get_string_ex(pNode->pstChild, "image"); iso = vtoy_json_get_string_ex(pNode->pstChild, "image");
if (iso) if (iso)
{ {
if (0 == ventoy_plugin_check_path(isodisk, iso)) pos = grub_strchr(iso, '*');
if (pos || 0 == ventoy_plugin_check_path(isodisk, iso))
{ {
grub_printf("image: %s [OK]\n", iso); grub_printf("image: %s [%s]\n", iso, (pos ? "*" : "OK"));
ventoy_plugin_check_fullpath(pNode->pstChild, isodisk, "backend", &pathnum); ventoy_plugin_check_fullpath(pNode->pstChild, isodisk, "backend", &pathnum);
if (JSON_SUCCESS == vtoy_json_get_int(pNode->pstChild, "autosel", &autosel)) if (JSON_SUCCESS == vtoy_json_get_int(pNode->pstChild, "autosel", &autosel))
@ -1103,7 +1111,11 @@ static int ventoy_plugin_menualias_check(VTOY_JSON *json, const char *isodisk)
{ {
if (vtoy_alias_image_file == type) if (vtoy_alias_image_file == type)
{ {
if (ventoy_is_file_exist("%s%s", isodisk, path)) if (grub_strchr(path, '*'))
{
grub_printf("image: <%s> [ * ]\n", path);
}
else if (ventoy_is_file_exist("%s%s", isodisk, path))
{ {
grub_printf("image: <%s> [ OK ]\n", path); grub_printf("image: <%s> [ OK ]\n", path);
} }
@ -1223,7 +1235,15 @@ static int ventoy_plugin_injection_check(VTOY_JSON *json, const char *isodisk)
continue; continue;
} }
if (grub_strchr(path, '*'))
{
grub_printf("image: <%s> [*]\n", path);
}
else
{
grub_printf("image: <%s> [%s]\n", path, ventoy_check_file_exist("%s%s", isodisk, path) ? "OK" : "NOT EXIST"); grub_printf("image: <%s> [%s]\n", path, ventoy_check_file_exist("%s%s", isodisk, path) ? "OK" : "NOT EXIST");
}
grub_printf("archive: <%s> [%s]\n\n", archive, ventoy_check_file_exist("%s%s", isodisk, archive) ? "OK" : "NOT EXIST"); grub_printf("archive: <%s> [%s]\n\n", archive, ventoy_check_file_exist("%s%s", isodisk, archive) ? "OK" : "NOT EXIST");
} }
@ -1611,6 +1631,11 @@ static int ventoy_plugin_conf_replace_check(VTOY_JSON *json, const char *isodisk
grub_script_execute_sourcecode("loopback -d vtisocheck"); grub_script_execute_sourcecode("loopback -d vtisocheck");
} }
else if (grub_strchr(isof, '*'))
{
grub_printf("iso:<%s> [*]\n", isof);
grub_printf("org:<%s>\n", orgf);
}
else else
{ {
grub_printf("iso:<%s> [NOT Exist]\n", isof); grub_printf("iso:<%s> [NOT Exist]\n", isof);
@ -1704,7 +1729,11 @@ static int ventoy_plugin_auto_memdisk_check(VTOY_JSON *json, const char *isodisk
{ {
grub_printf("<%s> ", pNode->unData.pcStrVal); grub_printf("<%s> ", pNode->unData.pcStrVal);
if (ventoy_check_file_exist("%s%s", isodisk, pNode->unData.pcStrVal)) if (grub_strchr(pNode->unData.pcStrVal, '*'))
{
grub_printf(" [*]\n");
}
else if (ventoy_check_file_exist("%s%s", isodisk, pNode->unData.pcStrVal))
{ {
grub_printf(" [OK]\n"); grub_printf(" [OK]\n");
} }
@ -1794,7 +1823,11 @@ static int ventoy_plugin_image_list_check(VTOY_JSON *json, const char *isodisk)
{ {
grub_printf("<%s> ", pNode->unData.pcStrVal); grub_printf("<%s> ", pNode->unData.pcStrVal);
if (ventoy_check_file_exist("%s%s", isodisk, pNode->unData.pcStrVal)) if (grub_strchr(pNode->unData.pcStrVal, '*'))
{
grub_printf(" [*]\n");
}
else if (ventoy_check_file_exist("%s%s", isodisk, pNode->unData.pcStrVal))
{ {
grub_printf(" [OK]\n"); grub_printf(" [OK]\n");
} }
@ -1996,7 +2029,7 @@ install_template * ventoy_plugin_find_install_template(const char *isopath)
len = (int)grub_strlen(isopath); len = (int)grub_strlen(isopath);
for (node = g_install_template_head; node; node = node->next) for (node = g_install_template_head; node; node = node->next)
{ {
if (node->pathlen == len && grub_strcmp(node->isopath, isopath) == 0) if (node->pathlen == len && ventoy_strcmp(node->isopath, isopath) == 0)
{ {
return node; return node;
} }
@ -2036,7 +2069,7 @@ persistence_config * ventoy_plugin_find_persistent(const char *isopath)
len = (int)grub_strlen(isopath); len = (int)grub_strlen(isopath);
for (node = g_persistence_head; node; node = node->next) for (node = g_persistence_head; node; node = node->next)
{ {
if ((len == node->pathlen) && (grub_strcmp(node->isopath, isopath) == 0)) if ((len == node->pathlen) && (ventoy_strcmp(node->isopath, isopath) == 0))
{ {
return node; return node;
} }
@ -2117,7 +2150,7 @@ const char * ventoy_plugin_get_injection(const char *isopath)
len = (int)grub_strlen(isopath); len = (int)grub_strlen(isopath);
for (node = g_injection_head; node; node = node->next) for (node = g_injection_head; node; node = node->next)
{ {
if (node->pathlen == len && grub_strcmp(node->isopath, isopath) == 0) if (node->pathlen == len && ventoy_strcmp(node->isopath, isopath) == 0)
{ {
return node->archive; return node->archive;
} }
@ -2140,7 +2173,7 @@ const char * ventoy_plugin_get_menu_alias(int type, const char *isopath)
for (node = g_menu_alias_head; node; node = node->next) for (node = g_menu_alias_head; node; node = node->next)
{ {
if (node->type == type && node->pathlen && if (node->type == type && node->pathlen &&
node->pathlen == len && grub_strcmp(node->isopath, isopath) == 0) node->pathlen == len && ventoy_strcmp(node->isopath, isopath) == 0)
{ {
return node->alias; return node->alias;
} }
@ -2288,7 +2321,7 @@ int ventoy_plugin_check_memdisk(const char *isopath)
len = (int)grub_strlen(isopath); len = (int)grub_strlen(isopath);
for (node = g_auto_memdisk_head; node; node = node->next) for (node = g_auto_memdisk_head; node; node = node->next)
{ {
if (node->pathlen == len && grub_strncmp(isopath, node->isopath, len) == 0) if (node->pathlen == len && ventoy_strncmp(node->isopath, isopath, len) == 0)
{ {
return 1; return 1;
} }
@ -2314,14 +2347,14 @@ int ventoy_plugin_get_image_list_index(int type, const char *name)
{ {
if (vtoy_class_directory == type) if (vtoy_class_directory == type)
{ {
if (len < node->pathlen && grub_strncmp(name, node->isopath, len) == 0) if (len < node->pathlen && ventoy_strncmp(node->isopath, name, len) == 0)
{ {
return index; return index;
} }
} }
else else
{ {
if (len == node->pathlen && grub_strncmp(name, node->isopath, len) == 0) if (len == node->pathlen && ventoy_strncmp(node->isopath, name, len) == 0)
{ {
return index; return index;
} }
@ -2345,7 +2378,7 @@ conf_replace * ventoy_plugin_find_conf_replace(const char *iso)
for (node = g_conf_replace_head; node; node = node->next) for (node = g_conf_replace_head; node; node = node->next)
{ {
if (node->pathlen == len && grub_strncmp(iso, node->isopath, len) == 0) if (node->pathlen == len && ventoy_strncmp(node->isopath, iso, len) == 0)
{ {
return node; return node;
} }
@ -2367,7 +2400,7 @@ dud * ventoy_plugin_find_dud(const char *iso)
len = (int)grub_strlen(iso); len = (int)grub_strlen(iso);
for (node = g_dud_head; node; node = node->next) for (node = g_dud_head; node; node = node->next)
{ {
if (node->pathlen == len && grub_strncmp(iso, node->isopath, len) == 0) if (node->pathlen == len && ventoy_strncmp(node->isopath, iso, len) == 0)
{ {
return node; return node;
} }
@ -2420,7 +2453,7 @@ static const vtoy_password * ventoy_plugin_get_password(const char *isopath)
len = (int)grub_strlen(isopath); len = (int)grub_strlen(isopath);
for (node = g_pwd_head; node; node = node->next) for (node = g_pwd_head; node; node = node->next)
{ {
if (node->pathlen == len && grub_strncmp(isopath, node->isopath, len) == 0) if (node->pathlen == len && ventoy_strncmp(node->isopath, isopath, len) == 0)
{ {
return &(node->password); return &(node->password);
} }