add support to freebsd

This commit is contained in:
longpanda 2020-07-31 23:08:17 +08:00
parent 036e9cc167
commit d80a008c04
24 changed files with 2662 additions and 15 deletions

View file

@ -1578,6 +1578,7 @@ module = {
name = ventoy;
common = ventoy/ventoy.c;
common = ventoy/ventoy_linux.c;
common = ventoy/ventoy_unix.c;
common = ventoy/ventoy_windows.c;
common = ventoy/ventoy_plugin.c;
common = ventoy/ventoy_json.c;

View file

@ -305,6 +305,18 @@ static grub_err_t ventoy_cmd_break(grub_extcmd_context_t ctxt, int argc, char **
VENTOY_CMD_RETURN(GRUB_ERR_NONE);
}
static grub_err_t ventoy_cmd_strstr(grub_extcmd_context_t ctxt, int argc, char **args)
{
(void)ctxt;
if (argc != 2)
{
return 1;
}
return (grub_strstr(args[0], args[1])) ? 0 : 1;
}
static grub_err_t ventoy_cmd_incr(grub_extcmd_context_t ctxt, int argc, char **args)
{
long value_long = 0;
@ -1389,7 +1401,7 @@ static grub_err_t ventoy_cmd_chosen_img_path(grub_extcmd_context_t ctxt, int arg
VENTOY_CMD_RETURN(GRUB_ERR_NONE);
}
static int ventoy_get_disk_guid(const char *filename, grub_uint8_t *guid)
int ventoy_get_disk_guid(const char *filename, grub_uint8_t *guid)
{
grub_disk_t disk;
char *device_name;
@ -1484,7 +1496,7 @@ int ventoy_has_efi_eltorito(grub_file_t file, grub_uint32_t sector)
return 1;
}
if (buf[i] == 0x91 && buf[i + 1] == 0x00 && x86count == 1)
if ((buf[i] == 0x90 || buf[i] == 0x91) && buf[i + 1] == 0x00 && x86count == 1)
{
debug("0x9100 assume %s efi eltorito offset %d 0x%02x\n", file->name, i, buf[i]);
return 1;
@ -2231,6 +2243,50 @@ static grub_err_t ventoy_cmd_find_bootable_hdd(grub_extcmd_context_t ctxt, int a
return 0;
}
static grub_err_t ventoy_cmd_parse_volume(grub_extcmd_context_t ctxt, int argc, char **args)
{
int len;
grub_file_t file;
char buf[64];
ventoy_iso9660_vd pvd;
(void)ctxt;
(void)argc;
if (argc != 3)
{
return grub_error(GRUB_ERR_BAD_ARGUMENT, "Usage: %s sysid volid \n", cmd_raw_name);
}
file = ventoy_grub_file_open(VENTOY_FILE_TYPE, "%s", args[0]);
if (!file)
{
debug("failed to open file %s\n", args[0]);
return 0;
}
grub_file_seek(file, 16 * 2048);
len = (int)grub_file_read(file, &pvd, sizeof(pvd));
if (len != sizeof(pvd))
{
debug("failed to read pvd %d\n", len);
goto end;
}
grub_memset(buf, 0, sizeof(buf));
grub_memcpy(buf, pvd.sys, sizeof(pvd.sys));
ventoy_set_env(args[1], buf);
grub_memset(buf, 0, sizeof(buf));
grub_memcpy(buf, pvd.vol, sizeof(pvd.vol));
ventoy_set_env(args[2], buf);
end:
grub_file_close(file);
return 0;
}
grub_uint64_t ventoy_grub_get_file_size(const char *fmt, ...)
{
grub_uint64_t size = 0;
@ -2353,6 +2409,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_strstr", ventoy_cmd_strstr, 0, NULL, "", "", NULL },
{ "vt_debug", ventoy_cmd_debug, 0, NULL, "{on|off}", "turn debug on/off", NULL },
{ "vtdebug", ventoy_cmd_debug, 0, NULL, "{on|off}", "turn debug on/off", NULL },
{ "vtbreak", ventoy_cmd_break, 0, NULL, "{level}", "set debug break", NULL },
@ -2410,6 +2467,13 @@ static cmd_para ventoy_cmds[] =
{ "vt_load_plugin", ventoy_cmd_load_plugin, 0, NULL, "", "", NULL },
{ "vt_check_plugin_json", ventoy_cmd_plugin_check_json, 0, NULL, "", "", NULL },
{ "vt_parse_iso_volume", ventoy_cmd_parse_volume, 0, NULL, "", "", NULL },
{ "vt_unix_parse_freebsd_ver", ventoy_cmd_unix_freebsd_ver, 0, NULL, "", "", NULL },
{ "vt_unix_reset", ventoy_cmd_unix_reset, 0, NULL, "", "", NULL },
{ "vt_unix_replace_conf", ventoy_cmd_unix_replace_conf, 0, NULL, "", "", NULL },
{ "vt_unix_replace_ko", ventoy_cmd_unix_replace_ko, 0, NULL, "", "", NULL },
{ "vt_unix_chain_data", ventoy_cmd_unix_chain_data, 0, NULL, "", "", NULL },
};

View file

@ -123,6 +123,16 @@ typedef struct ventoy_udf_override
grub_uint32_t position;
}ventoy_udf_override;
typedef struct ventoy_iso9660_vd
{
grub_uint8_t type;
grub_uint8_t id[5];
grub_uint8_t ver;
grub_uint8_t res;
char sys[32];
char vol[32];
}ventoy_iso9660_vd;
#pragma pack()
#define img_type_iso 0
@ -667,6 +677,24 @@ extern int g_ventoy_iso_uefi_drv;
extern int g_ventoy_case_insensitive;
extern grub_uint8_t g_ventoy_chain_type;
#define ventoy_unix_fill_virt(new_data, new_len) \
{ \
data_secs = (new_len + 2047) / 2048; \
cur->mem_sector_start = sector; \
cur->mem_sector_end = cur->mem_sector_start + data_secs; \
cur->mem_sector_offset = offset; \
cur->remap_sector_start = 0; \
cur->remap_sector_end = 0; \
cur->org_sector_start = 0; \
grub_memcpy(override + offset, new_data, new_len); \
cur++; \
sector += data_secs; \
offset += new_len; \
chain->virt_img_size_in_bytes += data_secs * 2048; \
}
char * ventoy_get_line(char *start);
int ventoy_cmp_img(img_info *img1, img_info *img2);
void ventoy_swap_img(img_info *img1, img_info *img2);
char * ventoy_plugin_get_cur_install_template(const char *isopath);
@ -687,6 +715,12 @@ grub_err_t ventoy_cmd_linux_get_main_initrd_index(grub_extcmd_context_t ctxt, in
grub_err_t ventoy_cmd_collect_wim_patch(grub_extcmd_context_t ctxt, int argc, char **args);
grub_err_t ventoy_cmd_wim_patch_count(grub_extcmd_context_t ctxt, int argc, char **args);
grub_err_t ventoy_cmd_locate_wim_patch(grub_extcmd_context_t ctxt, int argc, char **args);
grub_err_t ventoy_cmd_unix_chain_data(grub_extcmd_context_t ctxt, int argc, char **args);
int ventoy_get_disk_guid(const char *filename, grub_uint8_t *guid);
grub_err_t ventoy_cmd_unix_reset(grub_extcmd_context_t ctxt, int argc, char **args);
grub_err_t ventoy_cmd_unix_replace_conf(grub_extcmd_context_t ctxt, int argc, char **args);
grub_err_t ventoy_cmd_unix_replace_ko(grub_extcmd_context_t ctxt, int argc, char **args);
grub_err_t ventoy_cmd_unix_freebsd_ver(grub_extcmd_context_t ctxt, int argc, char **args);
#endif /* __VENTOY_DEF_H__ */

View file

@ -38,8 +38,7 @@
GRUB_MOD_LICENSE ("GPLv3+");
static char * ventoy_get_line(char *start)
char * ventoy_get_line(char *start)
{
if (start == NULL)
{