Merge branch 'master' into update
Change-Id: I2cd34ed5bb1903736ae8ce109acebaf13bf49805
This commit is contained in:
@@ -991,7 +991,9 @@ static int gdb_new_connection(struct connection *connection)
|
||||
}
|
||||
|
||||
gdb_actual_connections++;
|
||||
LOG_DEBUG("New GDB Connection: %d, Target %s, state: %s",
|
||||
log_printf_lf(all_targets->next != NULL ? LOG_LVL_INFO : LOG_LVL_DEBUG,
|
||||
__FILE__, __LINE__, __func__,
|
||||
"New GDB Connection: %d, Target %s, state: %s",
|
||||
gdb_actual_connections,
|
||||
target_name(target),
|
||||
target_state_name(target));
|
||||
@@ -3122,7 +3124,7 @@ static int gdb_target_add_one(struct target *target)
|
||||
} else {
|
||||
/* Don't increment if gdb_port is 0, since we're just
|
||||
* trying to allocate an unused port. */
|
||||
gdb_port_next = alloc_printf("0");
|
||||
gdb_port_next = strdup("0");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+4
-3
@@ -301,10 +301,11 @@ int add_service(char *name,
|
||||
}
|
||||
|
||||
struct sockaddr_in addr_in;
|
||||
addr_in.sin_port = 0;
|
||||
socklen_t addr_in_size = sizeof(addr_in);
|
||||
getsockname(c->fd, (struct sockaddr *)&addr_in, &addr_in_size);
|
||||
LOG_INFO("Listening on port %d for %s connections",
|
||||
ntohs(addr_in.sin_port), name);
|
||||
if (getsockname(c->fd, (struct sockaddr *)&addr_in, &addr_in_size) == 0)
|
||||
LOG_INFO("Listening on port %hu for %s connections",
|
||||
ntohs(addr_in.sin_port), name);
|
||||
} else if (c->type == CONNECTION_STDINOUT) {
|
||||
c->fd = fileno(stdin);
|
||||
|
||||
|
||||
+60
-22
@@ -54,7 +54,7 @@ static int telnet_write(struct connection *connection, const void *data,
|
||||
|
||||
if (connection_write(connection, data, len) == len)
|
||||
return ERROR_OK;
|
||||
t_con->closed = 1;
|
||||
t_con->closed = true;
|
||||
return ERROR_SERVER_REMOTE_CLOSED;
|
||||
}
|
||||
|
||||
@@ -101,29 +101,36 @@ static void telnet_log_callback(void *priv, const char *file, unsigned line,
|
||||
{
|
||||
struct connection *connection = priv;
|
||||
struct telnet_connection *t_con = connection->priv;
|
||||
int i;
|
||||
size_t i;
|
||||
size_t tmp;
|
||||
|
||||
/* if there is no prompt, simply output the message */
|
||||
if (t_con->line_cursor < 0) {
|
||||
/* If the prompt is not visible, simply output the message. */
|
||||
if (!t_con->prompt_visible) {
|
||||
telnet_outputline(connection, string);
|
||||
return;
|
||||
}
|
||||
|
||||
/* clear the command line */
|
||||
for (i = strlen(t_con->prompt) + t_con->line_size; i > 0; i -= 16)
|
||||
telnet_write(connection, "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b", i > 16 ? 16 : i);
|
||||
for (i = strlen(t_con->prompt) + t_con->line_size; i > 0; i -= 16)
|
||||
telnet_write(connection, " ", i > 16 ? 16 : i);
|
||||
for (i = strlen(t_con->prompt) + t_con->line_size; i > 0; i -= 16)
|
||||
telnet_write(connection, "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b", i > 16 ? 16 : i);
|
||||
/* Clear the command line. */
|
||||
tmp = strlen(t_con->prompt) + t_con->line_size;
|
||||
|
||||
for (i = 0; i < tmp; i += 16)
|
||||
telnet_write(connection, "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b",
|
||||
MIN(tmp - i, 16));
|
||||
|
||||
for (i = 0; i < tmp; i += 16)
|
||||
telnet_write(connection, " ", MIN(tmp - i, 16));
|
||||
|
||||
for (i = 0; i < tmp; i += 16)
|
||||
telnet_write(connection, "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b",
|
||||
MIN(tmp - i, 16));
|
||||
|
||||
/* output the message */
|
||||
telnet_outputline(connection, string);
|
||||
|
||||
/* put the command line to its previous state */
|
||||
/* Put the command line to its previous state. */
|
||||
telnet_prompt(connection);
|
||||
telnet_write(connection, t_con->line, t_con->line_size);
|
||||
for (i = t_con->line_size; i > t_con->line_cursor; i--)
|
||||
|
||||
for (i = t_con->line_cursor; i < t_con->line_size; i++)
|
||||
telnet_write(connection, "\b", 1);
|
||||
}
|
||||
|
||||
@@ -219,10 +226,11 @@ static int telnet_new_connection(struct connection *connection)
|
||||
connection->priv = telnet_connection;
|
||||
|
||||
/* initialize telnet connection information */
|
||||
telnet_connection->closed = 0;
|
||||
telnet_connection->closed = false;
|
||||
telnet_connection->line_size = 0;
|
||||
telnet_connection->line_cursor = 0;
|
||||
telnet_connection->prompt = strdup("> ");
|
||||
telnet_connection->prompt_visible = true;
|
||||
telnet_connection->state = TELNET_STATE_DATA;
|
||||
|
||||
/* output goes through telnet connection */
|
||||
@@ -289,7 +297,7 @@ static void telnet_history_up(struct connection *connection)
|
||||
{
|
||||
struct telnet_connection *t_con = connection->priv;
|
||||
|
||||
int last_history = (t_con->current_history > 0) ?
|
||||
size_t last_history = (t_con->current_history > 0) ?
|
||||
t_con->current_history - 1 :
|
||||
TELNET_LINE_HISTORY_SIZE-1;
|
||||
telnet_history_go(connection, last_history);
|
||||
@@ -298,11 +306,36 @@ static void telnet_history_up(struct connection *connection)
|
||||
static void telnet_history_down(struct connection *connection)
|
||||
{
|
||||
struct telnet_connection *t_con = connection->priv;
|
||||
size_t next_history;
|
||||
|
||||
int next_history = (t_con->current_history + 1) % TELNET_LINE_HISTORY_SIZE;
|
||||
next_history = (t_con->current_history + 1) % TELNET_LINE_HISTORY_SIZE;
|
||||
telnet_history_go(connection, next_history);
|
||||
}
|
||||
|
||||
static void telnet_move_cursor(struct connection *connection, size_t pos)
|
||||
{
|
||||
struct telnet_connection *tc;
|
||||
size_t tmp;
|
||||
|
||||
tc = connection->priv;
|
||||
|
||||
if (pos < tc->line_cursor) {
|
||||
tmp = tc->line_cursor - pos;
|
||||
|
||||
for (size_t i = 0; i < tmp; i += 16)
|
||||
telnet_write(connection, "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b",
|
||||
MIN(tmp - i, 16));
|
||||
} else {
|
||||
tmp = pos - tc->line_cursor;
|
||||
|
||||
for (size_t i = 0; i < tmp; i += 16)
|
||||
telnet_write(connection, tc->line + tc->line_cursor + i,
|
||||
MIN(tmp - i, 16));
|
||||
}
|
||||
|
||||
tc->line_cursor = pos;
|
||||
}
|
||||
|
||||
static int telnet_input(struct connection *connection)
|
||||
{
|
||||
int bytes_read;
|
||||
@@ -339,7 +372,7 @@ static int telnet_input(struct connection *connection)
|
||||
t_con->line[t_con->line_size++] = *buf_p;
|
||||
t_con->line_cursor++;
|
||||
} else {
|
||||
int i;
|
||||
size_t i;
|
||||
memmove(t_con->line + t_con->line_cursor + 1,
|
||||
t_con->line + t_con->line_cursor,
|
||||
t_con->line_size - t_con->line_cursor);
|
||||
@@ -374,7 +407,7 @@ static int telnet_input(struct connection *connection)
|
||||
telnet_write(connection, "\r\n\x00", 3);
|
||||
|
||||
if (strcmp(t_con->line, "history") == 0) {
|
||||
int i;
|
||||
size_t i;
|
||||
for (i = 1; i < TELNET_LINE_HISTORY_SIZE; i++) {
|
||||
/* the t_con->next_history line contains empty string
|
||||
* (unless NULL), thus it is not printed */
|
||||
@@ -420,7 +453,7 @@ static int telnet_input(struct connection *connection)
|
||||
t_con->line_size = 0;
|
||||
|
||||
/* to suppress prompt in log callback during command execution */
|
||||
t_con->line_cursor = -1;
|
||||
t_con->prompt_visible = false;
|
||||
|
||||
if (strcmp(t_con->line, "shutdown") == 0)
|
||||
telnet_save_history(t_con);
|
||||
@@ -428,6 +461,7 @@ static int telnet_input(struct connection *connection)
|
||||
retval = command_run_line(command_context, t_con->line);
|
||||
|
||||
t_con->line_cursor = 0;
|
||||
t_con->prompt_visible = true;
|
||||
|
||||
if (retval == ERROR_COMMAND_CLOSE_CONNECTION)
|
||||
return ERROR_SERVER_REMOTE_CLOSED;
|
||||
@@ -442,7 +476,7 @@ static int telnet_input(struct connection *connection)
|
||||
} else if ((*buf_p == 0x7f) || (*buf_p == 0x8)) { /* delete character */
|
||||
if (t_con->line_cursor > 0) {
|
||||
if (t_con->line_cursor != t_con->line_size) {
|
||||
int i;
|
||||
size_t i;
|
||||
telnet_write(connection, "\b", 1);
|
||||
t_con->line_cursor--;
|
||||
t_con->line_size--;
|
||||
@@ -482,6 +516,10 @@ static int telnet_input(struct connection *connection)
|
||||
telnet_history_up(connection);
|
||||
else if (*buf_p == CTRL('N')) /* cursor down */
|
||||
telnet_history_down(connection);
|
||||
else if (*buf_p == CTRL('A'))
|
||||
telnet_move_cursor(connection, 0);
|
||||
else if (*buf_p == CTRL('E'))
|
||||
telnet_move_cursor(connection, t_con->line_size);
|
||||
else
|
||||
LOG_DEBUG("unhandled nonprintable: %2.2x", *buf_p);
|
||||
}
|
||||
@@ -538,7 +576,7 @@ static int telnet_input(struct connection *connection)
|
||||
/* Remove character */
|
||||
if (*buf_p == '~') {
|
||||
if (t_con->line_cursor < t_con->line_size) {
|
||||
int i;
|
||||
size_t i;
|
||||
t_con->line_size--;
|
||||
/* remove char from line buffer */
|
||||
memmove(t_con->line + t_con->line_cursor,
|
||||
|
||||
@@ -46,15 +46,16 @@ enum telnet_states {
|
||||
|
||||
struct telnet_connection {
|
||||
char *prompt;
|
||||
bool prompt_visible;
|
||||
enum telnet_states state;
|
||||
char line[TELNET_LINE_MAX_SIZE];
|
||||
int line_size;
|
||||
int line_cursor;
|
||||
size_t line_size;
|
||||
size_t line_cursor;
|
||||
char last_escape;
|
||||
char *history[TELNET_LINE_HISTORY_SIZE];
|
||||
int next_history;
|
||||
int current_history;
|
||||
int closed;
|
||||
size_t next_history;
|
||||
size_t current_history;
|
||||
bool closed;
|
||||
};
|
||||
|
||||
struct telnet_service {
|
||||
|
||||
Reference in New Issue
Block a user