Message ID | 1313975049.2393.8.camel@offbook (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Hi, On Sun, Aug 21, 2011 at 9:04 PM, Davidlohr Bueso <dave@gnu.org> wrote: > From: Davidlohr Bueso <dave@gnu.org> > > 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. > Signed-off-by: Davidlohr Bueso <dave@gnu.org> > Signed-off-by: Arnaud Lacombe <lacombar@gmail.com> I never S.O.B. anything explicitly, please do not add my signature without my consent. That said, here it is: Signed-off-by: Arnaud Lacombe <lacombar@gmail.com> :-) Thanks, - Arnaud > --- > scripts/kconfig/mconf.c | 86 ++++++++++++++++++++++++++++------------------ > 1 files changed, 52 insertions(+), 34 deletions(-) > > diff --git a/scripts/kconfig/mconf.c b/scripts/kconfig/mconf.c > index 820d2b6..19e200d 100644 > --- a/scripts/kconfig/mconf.c > +++ b/scripts/kconfig/mconf.c > @@ -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 > > > > -- To unsubscribe from this list: send the line "unsubscribe linux-kbuild" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Hi, On Sun, Aug 21, 2011 at 9:04 PM, Davidlohr Bueso <dave@gnu.org> wrote: > From: Davidlohr Bueso <dave@gnu.org> > > 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 <dave@gnu.org> > Signed-off-by: Arnaud Lacombe <lacombar@gmail.com> > --- > scripts/kconfig/mconf.c | 86 ++++++++++++++++++++++++++++------------------ > 1 files changed, 52 insertions(+), 34 deletions(-) > > diff --git a/scripts/kconfig/mconf.c b/scripts/kconfig/mconf.c > index 820d2b6..19e200d 100644 > --- a/scripts/kconfig/mconf.c > +++ b/scripts/kconfig/mconf.c > @@ -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()); > +} > + 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 > 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 > > > > -- To unsubscribe from this list: send the line "unsubscribe linux-kbuild" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Hi, On Mon, Aug 29, 2011 at 9:55 PM, Arnaud Lacombe <lacombar@gmail.com> wrote: > Hi, > > On Sun, Aug 21, 2011 at 9:04 PM, Davidlohr Bueso <dave@gnu.org> wrote: >> From: Davidlohr Bueso <dave@gnu.org> >> >> 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 <dave@gnu.org> >> Signed-off-by: Arnaud Lacombe <lacombar@gmail.com> >> --- >> scripts/kconfig/mconf.c | 86 ++++++++++++++++++++++++++++------------------ >> 1 files changed, 52 insertions(+), 34 deletions(-) >> >> diff --git a/scripts/kconfig/mconf.c b/scripts/kconfig/mconf.c >> index 820d2b6..19e200d 100644 >> --- a/scripts/kconfig/mconf.c >> +++ b/scripts/kconfig/mconf.c >> @@ -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()); >> +} >> + > 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 ? > stupid me... we need the call to exit(2), but its argument do not seem to be used. - Arnaud -- To unsubscribe from this list: send the line "unsubscribe linux-kbuild" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On Mon, 2011-08-29 at 22:12 -0400, Arnaud Lacombe wrote: > Hi, > > On Mon, Aug 29, 2011 at 9:55 PM, Arnaud Lacombe <lacombar@gmail.com> wrote: > > Hi, > > > > On Sun, Aug 21, 2011 at 9:04 PM, Davidlohr Bueso <dave@gnu.org> wrote: > >> From: Davidlohr Bueso <dave@gnu.org> > >> > >> 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 <dave@gnu.org> > >> Signed-off-by: Arnaud Lacombe <lacombar@gmail.com> > >> --- > >> scripts/kconfig/mconf.c | 86 ++++++++++++++++++++++++++++------------------ > >> 1 files changed, 52 insertions(+), 34 deletions(-) > >> > >> diff --git a/scripts/kconfig/mconf.c b/scripts/kconfig/mconf.c > >> index 820d2b6..19e200d 100644 > >> --- a/scripts/kconfig/mconf.c > >> +++ b/scripts/kconfig/mconf.c > >> @@ -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()); > >> +} > >> + > > 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 ? > > > 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 -- To unsubscribe from this list: send the line "unsubscribe linux-kbuild" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Hi Michal If you have no objections, can you pick this one up? Thanks. Davidlohr On Sun, 2011-08-21 at 22:04 -0300, Davidlohr Bueso wrote: > From: Davidlohr Bueso <dave@gnu.org> > > 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 <dave@gnu.org> > Signed-off-by: Arnaud Lacombe <lacombar@gmail.com> > --- > scripts/kconfig/mconf.c | 86 ++++++++++++++++++++++++++++------------------ > 1 files changed, 52 insertions(+), 34 deletions(-) > > diff --git a/scripts/kconfig/mconf.c b/scripts/kconfig/mconf.c > index 820d2b6..19e200d 100644 > --- a/scripts/kconfig/mconf.c > +++ b/scripts/kconfig/mconf.c > @@ -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; > } > -- To unsubscribe from this list: send the line "unsubscribe linux-kbuild" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Hi, On Wed, Sep 7, 2011 at 9:30 AM, Davidlohr Bueso <dave@gnu.org> wrote: > 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 > Thanks. > Davidlohr > > On Sun, 2011-08-21 at 22:04 -0300, Davidlohr Bueso wrote: >> From: Davidlohr Bueso <dave@gnu.org> >> >> 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 <dave@gnu.org> >> Signed-off-by: Arnaud Lacombe <lacombar@gmail.com> >> --- >> scripts/kconfig/mconf.c | 86 ++++++++++++++++++++++++++++------------------ >> 1 files changed, 52 insertions(+), 34 deletions(-) >> >> diff --git a/scripts/kconfig/mconf.c b/scripts/kconfig/mconf.c >> index 820d2b6..19e200d 100644 >> --- a/scripts/kconfig/mconf.c >> +++ b/scripts/kconfig/mconf.c >> @@ -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; >> } >> > > > -- To unsubscribe from this list: send the line "unsubscribe linux-kbuild" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/scripts/kconfig/mconf.c b/scripts/kconfig/mconf.c index 820d2b6..19e200d 100644 --- a/scripts/kconfig/mconf.c +++ b/scripts/kconfig/mconf.c @@ -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; }