int main(int argc, char *argv[]) { int status = 0; struct rc_config rc; struct cli_state *state; bool exit_immediately = false; /* If no actions are specified, just show the usage text and exit */ if (argc == 1) { usage(argv[0]); return 0; } init_rc_config(&rc); if (get_rc_config(argc, argv, &rc)) { return 1; } state = cli_state_create(); if (!state) { fprintf(stderr, "Failed to create state object\n"); return 1; } bladerf_log_set_verbosity(rc.verbosity); if (rc.show_help) { usage(argv[0]); exit_immediately = true; } else if (rc.show_version) { printf(BLADERF_CLI_VERSION "\n"); exit_immediately = true; } else if (rc.show_lib_version) { struct bladerf_version version; bladerf_version(&version); printf("%s\n", version.describe); exit_immediately = true; } else if (rc.probe) { status = cmd_handle(state, "probe"); exit_immediately = true; } if (!exit_immediately) { /* Conditionally performed items, depending on runtime config */ status = open_device(&rc, state, status); if (status) { fprintf(stderr, "Could not open device\n"); goto main__issues ; } status = flash_fw(&rc, state, status); if (status) { fprintf(stderr, "Could not flash firmware\n"); goto main__issues ; } status = flash_fpga(&rc, state, status); if (status) { fprintf(stderr, "Could not flash fpga\n"); goto main__issues ; } status = load_fpga(&rc, state, status); if (status) { fprintf(stderr, "Could not load fpga\n"); goto main__issues ; } status = open_script(&rc, state, status); if (status) { fprintf(stderr, "Could not load scripts\n"); goto main__issues ; } main__issues: /* These items are no longer needed */ free(rc.device); rc.device = NULL; free(rc.fw_file); rc.fw_file = NULL; free(rc.fpga_file); rc.fpga_file = NULL; free(rc.script_file); rc.script_file = NULL; /* Drop into interactive mode or begin executing commands * from a script. If we're not requested to do either, exit cleanly */ if (rc.interactive_mode || state->script != NULL) { status = interactive(state, !rc.interactive_mode); } } cli_state_destroy(state); return status; }
int main(int argc, char *argv[]) { int status = 0; struct rc_config rc; struct cli_state *state; bool exit_immediately = false; struct str_queue exec_list; /* If no actions are specified, just show the usage text and exit */ if (argc == 1) { usage(argv[0]); return 0; } str_queue_init(&exec_list); init_rc_config(&rc); if (get_rc_config(argc, argv, &rc, &exec_list)) { return 1; } state = cli_state_create(); if (!state) { fprintf(stderr, "Failed to create state object\n"); return 1; } state->exec_list = &exec_list; bladerf_log_set_verbosity(rc.verbosity); if (rc.show_help) { usage(argv[0]); exit_immediately = true; } else if (rc.show_help_interactive) { printf("Interactive Commands:\n\n"); cmd_show_help_all(); exit_immediately = true; } else if (rc.show_version) { printf(BLADERF_CLI_VERSION "\n"); exit_immediately = true; } else if (rc.show_lib_version) { struct bladerf_version version; bladerf_version(&version); printf("%s\n", version.describe); exit_immediately = true; } else if (rc.probe) { status = cmd_handle(state, "probe strict"); exit_immediately = true; } if (!exit_immediately) { check_for_bootloader_devs(); /* Conditionally performed items, depending on runtime config */ status = open_device(&rc, state, status); if (status) { goto main_issues; } status = flash_fw(&rc, state, status); if (status) { goto main_issues; } status = flash_fpga(&rc, state, status); if (status) { goto main_issues; } status = load_fpga(&rc, state, status); if (status) { goto main_issues; } if (rc.script_file) { status = cli_open_script(&state->scripts, rc.script_file); if (status != 0) { fprintf(stderr, "Failed to open script file \"%s\": %s\n", rc.script_file, strerror(-status)); goto main_issues; } } /* Drop into interactive mode or begin executing commands from a a * command-line list or a script. If we're not requested to do either, * exit cleanly */ if (!str_queue_empty(&exec_list) || rc.interactive_mode || cli_script_loaded(state->scripts)) { status = cli_start_tasks(state); if (status == 0) { status = input_loop(state, rc.interactive_mode); } } } main_issues: cli_state_destroy(state); str_queue_deinit(&exec_list); deinit_rc_config(&rc); return status; }