Parse commandline strings, move away from old env vars
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user