#include "context.h" #include "event.h" #include "repl.h" #include #include #include #include #include static struct debug_context ctx = {0}; enum { CMD_ROOT, OPT_REMOTE, OPT_REMOTE_ADDRESS, OPT_REMOTE_PORT, }; static void on_event(struct debug_context *ctx, struct packet *packet) { event_handle(ctx, packet); } static int mxdbg( const fx_command *self, const fx_arglist *opt, const fx_array *args) { debug_context_init(&ctx); ctx.ctx_on_event = on_event; char *ep = NULL; const char *ip_address = NULL; const char *port_cstr = NULL; fx_arglist_get_string( opt, OPT_REMOTE, OPT_REMOTE_ADDRESS, 0, &ip_address); fx_arglist_get_string(opt, OPT_REMOTE, OPT_REMOTE_PORT, 0, &port_cstr); int err = 0; if (ip_address && port_cstr) { long port = strtol(port_cstr, &ep, 10); if (*ep) { fprintf(stderr, "'%s' is not a valid port number.\n", port_cstr); return -1; } printf("connecting to %s:%ld...\n", ip_address, port); err = debug_context_connect_net(&ctx, ip_address, port); } else { printf("no target specified\n"); return 0; } if (err != 0) { printf("connection failed\n"); return err; } debug_context_start_threads(&ctx); err = repl(&ctx); debug_context_cleanup(&ctx); return err; } FX_COMMAND(CMD_ROOT, FX_COMMAND_INVALID_ID) { FX_COMMAND_NAME("mxdbg"); FX_COMMAND_DESC("Magenta kernel debugger."); FX_COMMAND_FLAGS(FX_COMMAND_SHOW_HELP_BY_DEFAULT); FX_COMMAND_FUNCTION(mxdbg); FX_COMMAND_OPTION(OPT_REMOTE) { FX_OPTION_LONG_NAME("remote"); FX_OPTION_SHORT_NAME('r'); FX_OPTION_DESC("The TCP/IP address and port to connect to."); FX_OPTION_ARG(OPT_REMOTE_ADDRESS) { FX_ARG_NAME("ip-address"); FX_ARG_NR_VALUES(1); } FX_OPTION_ARG(OPT_REMOTE_PORT) { FX_ARG_NAME("port"); FX_ARG_NR_VALUES(1); } } } int main(int argc, const char **argv) { return fx_command_dispatch(CMD_ROOT, argc, argv); }