server: rely on ctrl-c to stop openocd
[fw/openocd] / src / server / tcl_server.c
index a88c4365268f613b06ee63e7734bc5da4cea8062..06f67ab76b82c0e128456ab8d844e44a2f75e766 100644 (file)
@@ -1,5 +1,6 @@
 /***************************************************************************
- *   Copyright (C) 2008                                                    *
+ *   Copyright (C) 2010 Ã˜yvind Harboe                                      *
+ *   oyvind.harboe@zylin.com                                               *
  *                                                                         *
  *   This program is free software; you can redistribute it and/or modify  *
  *   it under the terms of the GNU General Public License as published by  *
@@ -81,7 +82,7 @@ static int tcl_new_connection(struct connection *connection)
 
 static int tcl_input(struct connection *connection)
 {
-       Jim_Interp *interp = (Jim_Interp *)connection->priv;
+       Jim_Interp *interp = (Jim_Interp *)connection->cmd_ctx->interp;
        int retval;
        int i;
        ssize_t rlen;
@@ -104,13 +105,6 @@ static int tcl_input(struct connection *connection)
        /* push as much data into the line as possible */
        for (i = 0; i < rlen; i++)
        {
-               if (!isprint(in[i]) && !isspace(in[i]))
-               {
-                       /* drop this line */
-                       tclc->tc_linedrop = 1;
-                       continue;
-               }
-
                /* buffer the data */
                tclc->tc_line[tclc->tc_lineoffset] = in[i];
                if (tclc->tc_lineoffset < TCL_MAX_LINE)
@@ -118,7 +112,11 @@ static int tcl_input(struct connection *connection)
                else
                        tclc->tc_linedrop = 1;
 
-               if (in[i] != '\n')
+               /* ctrl-z is end of command. When testing from telnet, just
+                * press ctrl-z a couple of times first to put telnet into the
+                * mode where it will send 0x1a in response to pressing ctrl-z
+                */
+               if (in[i] != '\x1a')
                        continue;
 
                /* process the line */
@@ -131,13 +129,15 @@ static int tcl_input(struct connection *connection)
                }
                else {
                        tclc->tc_line[tclc->tc_lineoffset-1] = '\0';
+                       LOG_DEBUG("Executing script:\n %s", tclc->tc_line);
                        retval = Jim_Eval_Named(interp, tclc->tc_line, "remote:connection",1);
+                       LOG_DEBUG("Result: %d\n %s", retval, Jim_GetString(Jim_GetResult(interp), &reslen));
                        result = Jim_GetString(Jim_GetResult(interp), &reslen);
                        retval = tcl_output(connection, result, reslen);
                        if (retval != ERROR_OK)
                                return retval;
-                       if (memchr(result, '\n', reslen) == NULL)
-                               tcl_output(connection, "\n", 1);
+                       /* Always output ctrl-d as end of line to allow multiline results */
+                       tcl_output(connection, "\x1a", 1);
                }
 
                tclc->tc_lineoffset = 0;
@@ -157,7 +157,7 @@ static int tcl_closed(struct connection *connection)
        return ERROR_OK;
 }
 
-int tcl_init(struct command_context *cmd_ctx)
+int tcl_init(void)
 {
        int retval;
 
@@ -169,7 +169,7 @@ int tcl_init(struct command_context *cmd_ctx)
 
        retval = add_service("tcl", CONNECTION_TCP, tcl_port, 1,
                        &tcl_new_connection, &tcl_input,
-                       &tcl_closed, cmd_ctx->interp);
+                       &tcl_closed, NULL);
        return retval;
 }