X-Git-Url: https://review.openocd.org/gitweb?p=openocd.git;a=blobdiff_plain;f=src%2Fserver%2Ftelnet_server.c;h=1a9077983335ba172c44a51f034695c174086f96;hp=e84d0454b0c2b0b21ce47c21983e80082422d3a4;hb=fad239c1db7e1f63fb0e9dbbe87502649f4457ae;hpb=b02d64a1bff5bbbb56c3119e336e1530888c04bd diff --git a/src/server/telnet_server.c b/src/server/telnet_server.c index e84d0454b0..1a90779833 100644 --- a/src/server/telnet_server.c +++ b/src/server/telnet_server.c @@ -54,7 +54,7 @@ static char *negotiate = * we write to it, we will fail. Subsequent write operations will * succeed. Shudder! */ -int telnet_write(connection_t *connection, void *data, int len) +int telnet_write(connection_t *connection, const void *data, int len) { telnet_connection_t *t_con = connection->priv; if (t_con->closed) @@ -75,10 +75,32 @@ int telnet_prompt(connection_t *connection) return telnet_write(connection, t_con->prompt, strlen(t_con->prompt)); } -int telnet_outputline(connection_t *connection, char* line) +int telnet_outputline(connection_t *connection, const char *line) { - telnet_write(connection, line, strlen(line)); - return telnet_write(connection, "\r\n\0", 3); + int len; + + /* process lines in buffer */ + while (*line) { + char *line_end = strchr(line, '\n'); + + if (line_end) + len = line_end-line; + else + len = strlen(line); + + telnet_write(connection, line, len); + if (line_end) + { + telnet_write(connection, "\r\n\0", 3); + line += len+1; + } + else + { + line += len; + } + } + + return ERROR_OK; } int telnet_output(struct command_context_s *cmd_ctx, char* line) @@ -89,16 +111,10 @@ int telnet_output(struct command_context_s *cmd_ctx, char* line) } void telnet_log_callback(void *priv, const char *file, int line, - const char *function, const char *format, va_list args) + const char *function, const char *string) { connection_t *connection = priv; - char *t = allocPrintf(format, args); - if (t == NULL) - return; - - telnet_outputline(connection, t); - - free(t); + telnet_outputline(connection, string); } int telnet_target_callback_event_handler(struct target_s *target, enum target_event event, void *priv) @@ -106,20 +122,15 @@ int telnet_target_callback_event_handler(struct target_s *target, enum target_ev 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) { case TARGET_EVENT_HALTED: - command_print(cmd_ctx, "Target %i halted", get_num_by_target(target)); - target->type->arch_state(target, buffer, 512); - buffer[511] = 0; - command_print(cmd_ctx, "%s", buffer); + target_arch_state(target); 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; @@ -182,7 +193,7 @@ void telnet_clear_line(connection_t *connection, telnet_connection_t *t_con) { telnet_write(connection, t_con->line + t_con->line_cursor, t_con->line_size - t_con->line_cursor); } - + /* backspace, overwrite with space, backspace */ while (t_con->line_size > 0) { @@ -286,19 +297,19 @@ int telnet_input(connection_t *connection) continue; } - log_setCallback(telnet_log_callback, connection); + log_add_callback(telnet_log_callback, connection); t_con->suppress_prompt = 1; + + retval = command_run_line(command_context, t_con->line); - if ((retval = command_run_line(command_context, t_con->line)) != ERROR_OK) + log_remove_callback(telnet_log_callback, connection); + t_con->suppress_prompt = 0; + + if (retval == ERROR_COMMAND_CLOSE_CONNECTION) { - if (retval == ERROR_COMMAND_CLOSE_CONNECTION) - { - return ERROR_SERVER_REMOTE_CLOSED; - } + return ERROR_SERVER_REMOTE_CLOSED; } - t_con->suppress_prompt = 0; - /* Save only non-blank lines in the history */ if (t_con->line_size > 0) {