+grub_err_t ventoy_cmd_unix_replace_grub_conf(grub_extcmd_context_t ctxt, int argc, char **args)
+{
+ int len;
+ grub_uint32_t i;
+ char *data;
+ char *pos;
+ grub_uint64_t offset;
+ grub_file_t file;
+ char extcfg[256];
+ const char *confile = NULL;
+ const char * loader_conf[] =
+ {
+ "/boot/grub/grub.cfg",
+ };
+
+ (void)ctxt;
+
+ if (argc != 1 && argc != 2)
+ {
+ debug("Replace conf invalid argc %d\n", argc);
+ return 1;
+ }
+
+ for (i = 0; i < sizeof(loader_conf) / sizeof(loader_conf[0]); i++)
+ {
+ if (ventoy_get_file_override(loader_conf[i], &offset) == 0)
+ {
+ confile = loader_conf[i];
+ g_conf_override_offset = offset;
+ break;
+ }
+ }
+
+ if (confile == NULL)
+ {
+ debug("Can't find grub.cfg file from %u locations\n", i);
+ return 1;
+ }
+
+ file = ventoy_grub_file_open(GRUB_FILE_TYPE_LINUX_INITRD, "(loop)/%s", confile);
+ if (!file)
+ {
+ debug("Failed to open %s \n", confile);
+ return 1;
+ }
+
+ debug("old grub2 conf file size:%d\n", (int)file->size);
+
+ data = grub_malloc(VTOY_MAX_SCRIPT_BUF);
+ if (!data)
+ {
+ grub_file_close(file);
+ return 1;
+ }
+
+ grub_file_read(file, data, file->size);
+ grub_file_close(file);
+
+ g_conf_new_data = data;
+ g_conf_new_len = (int)file->size;
+
+ pos = grub_strstr(data, "kfreebsd /boot/kernel/kernel");
+ if (pos)
+ {
+ pos += grub_strlen("kfreebsd /boot/kernel/kernel");
+
+ if (argc == 2)
+ {
+ len = grub_snprintf(extcfg, sizeof(extcfg),
+ ";kfreebsd_module_elf %s; set kFreeBSD.hint.ventoy.0.alias=\"%s\"",
+ args[0], args[1]);
+ }
+ else
+ {
+ len = grub_snprintf(extcfg, sizeof(extcfg), ";kfreebsd_module_elf %s", args[0]);
+ }
+
+ grub_memmove(pos + len, pos, (int)(file->size - (pos - data)));
+ grub_memcpy(pos, extcfg, len);
+ g_conf_new_len += len;
+ }
+ else
+ {
+ debug("no kfreebsd found\n");
+ }
+
+ VENTOY_CMD_RETURN(GRUB_ERR_NONE);
+}
+