Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
dadigang
Ventoy
Commits
1ba23bcd
Commit
1ba23bcd
authored
Oct 21, 2020
by
longpanda
Browse files
add image_list plugin
parent
6630ab35
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
182 additions
and
16 deletions
+182
-16
GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy.c
GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy.c
+59
-15
GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_def.h
GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_def.h
+10
-0
GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_plugin.c
GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_plugin.c
+103
-0
INSTALL/grub/debug.cfg
INSTALL/grub/debug.cfg
+10
-1
No files found.
GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy.c
View file @
1ba23bcd
...
@@ -82,6 +82,8 @@ grub_uint32_t g_ventoy_cpio_size = 0;
...
@@ -82,6 +82,8 @@ grub_uint32_t g_ventoy_cpio_size = 0;
cpio_newc_header
*
g_ventoy_initrd_head
=
NULL
;
cpio_newc_header
*
g_ventoy_initrd_head
=
NULL
;
grub_uint8_t
*
g_ventoy_runtime_buf
=
NULL
;
grub_uint8_t
*
g_ventoy_runtime_buf
=
NULL
;
int
g_plugin_image_list
=
0
;
ventoy_grub_param
*
g_grub_param
=
NULL
;
ventoy_grub_param
*
g_grub_param
=
NULL
;
ventoy_guid
g_ventoy_guid
=
VENTOY_GUID
;
ventoy_guid
g_ventoy_guid
=
VENTOY_GUID
;
...
@@ -1247,7 +1249,16 @@ static int ventoy_colect_img_files(const char *filename, const struct grub_dirho
...
@@ -1247,7 +1249,16 @@ static int ventoy_colect_img_files(const char *filename, const struct grub_dirho
{
{
return
0
;
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
));
img
=
grub_zalloc
(
sizeof
(
img_info
));
if
(
img
)
if
(
img
)
{
{
...
@@ -1411,13 +1422,28 @@ static img_info * ventoy_get_min_iso(img_iterator_node *node)
...
@@ -1411,13 +1422,28 @@ static img_info * ventoy_get_min_iso(img_iterator_node *node)
img_info
*
minimg
=
NULL
;
img_info
*
minimg
=
NULL
;
img_info
*
img
=
(
img_info
*
)(
node
->
firstiso
);
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
)
if
(
minimg
)
...
@@ -1433,13 +1459,28 @@ static img_iterator_node * ventoy_get_min_child(img_iterator_node *node)
...
@@ -1433,13 +1459,28 @@ static img_iterator_node * ventoy_get_min_child(img_iterator_node *node)
img_iterator_node
*
Minchild
=
NULL
;
img_iterator_node
*
Minchild
=
NULL
;
img_iterator_node
*
child
=
node
->
firstchild
;
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
)
if
(
Minchild
)
...
@@ -1823,7 +1864,7 @@ static grub_err_t ventoy_cmd_list_img(grub_extcmd_context_t ctxt, int argc, char
...
@@ -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
]);
grub_snprintf
(
g_iso_path
,
sizeof
(
g_iso_path
),
"%s"
,
args
[
0
]);
strdata
=
ventoy_get_env
(
"VTOY_DEFAULT_SEARCH_ROOT"
);
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
);
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
]
!=
'/'
)
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
...
@@ -1867,14 +1908,17 @@ static grub_err_t ventoy_cmd_list_img(grub_extcmd_context_t ctxt, int argc, char
node
=
tmp
;
node
=
tmp
;
}
}
/* sort image list by image name */
/* sort image list by image name
if image_list is not set in ventoy.json
*/
for
(
cur
=
g_ventoy_img_list
;
cur
;
cur
=
cur
->
nex
t
)
if
(
0
==
g_plugin_image_lis
t
)
{
{
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
);
}
}
}
}
}
}
}
...
...
GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_def.h
View file @
1ba23bcd
...
@@ -778,6 +778,14 @@ typedef struct auto_memdisk
...
@@ -778,6 +778,14 @@ typedef struct auto_memdisk
struct
auto_memdisk
*
next
;
struct
auto_memdisk
*
next
;
}
auto_memdisk
;
}
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_menu_esc
;
extern
int
g_ventoy_suppress_esc
;
extern
int
g_ventoy_suppress_esc
;
extern
int
g_ventoy_last_entry
;
extern
int
g_ventoy_last_entry
;
...
@@ -787,6 +795,7 @@ extern int g_ventoy_iso_uefi_drv;
...
@@ -787,6 +795,7 @@ extern int g_ventoy_iso_uefi_drv;
extern
int
g_ventoy_case_insensitive
;
extern
int
g_ventoy_case_insensitive
;
extern
grub_uint8_t
g_ventoy_chain_type
;
extern
grub_uint8_t
g_ventoy_chain_type
;
extern
int
g_vhdboot_enable
;
extern
int
g_vhdboot_enable
;
extern
int
g_plugin_image_list
;
extern
ventoy_gpt_info
*
g_ventoy_part_info
;
extern
ventoy_gpt_info
*
g_ventoy_part_info
;
#define ventoy_unix_fill_virt(new_data, new_len) \
#define ventoy_unix_fill_virt(new_data, new_len) \
...
@@ -819,6 +828,7 @@ const char * ventoy_plugin_get_injection(const char *isopath);
...
@@ -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_alias
(
int
type
,
const
char
*
isopath
);
const
char
*
ventoy_plugin_get_menu_class
(
int
type
,
const
char
*
name
);
const
char
*
ventoy_plugin_get_menu_class
(
int
type
,
const
char
*
name
);
int
ventoy_plugin_check_memdisk
(
const
char
*
isopath
);
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_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
);
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
);
void
ventoy_plugin_dump_persistence
(
void
);
...
...
GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_plugin.c
View file @
1ba23bcd
...
@@ -46,6 +46,7 @@ static menu_alias *g_menu_alias_head = NULL;
...
@@ -46,6 +46,7 @@ static menu_alias *g_menu_alias_head = NULL;
static
menu_class
*
g_menu_class_head
=
NULL
;
static
menu_class
*
g_menu_class_head
=
NULL
;
static
injection_config
*
g_injection_head
=
NULL
;
static
injection_config
*
g_injection_head
=
NULL
;
static
auto_memdisk
*
g_auto_memdisk_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
)
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
...
@@ -1096,6 +1097,85 @@ static int ventoy_plugin_auto_memdisk_check(VTOY_JSON *json, const char *isodisk
return
0
;
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
[]
=
static
plugin_entry
g_plugin_entries
[]
=
{
{
{
"control"
,
ventoy_plugin_control_entry
,
ventoy_plugin_control_check
},
{
"control"
,
ventoy_plugin_control_entry
,
ventoy_plugin_control_check
},
...
@@ -1106,6 +1186,7 @@ static plugin_entry g_plugin_entries[] =
...
@@ -1106,6 +1186,7 @@ static plugin_entry g_plugin_entries[] =
{
"menu_class"
,
ventoy_plugin_menuclass_entry
,
ventoy_plugin_menuclass_check
},
{
"menu_class"
,
ventoy_plugin_menuclass_entry
,
ventoy_plugin_menuclass_check
},
{
"injection"
,
ventoy_plugin_injection_entry
,
ventoy_plugin_injection_check
},
{
"injection"
,
ventoy_plugin_injection_entry
,
ventoy_plugin_injection_check
},
{
"auto_memdisk"
,
ventoy_plugin_auto_memdisk_entry
,
ventoy_plugin_auto_memdisk_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
)
static
int
ventoy_parse_plugin_config
(
VTOY_JSON
*
json
,
const
char
*
isodisk
)
...
@@ -1472,6 +1553,28 @@ int ventoy_plugin_check_memdisk(const char *isopath)
...
@@ -1472,6 +1553,28 @@ int ventoy_plugin_check_memdisk(const char *isopath)
return
0
;
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
)
grub_err_t
ventoy_cmd_plugin_check_json
(
grub_extcmd_context_t
ctxt
,
int
argc
,
char
**
args
)
{
{
int
i
=
0
;
int
i
=
0
;
...
...
INSTALL/grub/debug.cfg
View file @
1ba23bcd
...
@@ -74,7 +74,16 @@ submenu 'Check plugin json configuration (ventoy.json)' --class=debug_json {
...
@@ -74,7 +74,16 @@ submenu 'Check plugin json configuration (ventoy.json)' --class=debug_json {
echo -e "\npress ENTER to exit ..."
echo -e "\npress ENTER to exit ..."
read vtInputKey
read vtInputKey
unset pager
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 {
menuentry 'Return to previous menu [Esc]' --class=vtoyret VTOY_RET {
echo 'Return ...'
echo 'Return ...'
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment