]> git.sur5r.net Git - openocd/commitdiff
tcl_server: switch to ctrl-z
authorØyvind Harboe <oyvind.harboe@zylin.com>
Wed, 8 Sep 2010 18:04:27 +0000 (20:04 +0200)
committerØyvind Harboe <oyvind.harboe@zylin.com>
Mon, 20 Sep 2010 18:45:48 +0000 (20:45 +0200)
by using ctrl-z instead of line end, multi-line tcl scripts
can be handled.

Testing: send ctrl-z a couple of times to make telnet enter the
mode where it sends ctrl-z unencoded.

Programs that talk to the tcl_server can send ctrl-z to
indicate end of tcl-let to be executed without having
to worry about telnet protocols.

Signed-off-by: Øyvind Harboe <oyvind.harboe@zylin.com>
src/server/tcl_server.c

index 7c8e130ba702a8f2b660725143a08d27d938e236..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  *
@@ -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;