Before this fix, the "exit" command behaved differently depending on where it was called from: - "exit" in a telnet session: Session disconnected. - "exit" in a Tcl session: Empty response sent but the session remained connected. - "exit" in a script (outside of Telnet or Tcl): OpenOCD exited with code 0. Based on the help and documentation "exit" was apparently not intended for these cases. What's more, if "exit" is allowed in Tcl scripts, user may confuse it with the Tcl's native "exit" command that is not available in OpenOCD (it is shadowed with this OpenOCD's "exit" command). This fix makes the behavior of "exit" consistent: - "exit" in a telnet session: Session disconnected (no change). - "exit" in a Tcl session: Session disconnected (same as for telnet). - "exit" in a script: Notify the user that "exit" is deprecated outside of telnet/tcl but still shut down OpenOCD (to preserve the original behavior). Update the documentation to make it very clear to users when to use "exit" vs. "shutdown". Change-Id: I790495330e1fa705b34097a1347fdc57aaa86de1 Signed-off-by: Jan Matyas <jan.matyas@codasip.com> Reviewed-on: https://review.openocd.org/c/openocd/+/9380 Reviewed-by: Antonio Borneo <borneo.antonio@gmail.com> Tested-by: jenkins
60 lines
1.8 KiB
C
60 lines
1.8 KiB
C
/* SPDX-License-Identifier: GPL-2.0-or-later */
|
|
|
|
/***************************************************************************
|
|
* Copyright (C) 2005 by Dominic Rath *
|
|
* Dominic.Rath@gmx.de *
|
|
* *
|
|
* Copyright (C) 2007,2008 Øyvind Harboe *
|
|
* oyvind.harboe@zylin.com *
|
|
* *
|
|
* Copyright (C) 2008 by Spencer Oliver *
|
|
* spen@spen-soft.co.uk *
|
|
***************************************************************************/
|
|
|
|
#ifndef OPENOCD_SERVER_TELNET_SERVER_H
|
|
#define OPENOCD_SERVER_TELNET_SERVER_H
|
|
|
|
#include <server/server.h>
|
|
|
|
#define TELNET_BUFFER_SIZE (10*1024)
|
|
|
|
#define TELNET_LINE_HISTORY_SIZE (128)
|
|
#define TELNET_LINE_MAX_SIZE (10*256)
|
|
|
|
enum telnet_states {
|
|
TELNET_STATE_DATA,
|
|
TELNET_STATE_IAC,
|
|
TELNET_STATE_SB,
|
|
TELNET_STATE_SE,
|
|
TELNET_STATE_WILL,
|
|
TELNET_STATE_WONT,
|
|
TELNET_STATE_DO,
|
|
TELNET_STATE_DONT,
|
|
TELNET_STATE_ESCAPE,
|
|
};
|
|
|
|
struct telnet_connection {
|
|
char *prompt;
|
|
bool prompt_visible;
|
|
enum telnet_states state;
|
|
char line[TELNET_LINE_MAX_SIZE];
|
|
size_t line_size;
|
|
size_t line_cursor;
|
|
char last_escape;
|
|
char *history[TELNET_LINE_HISTORY_SIZE];
|
|
size_t next_history;
|
|
size_t current_history;
|
|
bool closed;
|
|
};
|
|
|
|
struct telnet_service {
|
|
char *banner;
|
|
};
|
|
|
|
int telnet_init(char *banner);
|
|
int telnet_register_commands(struct command_context *command_context);
|
|
void telnet_service_free(void);
|
|
bool telnet_is_from_telnet_session(struct command_context *cmd_ctx);
|
|
|
|
#endif /* OPENOCD_SERVER_TELNET_SERVER_H */
|