server: specify port as a string
[fw/openocd] / src / server / telnet_server.c
index 94c89431b977faf5e466e82955688d61b8f554cd..420f5d70a05e407c27807caad310fadbeff4a00d 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                                  *
@@ -30,7 +30,7 @@
 #include "telnet_server.h"
 #include <target/target_request.h>
 
-static unsigned short telnet_port = 4444;
+static const char *telnet_port;
 
 static char *negotiate =
                "\xFF\xFB\x03"          /* IAC WILL Suppress Go Ahead */
@@ -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,14 +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;
 
        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;
 
@@ -93,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;
@@ -132,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;
@@ -177,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)
@@ -194,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];
@@ -202,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;
@@ -540,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;
@@ -578,32 +580,19 @@ 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));
-
-       if (telnet_port == 0)
+       if (strcmp(telnet_port, "disabled") == 0)
        {
-               LOG_INFO("telnet port disabled");
-               free(telnet_service);
+               LOG_INFO("telnet server disabled");
                return ERROR_OK;
        }
 
+       struct telnet_service *telnet_service = malloc(sizeof(struct telnet_service));
+
        telnet_service->banner = banner;
 
-       add_service("telnet", CONNECTION_TCP, telnet_port, 1, telnet_new_connection, telnet_input, telnet_connection_closed, telnet_service);
+       add_service_pipe("telnet", telnet_port, 1, telnet_new_connection, telnet_input, telnet_connection_closed, telnet_service);
 
        return ERROR_OK;
 }
@@ -611,7 +600,7 @@ int telnet_init(char *banner)
 /* daemon configuration command telnet_port */
 COMMAND_HANDLER(handle_telnet_port_command)
 {
-       return CALL_COMMAND_HANDLER(server_port_command, &telnet_port);
+       return CALL_COMMAND_HANDLER(server_pipe_command, &telnet_port);
 }
 
 COMMAND_HANDLER(handle_exit_command)
@@ -640,5 +629,6 @@ static const struct command_registration telnet_command_handlers[] = {
 
 int telnet_register_commands(struct command_context *cmd_ctx)
 {
+       telnet_port = strdup("4444");
        return register_commands(cmd_ctx, NULL, telnet_command_handlers);
 }