void cli_err(struct cli_state *s, const char *pfx, const char *format, ...) { va_list arg_list; char lbuf[81]; char *err; int ret; memset(lbuf, 0, sizeof(lbuf)); /* If we're in a script, we can provide line number info */ if (!s->exec_from_cmdline && cli_script_loaded(s->scripts)) { ret = snprintf(lbuf, sizeof(lbuf), " (%s:%d)", cli_script_file_name(s->scripts), cli_script_line(s->scripts)); if(ret < 0) { lbuf[0] = '\0'; } else if(((size_t)ret) >= sizeof(lbuf)) { lbuf[sizeof(lbuf)-1] = '\0'; } } /* +7 --> 2 newlines, 4 chars padding, NUL terminator */ err = calloc(strlen(lbuf) + strlen(pfx) + strlen(format) + 7, 1); if (err) { strcat(err, "\n "); strcat(err, pfx); strcat(err, lbuf); strcat(err, ": "); strcat(err, format); strcat(err, "\n"); va_start(arg_list, format); vfprintf(stderr, err, arg_list); va_end(arg_list); free(err); } else { /* Just do the best we can if a memory allocation error occurs */ fprintf(stderr, "\nYikes! Multiple errors occurred!\n"); } }
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; }