vtysh: rework/straighten pager handling

- no longer try to special-case a custom terminal length; the OS has
  procedures for that (SIGWINCH & TIOCGWINSZ)
- only use a pager if requested by CLI command or VTYSH_PAGER.  The
  behaviour with VTYSH_PAGER set should be compatible to previous
  versions.

Signed-off-by: David Lamparter <equinox@diac24.net>
This commit is contained in:
David Lamparter 2018-11-08 06:50:13 +01:00
parent 9c830772cd
commit 76fd52625d
3 changed files with 34 additions and 31 deletions

View File

@ -104,7 +104,7 @@ static int vty_close_pager(struct vty *vty)
return 0;
}
void vtysh_pager_init(void)
static void vtysh_pager_envdef(void)
{
char *pager_defined;
@ -2881,52 +2881,58 @@ DEFUN (vtysh_copy_running_config,
return vtysh_write_memory(self, vty, argc, argv);
}
DEFUN (vtysh_terminal_paginate,
vtysh_terminal_paginate_cmd,
"[no] terminal paginate",
NO_STR
"Set terminal line parameters\n"
"Use pager for output scrolling\n")
{
free(vtysh_pager_name);
vtysh_pager_name = NULL;
if (strcmp(argv[0]->text, "no"))
vtysh_pager_envdef();
return CMD_SUCCESS;
}
DEFUN (vtysh_terminal_length,
vtysh_terminal_length_cmd,
"terminal length (0-512)",
"[no] terminal length (0-4294967295)",
NO_STR
"Set terminal line parameters\n"
"Set number of lines on a screen\n"
"Number of lines on screen (0 for no pausing)\n")
"Number of lines on screen (0 for no pausing, nonzero to use pager)\n")
{
int idx_number = 2;
int lines;
char *endptr = NULL;
char default_pager[10];
unsigned long lines;
lines = strtol(argv[idx_number]->arg, &endptr, 10);
if (lines < 0 || lines > 512 || *endptr != '\0') {
vty_out(vty, "length is malformed\n");
return CMD_WARNING;
}
if (vtysh_pager_name) {
free(vtysh_pager_name);
vtysh_pager_name = NULL;
free(vtysh_pager_name);
vtysh_pager_name = NULL;
if (!strcmp(argv[0]->text, "no") || !strcmp(argv[1]->text, "no")) {
/* "terminal no length" = use VTYSH_PAGER */
vtysh_pager_envdef();
return CMD_SUCCESS;
}
lines = strtoul(argv[idx_number]->arg, NULL, 10);
if (lines != 0) {
snprintf(default_pager, 10, "more -%i", lines);
vtysh_pager_name = strdup(default_pager);
vty_out(vty,
"%% The \"terminal length\" command is deprecated and its value is ignored.\n"
"%% Please use \"terminal paginate\" instead with OS TTY length handling.\n");
vtysh_pager_envdef();
}
return CMD_SUCCESS;
}
DEFUN (vtysh_terminal_no_length,
ALIAS_DEPRECATED(vtysh_terminal_length,
vtysh_terminal_no_length_cmd,
"terminal no length",
"Set terminal line parameters\n"
NO_STR
"Set number of lines on a screen\n")
{
if (vtysh_pager_name) {
free(vtysh_pager_name);
vtysh_pager_name = NULL;
}
vtysh_pager_init();
return CMD_SUCCESS;
}
DEFUN (vtysh_show_daemons,
vtysh_show_daemons_cmd,
@ -3805,6 +3811,7 @@ void vtysh_init_vty(void)
/* "write memory" command. */
install_element(ENABLE_NODE, &vtysh_write_memory_cmd);
install_element(VIEW_NODE, &vtysh_terminal_paginate_cmd);
install_element(VIEW_NODE, &vtysh_terminal_length_cmd);
install_element(VIEW_NODE, &vtysh_terminal_no_length_cmd);
install_element(VIEW_NODE, &vtysh_show_daemons_cmd);

View File

@ -98,8 +98,6 @@ void vtysh_config_dump(void);
void vtysh_config_init(void);
void vtysh_pager_init(void);
void suid_on(void);
void suid_off(void);

View File

@ -675,8 +675,6 @@ int main(int argc, char **argv, char **env)
exit(0);
}
vtysh_pager_init();
vtysh_readline_init();
vty_hello(vty);