#include #include #include #include #include #include #include #include #include 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(); } }