diff --git a/src/server/telnet_server.c b/src/server/telnet_server.c index 971a95c3a..e84d0454b 100644 --- a/src/server/telnet_server.c +++ b/src/server/telnet_server.c @@ -50,7 +50,6 @@ static char *negotiate = #define CTRL(c) (c - '@') - /* The only way we can detect that the socket is closed is the first time * we write to it, we will fail. Subsequent write operations will * succeed. Shudder! @@ -61,15 +60,14 @@ int telnet_write(connection_t *connection, void *data, int len) if (t_con->closed) return ERROR_SERVER_REMOTE_CLOSED; - if (write_socket(connection->fd, data, len)==len) + if (write_socket(connection->fd, data, len) == len) { return ERROR_OK; } - t_con->closed=1; + t_con->closed = 1; return ERROR_SERVER_REMOTE_CLOSED; } - int telnet_prompt(connection_t *connection) { telnet_connection_t *t_con = connection->priv; @@ -83,7 +81,6 @@ int telnet_outputline(connection_t *connection, char* line) return telnet_write(connection, "\r\n\0", 3); } - int telnet_output(struct command_context_s *cmd_ctx, char* line) { connection_t *connection = cmd_ctx->output_handler_priv; @@ -95,8 +92,8 @@ void telnet_log_callback(void *priv, const char *file, int line, const char *function, const char *format, va_list args) { connection_t *connection = priv; - char *t=allocPrintf(format, args); - if (t==NULL) + char *t = allocPrintf(format, args); + if (t == NULL) return; telnet_outputline(connection, t); @@ -104,10 +101,11 @@ void telnet_log_callback(void *priv, const char *file, int line, free(t); } - int telnet_target_callback_event_handler(struct target_s *target, enum target_event event, void *priv) { struct command_context_s *cmd_ctx = priv; + connection_t *connection = cmd_ctx->output_handler_priv; + telnet_connection_t *t_con = connection->priv; char buffer[512]; switch (event) @@ -117,9 +115,13 @@ int telnet_target_callback_event_handler(struct target_s *target, enum target_ev target->type->arch_state(target, buffer, 512); buffer[511] = 0; command_print(cmd_ctx, "%s", buffer); + if (!t_con->suppress_prompt) + telnet_prompt(connection); break; case TARGET_EVENT_RESUMED: command_print(cmd_ctx, "Target %i resumed", get_num_by_target(target)); + if (!t_con->suppress_prompt) + telnet_prompt(connection); break; default: break; @@ -142,6 +144,7 @@ int telnet_new_connection(connection_t *connection) telnet_connection->line_cursor = 0; telnet_connection->option_size = 0; telnet_connection->prompt = strdup("> "); + telnet_connection->suppress_prompt = 0; telnet_connection->state = TELNET_STATE_DATA; /* output goes through telnet connection */ @@ -284,6 +287,7 @@ int telnet_input(connection_t *connection) } log_setCallback(telnet_log_callback, connection); + t_con->suppress_prompt = 1; if ((retval = command_run_line(command_context, t_con->line)) != ERROR_OK) { @@ -292,7 +296,9 @@ int telnet_input(connection_t *connection) return ERROR_SERVER_REMOTE_CLOSED; } } - + + t_con->suppress_prompt = 0; + /* Save only non-blank lines in the history */ if (t_con->line_size > 0) { @@ -318,8 +324,8 @@ int telnet_input(connection_t *connection) t_con->history[t_con->current_history] = strdup(""); } - int t=telnet_prompt(connection); - if (t==ERROR_SERVER_REMOTE_CLOSED) + int t = telnet_prompt(connection); + if (t == ERROR_SERVER_REMOTE_CLOSED) return t; t_con->line_size = 0; diff --git a/src/server/telnet_server.h b/src/server/telnet_server.h index 83579f9d0..17e607266 100644 --- a/src/server/telnet_server.h +++ b/src/server/telnet_server.h @@ -44,6 +44,7 @@ enum telnet_states typedef struct telnet_connection_s { char *prompt; + int suppress_prompt; enum telnet_states state; char line[TELNET_LINE_MAX_SIZE]; int line_size;