|
|
@@ -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; |
|
|
|