cli: make Ctrl-C exit nmcli when line is empty *and* we are not in the editor

This commit is contained in:
Jiří Klimeš 2014-06-23 13:59:46 +02:00
parent 7e75ccea7f
commit 12f284dee3
4 changed files with 25 additions and 5 deletions

View file

@ -1124,6 +1124,9 @@ nmc_set_in_readline (gboolean in_readline)
pthread_mutex_unlock (&readline_mutex); pthread_mutex_unlock (&readline_mutex);
} }
/* Global variable defined in nmcli.c */
extern NmCli nm_cli;
/** /**
* nmc_readline: * nmc_readline:
* @prompt_fmt: prompt to print (telling user what to enter). It is standard * @prompt_fmt: prompt to print (telling user what to enter). It is standard
@ -1131,7 +1134,8 @@ nmc_set_in_readline (gboolean in_readline)
* @...: a list of arguments according to the @prompt_fmt format string * @...: a list of arguments according to the @prompt_fmt format string
* *
* Wrapper around libreadline's readline() function. * Wrapper around libreadline's readline() function.
* If user pressed Ctrl-C, readline() is called again. * If user pressed Ctrl-C, readline() is called again (if not in editor and
* line is empty, nmcli will quit).
* If user pressed Ctrl-D on empty line, nmcli will quit. * If user pressed Ctrl-D on empty line, nmcli will quit.
* *
* Returns: the user provided string. In case the user entered empty string, * Returns: the user provided string. In case the user entered empty string,
@ -1168,11 +1172,23 @@ readline_mark:
for (;;) for (;;)
sleep (3); sleep (3);
} }
/* In case of Ctrl-C we call readline again to get new prompt (repeat) */ /* Ctrl-C */
if (nmc_seen_sigint ()) { if (nmc_seen_sigint ()) {
nmc_clear_sigint (); nmc_clear_sigint ();
g_free (str); if (nm_cli.in_editor || *str) {
goto readline_mark; /* In editor, or the line is not empty */
/* Call readline again to get new prompt (repeat) */
g_free (str);
goto readline_mark;
} else {
/* Not in editor and line is empty */
/* Send SIGQUIT to itself */
nmc_set_sigquit_internal ();
kill (getpid (), SIGQUIT);
/* Sleep in this thread so that we don't do anything else until exit */
for (;;)
sleep (3);
}
} }
g_free (prompt); g_free (prompt);

View file

@ -7982,6 +7982,9 @@ do_connection_edit (NmCli *nmc, int argc, char **argv)
editor_init_new_connection (nmc, connection); editor_init_new_connection (nmc, connection);
} }
/* nmcli runs the editor */
nmc->in_editor = TRUE;
printf ("\n"); printf ("\n");
printf (_("===| nmcli interactive connection editor |===")); printf (_("===| nmcli interactive connection editor |==="));
printf ("\n\n"); printf ("\n\n");

View file

@ -307,7 +307,6 @@ event_hook_for_readline (void)
/* Make readline() exit on SIGINT */ /* Make readline() exit on SIGINT */
if (nmc_seen_sigint ()) { if (nmc_seen_sigint ()) {
rl_echo_signal_char (SIGINT); rl_echo_signal_char (SIGINT);
rl_delete_text (0, rl_end);
rl_stuff_char ('\n'); rl_stuff_char ('\n');
} }
return 0; return 0;
@ -433,6 +432,7 @@ nmc_init (NmCli *nmc)
memset (&nmc->print_fields, '\0', sizeof (NmcPrintFields)); memset (&nmc->print_fields, '\0', sizeof (NmcPrintFields));
nmc->nocheck_ver = FALSE; nmc->nocheck_ver = FALSE;
nmc->ask = FALSE; nmc->ask = FALSE;
nmc->in_editor = FALSE;
nmc->editor_status_line = FALSE; nmc->editor_status_line = FALSE;
nmc->editor_save_confirmation = TRUE; nmc->editor_save_confirmation = TRUE;
nmc->editor_prompt_color = NMC_TERM_COLOR_NORMAL; nmc->editor_prompt_color = NMC_TERM_COLOR_NORMAL;

View file

@ -128,6 +128,7 @@ typedef struct _NmCli {
NmcPrintFields print_fields; /* Structure with field indices to print */ NmcPrintFields print_fields; /* Structure with field indices to print */
gboolean nocheck_ver; /* Don't check nmcli and NM versions: option '--nocheck' */ gboolean nocheck_ver; /* Don't check nmcli and NM versions: option '--nocheck' */
gboolean ask; /* Ask for missing parameters: option '--ask' */ gboolean ask; /* Ask for missing parameters: option '--ask' */
gboolean in_editor; /* Whether running the editor - nmcli con edit' */
gboolean editor_status_line; /* Whether to display status line in connection editor */ gboolean editor_status_line; /* Whether to display status line in connection editor */
gboolean editor_save_confirmation; /* Whether to ask for confirmation on saving connections with 'autoconnect=yes' */ gboolean editor_save_confirmation; /* Whether to ask for confirmation on saving connections with 'autoconnect=yes' */
NmcTermColor editor_prompt_color; /* Color of prompt in connection editor */ NmcTermColor editor_prompt_color; /* Color of prompt in connection editor */