server: read/write now goes through connection fn's
[fw/openocd] / src / server / telnet_server.c
index 6f26f0ac3ca29fee55a276ade1e5cec26809c15b..ee8d3b16a9841f7dbbcf85f3493005913aac4452 100644 (file)
@@ -2,7 +2,7 @@
  *   Copyright (C) 2005 by Dominic Rath                                    *
  *   Dominic.Rath@gmx.de                                                   *
  *                                                                         *
- *   Copyright (C) 2007,2008 Øyvind Harboe                                 *
+ *   Copyright (C) 2007-2010 Øyvind Harboe                                 *
  *   oyvind.harboe@zylin.com                                               *
  *                                                                         *
  *   Copyright (C) 2008 by Spencer Oliver                                  *
@@ -44,13 +44,14 @@ static char *negotiate =
  * we write to it, we will fail. Subsequent write operations will
  * succeed. Shudder!
  */
-int telnet_write(struct connection *connection, const void *data, int len)
+static int telnet_write(struct connection *connection, const void *data,
+               int len)
 {
        struct telnet_connection *t_con = connection->priv;
        if (t_con->closed)
                return ERROR_SERVER_REMOTE_CLOSED;
 
-       if (write_socket(connection->fd, data, len) == len)
+       if (connection_write(connection, data, len) == len)
        {
                return ERROR_OK;
        }
@@ -58,15 +59,14 @@ int telnet_write(struct connection *connection, const void *data, int len)
        return ERROR_SERVER_REMOTE_CLOSED;
 }
 
-int telnet_prompt(struct connection *connection)
+static int telnet_prompt(struct connection *connection)
 {
        struct telnet_connection *t_con = connection->priv;
 
-       telnet_write(connection, "\r", 1); /* the prompt is always placed at the line beginning */
        return telnet_write(connection, t_con->prompt, strlen(t_con->prompt));
 }
 
-int telnet_outputline(struct connection *connection, const char *line)
+static int telnet_outputline(struct connection *connection, const char *line)
 {
        int len;
 
@@ -94,14 +94,14 @@ int telnet_outputline(struct connection *connection, const char *line)
        return ERROR_OK;
 }
 
-int telnet_output(struct command_context *cmd_ctx, const char* line)
+static int telnet_output(struct command_context *cmd_ctx, const char* line)
 {
        struct connection *connection = cmd_ctx->output_handler_priv;
 
        return telnet_outputline(connection, line);
 }
 
-void telnet_log_callback(void *priv, const char *file, unsigned line,
+static void telnet_log_callback(void *priv, const char *file, unsigned line,
                const char *function, const char *string)
 {
        struct connection *connection = priv;
@@ -116,10 +116,12 @@ void telnet_log_callback(void *priv, const char *file, unsigned line,
        }
 
        /* clear the command line */
-       telnet_write(connection, "\r", 1);
+       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);
-       telnet_write(connection, "\r", 1);
+       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);
 
        /* output the message */
        telnet_outputline(connection, string);
@@ -131,7 +133,7 @@ void telnet_log_callback(void *priv, const char *file, unsigned line,
                telnet_write(connection, "\b", 1);
 }
 
-int telnet_new_connection(struct connection *connection)
+static int telnet_new_connection(struct connection *connection)
 {
        struct telnet_connection *telnet_connection = malloc(sizeof(struct telnet_connection));
        struct telnet_service *telnet_service = connection->service->priv;
@@ -160,6 +162,7 @@ int telnet_new_connection(struct connection *connection)
                telnet_write(connection, "\r\n", 2);
        }
 
+       telnet_write(connection, "\r", 1); /* the prompt is always placed at the line beginning */
        telnet_prompt(connection);
 
        /* initialize history */
@@ -175,7 +178,8 @@ int telnet_new_connection(struct connection *connection)
        return ERROR_OK;
 }
 
-void telnet_clear_line(struct connection *connection, struct telnet_connection *t_con)
+static void telnet_clear_line(struct connection *connection,
+               struct telnet_connection *t_con)
 {
        /* move to end of line */
        if (t_con->line_cursor < t_con->line_size)
@@ -192,7 +196,7 @@ void telnet_clear_line(struct connection *connection, struct telnet_connection *
        t_con->line_cursor = 0;
 }
 
-int telnet_input(struct connection *connection)
+static int telnet_input(struct connection *connection)
 {
        int bytes_read;
        unsigned char buffer[TELNET_BUFFER_SIZE];
@@ -200,7 +204,7 @@ int telnet_input(struct connection *connection)
        struct telnet_connection *t_con = connection->priv;
        struct command_context *command_context = connection->cmd_ctx;
 
-       bytes_read = read_socket(connection->fd, buffer, TELNET_BUFFER_SIZE);
+       bytes_read = connection_read(connection, buffer, TELNET_BUFFER_SIZE);
 
        if (bytes_read == 0)
                return ERROR_SERVER_REMOTE_CLOSED;
@@ -331,6 +335,7 @@ int telnet_input(struct connection *connection)
                                                        if (retval == ERROR_COMMAND_CLOSE_CONNECTION)
                                                                return ERROR_SERVER_REMOTE_CLOSED;
 
+                                                       telnet_write(connection, "\r", 1); /* the prompt is always placed at the line beginning */
                                                        retval = telnet_prompt(connection);
                                                        if (retval == ERROR_SERVER_REMOTE_CLOSED)
                                                                return ERROR_SERVER_REMOTE_CLOSED;
@@ -537,7 +542,7 @@ int telnet_input(struct connection *connection)
        return ERROR_OK;
 }
 
-int telnet_connection_closed(struct connection *connection)
+static int telnet_connection_closed(struct connection *connection)
 {
        struct telnet_connection *t_con = connection->priv;
        int i;
@@ -575,18 +580,6 @@ int telnet_connection_closed(struct connection *connection)
        return ERROR_OK;
 }
 
-int telnet_set_prompt(struct connection *connection, char *prompt)
-{
-       struct telnet_connection *t_con = connection->priv;
-
-       if (t_con->prompt != NULL)
-               free(t_con->prompt);
-
-       t_con->prompt = strdup(prompt);
-
-       return ERROR_OK;
-}
-
 int telnet_init(char *banner)
 {
        struct telnet_service *telnet_service = malloc(sizeof(struct telnet_service));