Add support for boot conf replace for distro which use systemd-boot in UEFI mode.

(#1170)
This commit is contained in:
longpanda
2021-10-23 23:15:25 +08:00
parent 154bbc6e5f
commit 836e1aa11e
9 changed files with 181 additions and 25 deletions

View File

@@ -2946,6 +2946,7 @@ static grub_err_t ventoy_cmd_img_sector(grub_extcmd_context_t ctxt, int argc, ch
}
grub_memset(&g_grub_param->file_replace, 0, sizeof(g_grub_param->file_replace));
grub_memset(&g_grub_param->img_replace, 0, sizeof(g_grub_param->img_replace));
VENTOY_CMD_RETURN(GRUB_ERR_NONE);
}
@@ -2977,15 +2978,21 @@ static grub_err_t ventoy_select_conf_replace(grub_extcmd_context_t ctxt, int arg
debug("Find conf replace for %s\n", args[1]);
file = ventoy_grub_file_open(VENTOY_FILE_TYPE, "(loop)%s", node->orgconf);
if (!file)
if (file)
{
offset = grub_iso9660_get_last_file_dirent_pos(file);
grub_file_close(file);
}
else if (node->img > 0)
{
offset = 0;
}
else
{
debug("<(loop)%s> NOT exist\n", node->orgconf);
goto end;
}
offset = grub_iso9660_get_last_file_dirent_pos(file);
grub_file_close(file);
file = ventoy_grub_file_open(VENTOY_FILE_TYPE, "%s%s", args[0], node->newconf);
if (!file)
{
@@ -3008,6 +3015,13 @@ static grub_err_t ventoy_select_conf_replace(grub_extcmd_context_t ctxt, int arg
g_conf_replace_node = node;
g_conf_replace_offset = offset + 2;
if (node->img > 0)
{
g_grub_param->img_replace.magic = GRUB_IMG_REPLACE_MAGIC;
g_grub_param->img_replace.old_name_cnt = 1;
grub_snprintf(g_grub_param->img_replace.old_file_name[0], 256, "%s", node->orgconf);
}
debug("conf_replace OK: newlen: %d\n", g_conf_replace_new_len);
end:

View File

@@ -925,6 +925,7 @@ typedef struct custom_boot
typedef struct conf_replace
{
int pathlen;
int img;
char isopath[256];
char orgconf[256];
char newconf[256];
@@ -1109,5 +1110,7 @@ int ventoy_chain_file_read(const char *path, int offset, int len, void *buf);
#define ret_goto_end(a) ret = a; goto end;
extern ventoy_grub_param *g_grub_param;
#endif /* __VENTOY_DEF_H__ */

View File

@@ -691,6 +691,7 @@ static grub_uint32_t ventoy_linux_get_virt_chunk_size(void)
static void ventoy_linux_fill_virt_data( grub_uint64_t isosize, ventoy_chain_head *chain)
{
int id = 0;
int virtid = 0;
initrd_info *node;
grub_uint64_t sector;
grub_uint32_t offset;
@@ -738,6 +739,7 @@ static void ventoy_linux_fill_virt_data( grub_uint64_t isosize, ventoy_chain_
offset += g_ventoy_cpio_size;
sector += cpio_secs + initrd_secs;
cur++;
virtid++;
}
/* Lenovo EasyStartup need an addional sector for boundary check */
@@ -759,6 +761,7 @@ static void ventoy_linux_fill_virt_data( grub_uint64_t isosize, ventoy_chain_
offset += VTOY_APPEND_EXT_SIZE;
sector += cpio_secs;
cur++;
virtid++;
}
if (g_conf_replace_offset > 0)
@@ -776,9 +779,15 @@ static void ventoy_linux_fill_virt_data( grub_uint64_t isosize, ventoy_chain_
chain->virt_img_size_in_bytes += g_conf_replace_new_len_align;
if (g_grub_param->img_replace.magic == GRUB_IMG_REPLACE_MAGIC)
{
g_grub_param->img_replace.new_file_virtual_id = virtid;
}
offset += g_conf_replace_new_len_align;
sector += cpio_secs;
cur++;
virtid++;
}
return;

View File

@@ -2005,6 +2005,7 @@ static int ventoy_plugin_custom_boot_check(VTOY_JSON *json, const char *isodisk)
static int ventoy_plugin_conf_replace_entry(VTOY_JSON *json, const char *isodisk)
{
int img = 0;
const char *isof = NULL;
const char *orgf = NULL;
const char *newf = NULL;
@@ -2042,6 +2043,11 @@ static int ventoy_plugin_conf_replace_entry(VTOY_JSON *json, const char *isodisk
node = grub_zalloc(sizeof(conf_replace));
if (node)
{
if (JSON_SUCCESS == vtoy_json_get_int(pNode->pstChild, "img", &img))
{
node->img = img;
}
node->pathlen = grub_snprintf(node->isopath, sizeof(node->isopath), "%s", isof);
grub_snprintf(node->orgconf, sizeof(node->orgconf), "%s", orgf);
grub_snprintf(node->newconf, sizeof(node->newconf), "%s", newf);
@@ -2064,6 +2070,7 @@ static int ventoy_plugin_conf_replace_entry(VTOY_JSON *json, const char *isodisk
static int ventoy_plugin_conf_replace_check(VTOY_JSON *json, const char *isodisk)
{
int img = 0;
const char *isof = NULL;
const char *orgf = NULL;
const char *newf = NULL;
@@ -2133,7 +2140,7 @@ static int ventoy_plugin_conf_replace_check(VTOY_JSON *json, const char *isodisk
}
else
{
grub_printf("new:<%s> [OK]\n", newf);
grub_printf("new1:<%s> [OK]\n", newf);
}
grub_file_close(file);
}
@@ -2141,6 +2148,12 @@ static int ventoy_plugin_conf_replace_check(VTOY_JSON *json, const char *isodisk
{
grub_printf("new:<%s> [NOT Exist]\n", newf);
}
if (JSON_SUCCESS == vtoy_json_get_int(pNode->pstChild, "img", &img))
{
grub_printf("img:<%d>\n", img);
}
grub_printf("\n");
}
}

View File

@@ -242,6 +242,7 @@ typedef struct ventoy_img_chunk_list
#pragma pack(1)
#define GRUB_FILE_REPLACE_MAGIC 0x1258BEEF
#define GRUB_IMG_REPLACE_MAGIC 0x1259BEEF
typedef const char * (*grub_env_get_pf)(const char *name);
typedef int (*grub_env_set_pf)(const char *name, const char *val);
@@ -260,6 +261,7 @@ typedef struct ventoy_grub_param
grub_env_get_pf grub_env_get;
grub_env_set_pf grub_env_set;
ventoy_grub_param_file_replace file_replace;
ventoy_grub_param_file_replace img_replace;
grub_env_printf_pf grub_env_printf;
}ventoy_grub_param;