100 lines
2.8 KiB
C
100 lines
2.8 KiB
C
#include <cmdline_parser.h>
|
|
#include <fs_types.h>
|
|
#include <malloc.h>
|
|
#include <mprintf.h>
|
|
#include <status.h>
|
|
#include <str_status.h>
|
|
#include <string.h>
|
|
#include <system.h>
|
|
#include <volume_info.h>
|
|
|
|
static bool cmdline_eject = false;
|
|
static char cmdline_dev[CMDLINE_OPT_VALUE_MAX];
|
|
static bool cmdline_list = false;
|
|
static char cmdline_volkey[CMDLINE_OPT_VALUE_MAX];
|
|
static bool cmdline_make = false;
|
|
static char cmdline_fstype[CMDLINE_OPT_VALUE_MAX];
|
|
|
|
static struct cmdline_opt cmdline_opts[] = {
|
|
CMDLINE_OPT("d", "device", CMDLINE_OPT_VALUE_STRING, false, (char*)cmdline_dev),
|
|
CMDLINE_OPT("e", "eject", CMDLINE_OPT_VALUE_BOOL, false, &cmdline_eject),
|
|
CMDLINE_OPT("l", "list", CMDLINE_OPT_VALUE_BOOL, false, &cmdline_list),
|
|
CMDLINE_OPT("m", "make", CMDLINE_OPT_VALUE_BOOL, false, &cmdline_make),
|
|
CMDLINE_OPT("k", "key", CMDLINE_OPT_VALUE_STRING, false, (char*)cmdline_volkey),
|
|
CMDLINE_OPT("fs", "filesystem", CMDLINE_OPT_VALUE_STRING, false, (char*)cmdline_fstype),
|
|
CMDLINE_END(),
|
|
};
|
|
|
|
static void eject(void) {
|
|
struct volume_info* volume_infos = malloc(sizeof(*volume_infos) * 100);
|
|
memset(volume_infos, 0, sizeof(*volume_infos) * 100);
|
|
|
|
size_t count = get_volume_info(volume_infos, 100);
|
|
|
|
for (size_t i = 0; i < count; i++) {
|
|
struct volume_info* info = &volume_infos[i];
|
|
|
|
if (strcmp(info->device_key, cmdline_dev) == 0) {
|
|
int ret = volume_delete(info->volume_name);
|
|
mprintf("Deleted volume %s: %s\n", info->volume_name, str_status[ret < 0 ? -ret : ret]);
|
|
break;
|
|
}
|
|
}
|
|
|
|
free(volume_infos);
|
|
}
|
|
|
|
static void list(void) {
|
|
struct volume_info* volume_infos = malloc(sizeof(*volume_infos) * 100);
|
|
memset(volume_infos, 0, sizeof(*volume_infos) * 100);
|
|
|
|
size_t count = get_volume_info(volume_infos, 100);
|
|
|
|
mprintf("%-40s %-40s\n", "VOLUME", "DEVICE");
|
|
|
|
for (size_t i = 0; i < count; i++) {
|
|
struct volume_info* info = &volume_infos[i];
|
|
|
|
mprintf("%-40s %-40s\n", info->volume_name, info->device_key);
|
|
}
|
|
|
|
free(volume_infos);
|
|
}
|
|
|
|
static void make(void) {
|
|
int fs_type;
|
|
|
|
if (strcmp(cmdline_fstype, "tar") == 0) {
|
|
fs_type = FS_TARFS;
|
|
} else if (strcmp(cmdline_fstype, "fat16") == 0) {
|
|
fs_type = FS_FAT16;
|
|
} else if (strcmp(cmdline_fstype, "fat32") == 0) {
|
|
fs_type = FS_FAT32;
|
|
} else if (strcmp(cmdline_fstype, "iso9660") == 0) {
|
|
fs_type = FS_ISO9660;
|
|
} else {
|
|
mprintf("ERROR Unknown filesystem '%s'\n", cmdline_fstype);
|
|
return;
|
|
}
|
|
|
|
int ret = create_volume(cmdline_volkey, fs_type, cmdline_dev);
|
|
|
|
if (ret < 0)
|
|
mprintf("ERROR Could not create volume: %s\n", str_status[-ret]);
|
|
}
|
|
|
|
void app_main(void) {
|
|
if (cmdline_parse(get_cmdline(), cmdline_opts) < 0) {
|
|
mprintf("Failed to parse commandline arguments\n");
|
|
return;
|
|
}
|
|
|
|
if (cmdline_eject) {
|
|
eject();
|
|
} else if (cmdline_list) {
|
|
list();
|
|
} else if (cmdline_make) {
|
|
make();
|
|
}
|
|
}
|