/** * Parse GDB transport name * * @v text Text * @ret trans GDB transport * @ret rc Return status code */ static int parse_gdb_transport ( const char *text, struct gdb_transport **trans ) { /* Sanity check */ assert ( text != NULL ); /* Find transport */ *trans = find_gdb_transport ( text ); if ( ! *trans ) { printf ( "\"%s\": no such transport (is it compiled in?)\n", text ); return -ENOTSUP; } return 0; }
/** * The "gdbstub" command * * @v argc Argument count * @v argv Argument list * @ret rc Exit code */ static int gdbstub_exec ( int argc, char **argv ) { static struct option longopts[] = { { "help", 0, NULL, 'h' }, { NULL, 0, NULL, 0 }, }; const char *trans_name; struct gdb_transport *trans; int c; /* Parse options */ while ( ( c = getopt_long ( argc, argv, "h", longopts, NULL ) ) >= 0 ){ switch ( c ) { case 'h': /* Display help text */ default: /* Unrecognised/invalid option */ gdbstub_syntax ( argv ); return 1; } } /* At least one argument */ if ( optind == argc ) { gdbstub_syntax ( argv ); return 1; } trans_name = argv[optind++]; /* Initialise transport */ trans = find_gdb_transport ( trans_name ); if ( !trans ) { printf ( "%s: no such transport (is it compiled in?)\n", trans_name ); return 1; } if ( trans->init ) { if ( trans->init ( argc - optind, &argv[optind] ) != 0 ) { return 1; } } /* Enter GDB stub */ gdbstub_start ( trans ); return 0; }