cygwin 1.7 build fixes
[fw/openocd] / src / server / tcl_server.c
index b5ca3c965a958a7081a96564aa9b8f4e125b215c..a772c0aca6d32ae0266d3a3717df9aceb6f92eaa 100644 (file)
 #define TCL_SERVER_VERSION     "TCL Server 0.1"
 #define TCL_MAX_LINE           (4096)
 
-typedef struct tcl_connection_s {
+struct tcl_connection {
        int tc_linedrop;
        int tc_lineoffset;
        char tc_line[TCL_MAX_LINE];
        int tc_outerror; /* flag an output error */
-} tcl_connection_t;
+};
 
-static unsigned short tcl_port = 0;
-
-/* commands */
-static int handle_tcl_port_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
+static unsigned short tcl_port = 6666;
 
 /* handlers */
-static int tcl_new_connection(connection_t *connection);
-static int tcl_input(connection_t *connection);
-static int tcl_output(connection_t *connection, const void *buf, ssize_t len);
-static int tcl_closed(connection_t *connection);
+static int tcl_new_connection(struct connection *connection);
+static int tcl_input(struct connection *connection);
+static int tcl_output(struct connection *connection, const void *buf, ssize_t len);
+static int tcl_closed(struct connection *connection);
 
 /* write data out to a socket.
  *
  * this is a blocking write, so the return value must equal the length, if
  * that is not the case then flag the connection with an output error.
  */
-int tcl_output(connection_t *connection, const void *data, ssize_t len)
+int tcl_output(struct connection *connection, const void *data, ssize_t len)
 {
        ssize_t wlen;
-       tcl_connection_t *tclc;
+       struct tcl_connection *tclc;
 
        tclc = connection->priv;
        if (tclc->tc_outerror)
@@ -69,28 +66,29 @@ int tcl_output(connection_t *connection, const void *data, ssize_t len)
 }
 
 /* connections */
-static int tcl_new_connection(connection_t *connection)
+static int tcl_new_connection(struct connection *connection)
 {
-       tcl_connection_t *tclc;
+       struct tcl_connection *tclc;
 
-       tclc = malloc(sizeof(tcl_connection_t));
+       tclc = malloc(sizeof(struct tcl_connection));
        if (tclc == NULL)
                return ERROR_CONNECTION_REJECTED;
 
-       memset(tclc, 0, sizeof(tcl_connection_t));
+       memset(tclc, 0, sizeof(struct tcl_connection));
        connection->priv = tclc;
        return ERROR_OK;
 }
 
-static int tcl_input(connection_t *connection)
+static int tcl_input(struct connection *connection)
 {
+       Jim_Interp *interp = (Jim_Interp *)connection->priv;
        int retval;
        int i;
        ssize_t rlen;
        const char *result;
        int reslen;
-       tcl_connection_t *tclc;
-       char in[256];
+       struct tcl_connection *tclc;
+       unsigned char in[256];
 
        rlen = read_socket(connection->fd, &in, sizeof(in));
        if (rlen <= 0) {
@@ -141,7 +139,7 @@ static int tcl_input(connection_t *connection)
                        if (memchr(result, '\n', reslen) == NULL)
                                tcl_output(connection, "\n", 1);
                }
-               
+
                tclc->tc_lineoffset = 0;
                tclc->tc_linedrop = 0;
        }
@@ -149,7 +147,7 @@ static int tcl_input(connection_t *connection)
        return ERROR_OK;
 }
 
-static int tcl_closed(connection_t *connection)
+static int tcl_closed(struct connection *connection)
 {
        /* cleanup connection context */
        if (connection->priv) {
@@ -159,30 +157,40 @@ static int tcl_closed(connection_t *connection)
        return ERROR_OK;
 }
 
-int tcl_init(void)
+int tcl_init(struct command_context *cmd_ctx)
 {
        int retval;
 
        if (tcl_port == 0)
        {
-               LOG_WARNING("no tcl port specified, using default port 6666");
-               tcl_port = 6666;
+               LOG_INFO("tcl port disabled");
+               return ERROR_OK;
        }
 
-       retval = add_service("tcl", CONNECTION_TCP, tcl_port, 1, tcl_new_connection, tcl_input, tcl_closed, NULL);
+       retval = add_service("tcl", CONNECTION_TCP, tcl_port, 1,
+                       &tcl_new_connection, &tcl_input,
+                       &tcl_closed, cmd_ctx->interp);
        return retval;
 }
 
-int tcl_register_commands(command_context_t *cmd_ctx)
+COMMAND_HANDLER(handle_tcl_port_command)
 {
-       register_command(cmd_ctx, NULL, "tcl_port", handle_tcl_port_command, COMMAND_CONFIG, "port on which to listen for incoming TCL syntax");
-       return ERROR_OK;
+       return CALL_COMMAND_HANDLER(server_port_command, &tcl_port);
 }
 
-static int handle_tcl_port_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
+static const struct command_registration tcl_command_handlers[] = {
+       {
+               .name = "tcl_port",
+               .handler = &handle_tcl_port_command,
+               .mode = COMMAND_CONFIG,
+               .help = "port on which to listen "
+                       "for incoming TCL syntax",
+               .usage = "<port>",
+       },
+       COMMAND_REGISTRATION_DONE
+};
+
+int tcl_register_commands(struct command_context *cmd_ctx)
 {
-       if (argc == 1) {
-               tcl_port = strtoul(args[0], NULL, 0);
-       }
-       return ERROR_OK;
+       return register_commands(cmd_ctx, NULL, tcl_command_handlers);
 }