server/telnet: Use proper data types

Change-Id: Ie7588e311fa5155d5ee73148dee3d0d931bfc7f5
Signed-off-by: Marc Schink <openocd-dev@marcschink.de>
Reviewed-on: http://openocd.zylin.com/3413
Tested-by: jenkins
Reviewed-by: Paul Fertser <fercerpav@gmail.com>
compliance_dev
Marc Schink 2016-04-13 11:00:19 +02:00 committed by Paul Fertser
parent 1003bc7be7
commit 22ad1c0f60
2 changed files with 38 additions and 27 deletions

View File

@ -54,7 +54,7 @@ static int telnet_write(struct connection *connection, const void *data,
if (connection_write(connection, data, len) == len) if (connection_write(connection, data, len) == len)
return ERROR_OK; return ERROR_OK;
t_con->closed = 1; t_con->closed = true;
return ERROR_SERVER_REMOTE_CLOSED; 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 connection *connection = priv;
struct telnet_connection *t_con = 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 the prompt is not visible, simply output the message. */
if (t_con->line_cursor < 0) { if (!t_con->prompt_visible) {
telnet_outputline(connection, string); telnet_outputline(connection, string);
return; return;
} }
/* clear the command line */ /* Clear the command line. */
for (i = strlen(t_con->prompt) + t_con->line_size; i > 0; i -= 16) tmp = strlen(t_con->prompt) + t_con->line_size;
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) for (i = 0; i < tmp; i += 16)
telnet_write(connection, " ", i > 16 ? 16 : i); telnet_write(connection, "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b",
for (i = strlen(t_con->prompt) + t_con->line_size; i > 0; i -= 16) MIN(tmp - 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 = 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); telnet_outputline(connection, string);
/* put the command line to its previous state */ /* Put the command line to its previous state. */
telnet_prompt(connection); telnet_prompt(connection);
telnet_write(connection, t_con->line, t_con->line_size); 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); telnet_write(connection, "\b", 1);
} }
@ -219,10 +226,11 @@ static int telnet_new_connection(struct connection *connection)
connection->priv = telnet_connection; connection->priv = telnet_connection;
/* initialize telnet connection information */ /* initialize telnet connection information */
telnet_connection->closed = 0; telnet_connection->closed = false;
telnet_connection->line_size = 0; telnet_connection->line_size = 0;
telnet_connection->line_cursor = 0; telnet_connection->line_cursor = 0;
telnet_connection->prompt = strdup("> "); telnet_connection->prompt = strdup("> ");
telnet_connection->prompt_visible = true;
telnet_connection->state = TELNET_STATE_DATA; telnet_connection->state = TELNET_STATE_DATA;
/* output goes through telnet connection */ /* output goes through telnet connection */
@ -289,7 +297,7 @@ static void telnet_history_up(struct connection *connection)
{ {
struct telnet_connection *t_con = connection->priv; 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 : t_con->current_history - 1 :
TELNET_LINE_HISTORY_SIZE-1; TELNET_LINE_HISTORY_SIZE-1;
telnet_history_go(connection, last_history); telnet_history_go(connection, last_history);
@ -298,8 +306,9 @@ static void telnet_history_up(struct connection *connection)
static void telnet_history_down(struct connection *connection) static void telnet_history_down(struct connection *connection)
{ {
struct telnet_connection *t_con = connection->priv; 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); telnet_history_go(connection, next_history);
} }
@ -363,7 +372,7 @@ static int telnet_input(struct connection *connection)
t_con->line[t_con->line_size++] = *buf_p; t_con->line[t_con->line_size++] = *buf_p;
t_con->line_cursor++; t_con->line_cursor++;
} else { } else {
int i; size_t i;
memmove(t_con->line + t_con->line_cursor + 1, memmove(t_con->line + t_con->line_cursor + 1,
t_con->line + t_con->line_cursor, t_con->line + t_con->line_cursor,
t_con->line_size - t_con->line_cursor); t_con->line_size - t_con->line_cursor);
@ -398,7 +407,7 @@ static int telnet_input(struct connection *connection)
telnet_write(connection, "\r\n\x00", 3); telnet_write(connection, "\r\n\x00", 3);
if (strcmp(t_con->line, "history") == 0) { if (strcmp(t_con->line, "history") == 0) {
int i; size_t i;
for (i = 1; i < TELNET_LINE_HISTORY_SIZE; i++) { for (i = 1; i < TELNET_LINE_HISTORY_SIZE; i++) {
/* the t_con->next_history line contains empty string /* the t_con->next_history line contains empty string
* (unless NULL), thus it is not printed */ * (unless NULL), thus it is not printed */
@ -444,7 +453,7 @@ static int telnet_input(struct connection *connection)
t_con->line_size = 0; t_con->line_size = 0;
/* to suppress prompt in log callback during command execution */ /* 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) if (strcmp(t_con->line, "shutdown") == 0)
telnet_save_history(t_con); telnet_save_history(t_con);
@ -452,6 +461,7 @@ static int telnet_input(struct connection *connection)
retval = command_run_line(command_context, t_con->line); retval = command_run_line(command_context, t_con->line);
t_con->line_cursor = 0; t_con->line_cursor = 0;
t_con->prompt_visible = true;
if (retval == ERROR_COMMAND_CLOSE_CONNECTION) if (retval == ERROR_COMMAND_CLOSE_CONNECTION)
return ERROR_SERVER_REMOTE_CLOSED; return ERROR_SERVER_REMOTE_CLOSED;
@ -466,7 +476,7 @@ static int telnet_input(struct connection *connection)
} else if ((*buf_p == 0x7f) || (*buf_p == 0x8)) { /* delete character */ } else if ((*buf_p == 0x7f) || (*buf_p == 0x8)) { /* delete character */
if (t_con->line_cursor > 0) { if (t_con->line_cursor > 0) {
if (t_con->line_cursor != t_con->line_size) { if (t_con->line_cursor != t_con->line_size) {
int i; size_t i;
telnet_write(connection, "\b", 1); telnet_write(connection, "\b", 1);
t_con->line_cursor--; t_con->line_cursor--;
t_con->line_size--; t_con->line_size--;
@ -566,7 +576,7 @@ static int telnet_input(struct connection *connection)
/* Remove character */ /* Remove character */
if (*buf_p == '~') { if (*buf_p == '~') {
if (t_con->line_cursor < t_con->line_size) { if (t_con->line_cursor < t_con->line_size) {
int i; size_t i;
t_con->line_size--; t_con->line_size--;
/* remove char from line buffer */ /* remove char from line buffer */
memmove(t_con->line + t_con->line_cursor, memmove(t_con->line + t_con->line_cursor,

View File

@ -46,15 +46,16 @@ enum telnet_states {
struct telnet_connection { struct telnet_connection {
char *prompt; char *prompt;
bool prompt_visible;
enum telnet_states state; enum telnet_states state;
char line[TELNET_LINE_MAX_SIZE]; char line[TELNET_LINE_MAX_SIZE];
int line_size; size_t line_size;
int line_cursor; size_t line_cursor;
char last_escape; char last_escape;
char *history[TELNET_LINE_HISTORY_SIZE]; char *history[TELNET_LINE_HISTORY_SIZE];
int next_history; size_t next_history;
int current_history; size_t current_history;
int closed; bool closed;
}; };
struct telnet_service { struct telnet_service {