Parse commandline strings, move away from old env vars
All checks were successful
Build ISO image / build-and-deploy (push) Successful in 2m6s
Build documentation / build-and-deploy (push) Successful in 1m18s

This commit is contained in:
2026-04-28 22:45:31 +02:00
parent 9fbe23024c
commit fbf067d418
15 changed files with 265 additions and 185 deletions

View File

@@ -1,4 +1,5 @@
#include "limine-bios-hdd.h"
#include <cmdline_parser.h>
#include <devices.h>
#include <endianess.h>
#include <fs_types.h>
@@ -14,6 +15,26 @@
#include <tcursor.h>
#include <tscreen.h>
static bool cmdline_part_dos = false;
static bool cmdline_list_part_dos = false;
static bool cmdline_format_fat32 = false;
static bool cmdline_format_fat16 = false;
static bool cmdline_install_limine_stage2 = false;
static bool cmdline_part_rescan = false;
static char cmdline_dev[CMDLINE_OPT_VALUE_MAX];
static struct cmdline_opt cmdline_opts[] = {
CMDLINE_OPT("pd", "part-dos", CMDLINE_OPT_VALUE_BOOL, false, &cmdline_part_dos),
CMDLINE_OPT("lpd", "list-part-dos", CMDLINE_OPT_VALUE_BOOL, false, &cmdline_list_part_dos),
CMDLINE_OPT("ff32", "format-fat32", CMDLINE_OPT_VALUE_BOOL, false, &cmdline_format_fat32),
CMDLINE_OPT("ff16", "format-fat16", CMDLINE_OPT_VALUE_BOOL, false, &cmdline_format_fat16),
CMDLINE_OPT("ils2", "install-limine-stage2", CMDLINE_OPT_VALUE_BOOL, false,
&cmdline_install_limine_stage2),
CMDLINE_OPT("pr", "part-rescan", CMDLINE_OPT_VALUE_BOOL, false, &cmdline_part_rescan),
CMDLINE_OPT("d", "device", CMDLINE_OPT_VALUE_STRING, true, (char*)cmdline_dev),
CMDLINE_END(),
};
struct dos_pte {
uint8_t drive_attrs;
uint8_t chs_start_addr[3];
@@ -245,69 +266,25 @@ static void install_limine_stage2(const char* dev_name) {
}
void app_main(void) {
char commandbuf[32];
memset(commandbuf, 0, sizeof(commandbuf));
char devnamebuf[64];
memset(devnamebuf, 0, sizeof(devnamebuf));
if (env_get(process_get_pgid(), "help", (void*)commandbuf, sizeof(commandbuf)) == ST_OK) {
mprintf("sdutil -C command -dev device_key\n");
mprintf("commands: part_dos, list_part_dos, format_fat32, format_fat16\n");
mprintf(" install_limine_stage2, partition_rescan\n");
if (cmdline_parse(get_cmdline(), cmdline_opts) < 0) {
mprintf("Failed to parse commandline arguments\n");
return;
}
if (env_get(process_get_pgid(), "C", (void*)commandbuf, sizeof(commandbuf)) != ST_OK) {
mprintf("ERROR C=???. No command provided\n");
return;
}
if (strcmp(commandbuf, "part_dos") == 0) {
if (env_get(process_get_pgid(), "dev", (void*)devnamebuf, sizeof(devnamebuf)) != ST_OK) {
mprintf("ERROR dev=???. No device name provided for part_dos\n");
return;
}
start_part_dos(devnamebuf);
} else if (strcmp(commandbuf, "list_part_dos") == 0) {
if (env_get(process_get_pgid(), "dev", (void*)devnamebuf, sizeof(devnamebuf)) != ST_OK) {
mprintf("ERROR dev=???. No device name provided for list_part_dos\n");
return;
}
list_part_dos(devnamebuf);
} else if (strcmp(commandbuf, "format_fat32") == 0) {
if (env_get(process_get_pgid(), "dev", (void*)devnamebuf, sizeof(devnamebuf)) != ST_OK) {
mprintf("ERROR dev=???. No device name provided for format_fat32\n");
return;
}
format_fat32(devnamebuf);
} else if (strcmp(commandbuf, "format_fat16") == 0) {
if (env_get(process_get_pgid(), "dev", (void*)devnamebuf, sizeof(devnamebuf)) != ST_OK) {
mprintf("ERROR dev=???. No device name provided for format_fat16\n");
return;
}
format_fat16(devnamebuf);
} else if (strcmp(commandbuf, "install_limine_stage2") == 0) {
if (env_get(process_get_pgid(), "dev", (void*)devnamebuf, sizeof(devnamebuf)) != ST_OK) {
mprintf("ERROR dev=???. No device name provided for install_limine_stage2\n");
return;
}
install_limine_stage2(devnamebuf);
} else if (strcmp(commandbuf, "partition_rescan") == 0) {
if (env_get(process_get_pgid(), "dev", (void*)devnamebuf, sizeof(devnamebuf)) != ST_OK) {
mprintf("ERROR dev=???. No device name provided for partition_rescan\n");
return;
}
if (cmdline_part_dos) {
start_part_dos(cmdline_dev);
} else if (cmdline_list_part_dos) {
list_part_dos(cmdline_dev);
} else if (cmdline_format_fat32) {
format_fat32(cmdline_dev);
} else if (cmdline_format_fat16) {
format_fat16(cmdline_dev);
} else if (cmdline_install_limine_stage2) {
install_limine_stage2(cmdline_dev);
} else if (cmdline_part_rescan) {
mprintf("WARNING Make sure all filesystems were unmounted from this device.\n");
mprintf("Otherwise a rescan may result in broken filesystems and crashes!\n");
device_do(devnamebuf, XDRV_PARTITION_RESCAN, NULL, NULL, NULL, NULL);
} else {
mprintf("ERROR C=%s. Unknown command\n", commandbuf);
device_do(cmdline_dev, XDRV_PARTITION_RESCAN, NULL, NULL, NULL, NULL);
}
}