kconfig: handle SIGINT in menuconfig
PATCH v2 1/1 kconfig: handle SIGINT in menuconfig
From: Davidlohr Bueso <[email protected]>
I recently got bitten in the ass when pressing Ctrl-C and lost all my current configuration changes. This patch captures SIGINT and allows the user to save any changes. Some code refactoring was made in order to handle the exit behavior.
--- scripts/kconfig/mconf.c | 86 ++++++++++++++++++++++++++++------------------ 1 files changed, 52 insertions(+), 34 deletions(-)
scripts/kconfig/mconf.c +52 -34
@@ -15,6 +15,7 @@#include <stdarg.h> #include <stdlib.h> #include <string.h> +#include <signal.h> #include <unistd.h> #include <locale.h>
@@ -272,6 +273,7 @@ static struct menu *current_menu;static int child_count;static int single_menu_mode;static int show_all_options; +static int saved_x, saved_y;static void conf (struct menu *menu);static void conf_choice (struct menu *menu);
@@ -792,9 +794,54 @@ static void conf_save(void) } } +static int handle_exit (void ) +{ +int res; + +dialog_clear (); +if (conf_get_changed ()) + res =dialog_yesno (NULL , +_ ("Do you wish to save your new configuration ?\n" +"<ESC><ESC> to continue." ), +6 ,60 ); +else + res =-1 ; + +end_dialog (saved_x, saved_y); + +switch (res) { +case 0 : +if (conf_write (filename)) { +fprintf (stderr,_ ("\n\n" +"Error while writing of the configuration.\n" +"Your configuration changes were NOT saved." +"\n\n" )); +return 1 ; + } +/* fall through */ +case -1 : +printf (_ ("\n\n" +"*** End of the configuration.\n" +"*** Execute 'make' to start the build or try 'make help'." +"\n\n" )); + res =0 ; +break ; +default : +fprintf (stderr,_ ("\n\n" +"Your configuration changes were NOT saved." +"\n\n" )); + } + +return res; +} + +static void sig_handler (int signo) +{ +exit (handle_exit ()); +} +int main (int ac,char **av) { -int saved_x, saved_y;char *mode;int res;
@@ -802,6 +849,8 @@ int main(int ac, char **av)bindtextdomain (PACKAGE ,LOCALEDIR );textdomain (PACKAGE ); +signal (SIGINT , sig_handler); +conf_parse (av[1 ]);conf_read (NULL );
@@ -823,40 +872,9 @@ int main(int ac, char **av)set_config_filename (conf_get_configname ());do {conf (&rootmenu); -dialog_clear (); -if (conf_get_changed ()) - res =dialog_yesno (NULL , -_ ("Do you wish to save your " -"new configuration?\n" -"<ESC><ESC> to continue." ), -6 ,60 ); -else - res =-1 ; + res =handle_exit (); }while (res ==KEY_ESC ); -end_dialog (saved_x, saved_y); - -switch (res) { -case 0 : -if (conf_write (filename)) { -fprintf (stderr,_ ("\n\n" -"Error while writing of the configuration.\n" -"Your configuration changes were NOT saved." -"\n\n" )); -return 1 ; - } -/* fall through */ -case -1 : -printf (_ ("\n\n" -"*** End of the configuration.\n" -"*** Execute 'make' to start the build or try 'make help'." -"\n\n" )); -break ; -default : -fprintf (stderr,_ ("\n\n" -"Your configuration changes were NOT saved." -"\n\n" )); - } -return 0 ; +return res; }
Signature · 1 line
1.7.4.1
Hi,
Quoted 5 lines · Davidlohr Bueso
From: Davidlohr Bueso <[email protected]>
I recently got bitten in the ass when pressing Ctrl-C and lost all my current configuration changes. This patch captures SIGINT and allows the user to save any changes. Some code refactoring was made in order to handle the exit behavior.
Looks mostly good, I'll give it a try to see if we did not miss corner-case.
Quoted 2 lines
Signed-off-by Davidlohr Bueso <[email protected]>Signed-off-by Arnaud Lacombe <[email protected]>
I never S.O.B. anything explicitly, please do not add my signature without my consent. That said, here it is:
:-)
Thanks,
- Arnaud
Quoted 138 lines
---
scripts/kconfig/mconf.c | 86 ++++++++++++++++++++++++++++------------------1 files changed, 52 insertions(+), 34 deletions(-)scripts/kconfig/mconf.c +52
-35@@ -15,6 +15,7 @@ #include <stdarg.h> #include <stdlib.h> #include <string.h> +#include <signal.h> #include <unistd.h> #include <locale.h>@@ -272,6 +273,7 @@ static struct menu *current_menu; static int child_count; static int single_menu_mode; static int show_all_options; +static int saved_x, saved_y; static void conf(struct menu *menu); static void conf_choice(struct menu *menu);@@ -792,9 +794,54 @@ static void conf_save(void) } } +static int handle_exit (void ) +{ + int res; + + dialog_clear(); + if (conf_get_changed()) + res = dialog_yesno(NULL, + _("Do you wish to save your new configuration ?\n" + "<ESC><ESC> to continue."), + 6, 60); + else + res = -1; + + end_dialog(saved_x, saved_y); + + switch (res) { + case 0: + if (conf_write(filename)) { + fprintf(stderr, _("\n\n" + "Error while writing of the configuration.\n" + "Your configuration changes were NOT saved." + "\n\n")); + return 1; + } + /* fall through */ + case -1: + printf(_("\n\n" + "*** End of the configuration.\n" + "*** Execute 'make' to start the build or try 'make help'." + "\n\n")); + res = 0; + break; + default: + fprintf(stderr, _("\n\n" + "Your configuration changes were NOT saved." + "\n\n")); + } + + return res; +} + +static void sig_handler (int signo) +{ + exit(handle_exit()); +} + int main(int ac, char **av) { - int saved_x, saved_y; char *mode; int res;@@ -802,6 +849,8 @@ int main(int ac, char **av) bindtextdomain(PACKAGE, LOCALEDIR); textdomain(PACKAGE); + signal(SIGINT, sig_handler); + conf_parse(av[1]); conf_read(NULL);@@ -823,40 +872,9 @@ int main(int ac, char **av) set_config_filename(conf_get_configname()); do { conf(&rootmenu); - dialog_clear(); - if (conf_get_changed()) - res = dialog_yesno(NULL, - _("Do you wish to save your " - "new configuration?\n" - "<ESC><ESC> to continue."), - 6, 60); - else - res = -1; + res = handle_exit(); } while (res == KEY_ESC); - end_dialog(saved_x, saved_y); - - switch (res) { - case 0: - if (conf_write(filename)) { - fprintf(stderr, _("\n\n" - "Error while writing of the configuration.\n" - "Your configuration changes were NOT saved." - "\n\n")); - return 1; - } - /* fall through */ - case -1: - printf(_("\n\n" - "*** End of the configuration.\n" - "*** Execute 'make' to start the build or try 'make help'." - "\n\n")); - break; - default: - fprintf(stderr, _("\n\n" - "Your configuration changes were NOT saved." - "\n\n")); - } - return 0; + return res; } --1.7.4.1
Hi,
Quoted 71 lines · Davidlohr Bueso
From: Davidlohr Bueso <[email protected]>
I recently got bitten in the ass when pressing Ctrl-C and lost all my current configuration changes. This patch captures SIGINT and allows the user to save any changes. Some code refactoring was made in order to handle the exit behavior.
Signed-off-by Davidlohr Bueso <[email protected]>Signed-off-by Arnaud Lacombe <[email protected]>---
scripts/kconfig/mconf.c | 86 ++++++++++++++++++++++++++++------------------1 files changed, 52 insertions(+), 34 deletions(-)scripts/kconfig/mconf.c +38
-0@@ -15,6 +15,7 @@ #include <stdarg.h> #include <stdlib.h> #include <string.h> +#include <signal.h> #include <unistd.h> #include <locale.h>@@ -272,6 +273,7 @@ static struct menu *current_menu; static int child_count; static int single_menu_mode; static int show_all_options; +static int saved_x, saved_y; static void conf(struct menu *menu); static void conf_choice(struct menu *menu);@@ -792,9 +794,54 @@ static void conf_save(void) } } +static int handle_exit (void ) +{ + int res; + + dialog_clear(); + if (conf_get_changed()) + res = dialog_yesno(NULL, + _("Do you wish to save your new configuration ?\n" + "<ESC><ESC> to continue."), + 6, 60); + else + res = -1; + + end_dialog(saved_x, saved_y); + + switch (res) { + case 0: + if (conf_write(filename)) { + fprintf(stderr, _("\n\n" + "Error while writing of the configuration.\n" + "Your configuration changes were NOT saved." + "\n\n")); + return 1; + } + /* fall through */ + case -1: + printf(_("\n\n" + "*** End of the configuration.\n" + "*** Execute 'make' to start the build or try 'make help'." + "\n\n")); + res = 0; + break; + default: + fprintf(stderr, _("\n\n" + "Your configuration changes were NOT saved." + "\n\n"));
scripts/kconfig/mconf.c static void conf_save(void) · line 842
Quoted 10 lines
scripts/kconfig/mconf.c +10
-0+ } + + return res; +} + +static void sig_handler (int signo) +{ + exit(handle_exit()); +} +
Actually, no matter what handle_exit() returns, the process will return error code 130 and make will abort. I'd suggest to get rid of the call to exit(), and only keep handle_exit().
any objection ?
- Arnaud
Quoted 64 lines
scripts/kconfig/mconf.c +4
-35int main(int ac, char **av) { - int saved_x, saved_y; char *mode; int res;@@ -802,6 +849,8 @@ int main(int ac, char **av) bindtextdomain(PACKAGE, LOCALEDIR); textdomain(PACKAGE); + signal(SIGINT, sig_handler); + conf_parse(av[1]); conf_read(NULL);@@ -823,40 +872,9 @@ int main(int ac, char **av) set_config_filename(conf_get_configname()); do { conf(&rootmenu); - dialog_clear(); - if (conf_get_changed()) - res = dialog_yesno(NULL, - _("Do you wish to save your " - "new configuration?\n" - "<ESC><ESC> to continue."), - 6, 60); - else - res = -1; + res = handle_exit(); } while (res == KEY_ESC); - end_dialog(saved_x, saved_y); - - switch (res) { - case 0: - if (conf_write(filename)) { - fprintf(stderr, _("\n\n" - "Error while writing of the configuration.\n" - "Your configuration changes were NOT saved." - "\n\n")); - return 1; - } - /* fall through */ - case -1: - printf(_("\n\n" - "*** End of the configuration.\n" - "*** Execute 'make' to start the build or try 'make help'." - "\n\n")); - break; - default: - fprintf(stderr, _("\n\n" - "Your configuration changes were NOT saved." - "\n\n")); - } - return 0; + return res; } --1.7.4.1
Hi,
Quoted 88 lines · Arnaud Lacombe
Hi,
Quoted 71 lines · Davidlohr Bueso
From: Davidlohr Bueso <[email protected]>
I recently got bitten in the ass when pressing Ctrl-C and lost all my current configuration changes. This patch captures SIGINT and allows the user to save any changes. Some code refactoring was made in order to handle the exit behavior.
Signed-off-by Davidlohr Bueso <[email protected]>Signed-off-by Arnaud Lacombe <[email protected]>---
scripts/kconfig/mconf.c | 86 ++++++++++++++++++++++++++++------------------1 files changed, 52 insertions(+), 34 deletions(-)scripts/kconfig/mconf.c +38
-0@@ -15,6 +15,7 @@ #include <stdarg.h> #include <stdlib.h> #include <string.h> +#include <signal.h> #include <unistd.h> #include <locale.h>@@ -272,6 +273,7 @@ static struct menu *current_menu; static int child_count; static int single_menu_mode; static int show_all_options; +static int saved_x, saved_y; static void conf(struct menu *menu); static void conf_choice(struct menu *menu);@@ -792,9 +794,54 @@ static void conf_save(void) } } +static int handle_exit (void ) +{ + int res; + + dialog_clear(); + if (conf_get_changed()) + res = dialog_yesno(NULL, + _("Do you wish to save your new configuration ?\n" + "<ESC><ESC> to continue."), + 6, 60); + else + res = -1; + + end_dialog(saved_x, saved_y); + + switch (res) { + case 0: + if (conf_write(filename)) { + fprintf(stderr, _("\n\n" + "Error while writing of the configuration.\n" + "Your configuration changes were NOT saved." + "\n\n")); + return 1; + } + /* fall through */ + case -1: + printf(_("\n\n" + "*** End of the configuration.\n" + "*** Execute 'make' to start the build or try 'make help'." + "\n\n")); + res = 0; + break; + default: + fprintf(stderr, _("\n\n" + "Your configuration changes were NOT saved." + "\n\n"));scripts/kconfig/mconf.c static void conf_save(void) · line 842
Quoted 10 lines
scripts/kconfig/mconf.c +10
-0+ } + + return res; +} + +static void sig_handler (int signo) +{ + exit(handle_exit()); +} +Actually, no matter what
handle_exit()returns, the process will return error code 130 and make will abort. I'd suggest to get rid of the call toexit(), and only keephandle_exit().
Quoted 2 lines
any objection ?
stupid me... we need the call to exit(2), but its argument do not seem to be used.
- Arnaud
Quoted 91 lines · Arnaud Lacombe
Hi,
Quoted 88 lines · Arnaud Lacombe
Hi,
Quoted 71 lines · Davidlohr Bueso
From: Davidlohr Bueso <[email protected]>
I recently got bitten in the ass when pressing Ctrl-C and lost all my current configuration changes. This patch captures SIGINT and allows the user to save any changes. Some code refactoring was made in order to handle the exit behavior.
Signed-off-by Davidlohr Bueso <[email protected]>Signed-off-by Arnaud Lacombe <[email protected]>--- scripts/kconfig/mconf.c | 86 ++++++++++++++++++++++++++++------------------ 1 files changed, 52 insertions(+), 34 deletions(-)scripts/kconfig/mconf.c +38
-0@@ -15,6 +15,7 @@#include <stdarg.h> #include <stdlib.h> #include <string.h> +#include <signal.h> #include <unistd.h> #include <locale.h> @@ -272,6 +273,7 @@ static struct menu *current_menu;static int child_count;static int single_menu_mode;static int show_all_options; +static int saved_x, saved_y;static void conf (struct menu *menu);static void conf_choice (struct menu *menu);@@ -792,9 +794,54 @@ static void conf_save(void) } } +static int handle_exit (void ) +{ +int res; + +dialog_clear (); +if (conf_get_changed ()) + res =dialog_yesno (NULL , +_ ("Do you wish to save your new configuration ?\n" +"<ESC><ESC> to continue." ), +6 ,60 ); +else + res =-1 ; + +end_dialog (saved_x, saved_y); + +switch (res) { +case 0 : +if (conf_write (filename)) { +fprintf (stderr,_ ("\n\n" +"Error while writing of the configuration.\n" +"Your configuration changes were NOT saved." +"\n\n" )); +return 1 ; + } +/* fall through */ +case -1 : +printf (_ ("\n\n" +"*** End of the configuration.\n" +"*** Execute 'make' to start the build or try 'make help'." +"\n\n" )); + res =0 ; +break ; +default : +fprintf (stderr,_ ("\n\n" +"Your configuration changes were NOT saved." +"\n\n" ));scripts/kconfig/mconf.c static void conf_save(void) · line 842
Quoted 10 lines
scripts/kconfig/mconf.c +10
-0+ } + +return res; +} + +static void sig_handler (int signo) +{ +exit (handle_exit ()); +} +Actually, no matter what
handle_exit()returns, the process will return error code 130 and make will abort. I'd suggest to get rid of the call toexit(), and only keephandle_exit().
Quoted 4 lines
Quoted 2 lines
any objection ?
stupid me... we need the call to exit(2), but its argument do not seem to be used.
Right otherwise we can't quit the program. The 130 exit code occurs because we're aborting the make process, nothing we can do about that, I think.
Thanks,
Davidlohr
Hi Michal
If you have no objections, can you pick this one up?
Thanks.
Davidlohr
Quoted 139 lines · Davidlohr Bueso
From: Davidlohr Bueso <[email protected]>
I recently got bitten in the ass when pressing Ctrl-C and lost all my current configuration changes. This patch captures SIGINT and allows the user to save any changes. Some code refactoring was made in order to handle the exit behavior.
Signed-off-by Davidlohr Bueso <[email protected]>Signed-off-by Arnaud Lacombe <[email protected]>--- scripts/kconfig/mconf.c | 86 ++++++++++++++++++++++++++++------------------ 1 files changed, 52 insertions(+), 34 deletions(-)scripts/kconfig/mconf.c +52
-34@@ -15,6 +15,7 @@#include <stdarg.h> #include <stdlib.h> #include <string.h> +#include <signal.h> #include <unistd.h> #include <locale.h> @@ -272,6 +273,7 @@ static struct menu *current_menu;static int child_count;static int single_menu_mode;static int show_all_options; +static int saved_x, saved_y;static void conf (struct menu *menu);static void conf_choice (struct menu *menu);@@ -792,9 +794,54 @@ static void conf_save(void) } } +static int handle_exit (void ) +{ +int res; + +dialog_clear (); +if (conf_get_changed ()) + res =dialog_yesno (NULL , +_ ("Do you wish to save your new configuration ?\n" +"<ESC><ESC> to continue." ), +6 ,60 ); +else + res =-1 ; + +end_dialog (saved_x, saved_y); + +switch (res) { +case 0 : +if (conf_write (filename)) { +fprintf (stderr,_ ("\n\n" +"Error while writing of the configuration.\n" +"Your configuration changes were NOT saved." +"\n\n" )); +return 1 ; + } +/* fall through */ +case -1 : +printf (_ ("\n\n" +"*** End of the configuration.\n" +"*** Execute 'make' to start the build or try 'make help'." +"\n\n" )); + res =0 ; +break ; +default : +fprintf (stderr,_ ("\n\n" +"Your configuration changes were NOT saved." +"\n\n" )); + } + +return res; +} + +static void sig_handler (int signo) +{ +exit (handle_exit ()); +} +int main (int ac,char **av) { -int saved_x, saved_y;char *mode;int res;@@ -802,6 +849,8 @@ int main(int ac, char **av)bindtextdomain (PACKAGE ,LOCALEDIR );textdomain (PACKAGE ); +signal (SIGINT , sig_handler); +conf_parse (av[1 ]);conf_read (NULL );@@ -823,40 +872,9 @@ int main(int ac, char **av)set_config_filename (conf_get_configname ());do {conf (&rootmenu); -dialog_clear (); -if (conf_get_changed ()) - res =dialog_yesno (NULL , -_ ("Do you wish to save your " -"new configuration?\n" -"<ESC><ESC> to continue." ), -6 ,60 ); -else - res =-1 ; + res =handle_exit (); }while (res ==KEY_ESC ); -end_dialog (saved_x, saved_y); - -switch (res) { -case 0 : -if (conf_write (filename)) { -fprintf (stderr,_ ("\n\n" -"Error while writing of the configuration.\n" -"Your configuration changes were NOT saved." -"\n\n" )); -return 1 ; - } -/* fall through */ -case -1 : -printf (_ ("\n\n" -"*** End of the configuration.\n" -"*** Execute 'make' to start the build or try 'make help'." -"\n\n" )); -break ; -default : -fprintf (stderr,_ ("\n\n" -"Your configuration changes were NOT saved." -"\n\n" )); - } -return 0 ; +return res; }
Hi,
Quoted 4 lines · Davidlohr Bueso
Hi Michal
If you have no objections, can you pick this one up?
I picked up in my tree while Michal was in vacation, he then merged that in his tree. I should have notified you.
- Arnaud
Quoted 146 lines
Thanks.
DavidlohrQuoted 139 lines · Davidlohr Bueso
From: Davidlohr Bueso <[email protected]>
I recently got bitten in the ass when pressing Ctrl-C and lost all my current configuration changes. This patch captures SIGINT and allows the user to save any changes. Some code refactoring was made in order to handle the exit behavior.
Signed-off-by Davidlohr Bueso <[email protected]>Signed-off-by Arnaud Lacombe <[email protected]>---
scripts/kconfig/mconf.c | 86 ++++++++++++++++++++++++++++------------------1 files changed, 52 insertions(+), 34 deletions(-)scripts/kconfig/mconf.c +52
-34@@ -15,6 +15,7 @@ #include <stdarg.h> #include <stdlib.h> #include <string.h> +#include <signal.h> #include <unistd.h> #include <locale.h>@@ -272,6 +273,7 @@ static struct menu *current_menu; static int child_count; static int single_menu_mode; static int show_all_options; +static int saved_x, saved_y; static void conf(struct menu *menu); static void conf_choice(struct menu *menu);@@ -792,9 +794,54 @@ static void conf_save(void) } } +static int handle_exit (void ) +{ + int res; + + dialog_clear(); + if (conf_get_changed()) + res = dialog_yesno(NULL, + _("Do you wish to save your new configuration ?\n" + "<ESC><ESC> to continue."), + 6, 60); + else + res = -1; + + end_dialog(saved_x, saved_y); + + switch (res) { + case 0: + if (conf_write(filename)) { + fprintf(stderr, _("\n\n" + "Error while writing of the configuration.\n" + "Your configuration changes were NOT saved." + "\n\n")); + return 1; + } + /* fall through */ + case -1: + printf(_("\n\n" + "*** End of the configuration.\n" + "*** Execute 'make' to start the build or try 'make help'." + "\n\n")); + res = 0; + break; + default: + fprintf(stderr, _("\n\n" + "Your configuration changes were NOT saved." + "\n\n")); + } + + return res; +} + +static void sig_handler (int signo) +{ + exit(handle_exit()); +} + int main(int ac, char **av) { - int saved_x, saved_y; char *mode; int res;@@ -802,6 +849,8 @@ int main(int ac, char **av) bindtextdomain(PACKAGE, LOCALEDIR); textdomain(PACKAGE); + signal(SIGINT, sig_handler); + conf_parse(av[1]); conf_read(NULL);@@ -823,40 +872,9 @@ int main(int ac, char **av) set_config_filename(conf_get_configname()); do { conf(&rootmenu); - dialog_clear(); - if (conf_get_changed()) - res = dialog_yesno(NULL, - _("Do you wish to save your " - "new configuration?\n" - "<ESC><ESC> to continue."), - 6, 60); - else - res = -1; + res = handle_exit(); } while (res == KEY_ESC); - end_dialog(saved_x, saved_y); - - switch (res) { - case 0: - if (conf_write(filename)) { - fprintf(stderr, _("\n\n" - "Error while writing of the configuration.\n" - "Your configuration changes were NOT saved." - "\n\n")); - return 1; - } - /* fall through */ - case -1: - printf(_("\n\n" - "*** End of the configuration.\n" - "*** Execute 'make' to start the build or try 'make help'." - "\n\n")); - break; - default: - fprintf(stderr, _("\n\n" - "Your configuration changes were NOT saved." - "\n\n")); - } - return 0; + return res; }