summaryrefslogtreecommitdiffstats
path: root/disk-utils
diff options
context:
space:
mode:
authorKarel Zak2017-09-26 12:47:50 +0200
committerKarel Zak2017-09-26 12:47:50 +0200
commit502c5186d3086c25184ccf67a391d8a62bd53944 (patch)
tree710b3521825a2bdb034b961590b71b3d3e086cee /disk-utils
parentcfdisk: make resize code more readable (diff)
downloadkernel-qcow2-util-linux-502c5186d3086c25184ccf67a391d8a62bd53944.tar.gz
kernel-qcow2-util-linux-502c5186d3086c25184ccf67a391d8a62bd53944.tar.xz
kernel-qcow2-util-linux-502c5186d3086c25184ccf67a391d8a62bd53944.zip
cfdisk: cleanup die-on-signal code
Let's keep signal handler simple and don't cleanup terminal from the handler. Signed-off-by: Karel Zak <kzak@redhat.com>
Diffstat (limited to 'disk-utils')
-rw-r--r--disk-utils/cfdisk.c63
1 files changed, 47 insertions, 16 deletions
diff --git a/disk-utils/cfdisk.c b/disk-utils/cfdisk.c
index 55549823f..286f88abb 100644
--- a/disk-utils/cfdisk.c
+++ b/disk-utils/cfdisk.c
@@ -134,6 +134,7 @@ static struct cfdisk_menu *menu_push(struct cfdisk *cf, struct cfdisk_menuitem *
static struct cfdisk_menu *menu_pop(struct cfdisk *cf);
static void menu_refresh_size(struct cfdisk *cf);
+static int ui_end(void);
static int ui_refresh(struct cfdisk *cf);
static void ui_warnx(const char *fmt, ...);
static void ui_warn(const char *fmt, ...);
@@ -146,7 +147,8 @@ static int ui_get_size(struct cfdisk *cf, const char *prompt, uintmax_t *res,
uintmax_t low, uintmax_t up, int *expsize);
static int ui_enabled;
-static int sig_resize;
+static volatile sig_atomic_t sig_resize;
+static volatile sig_atomic_t sig_die;
/* ncurses LINES and COLS may be actual variables or *macros*, but we need
* something portable and writable */
@@ -279,6 +281,13 @@ static int cols_init(struct cfdisk *cf)
return fdisk_label_get_fields_ids(NULL, cf->cxt, &cf->fields, &cf->nfields);
}
+static void die_on_signal(void)
+{
+ DBG(MISC, ul_debug("die on signal."));
+ ui_end();
+ exit(EXIT_FAILURE);
+}
+
static void resize(void)
{
struct winsize ws;
@@ -575,9 +584,11 @@ static int ask_menu(struct fdisk_ask *ask, struct cfdisk *cf)
refresh();
/* wait for keys */
- do {
+ while (!sig_die) {
key = getch();
+ if (sig_die)
+ break;
if (sig_resize)
ui_menu_resize(cf);
if (ui_menu_move(cf, key) == 0)
@@ -594,7 +605,10 @@ static int ask_menu(struct fdisk_ask *ask, struct cfdisk *cf)
free(cm);
return 0;
}
- } while (1);
+ }
+
+ if (sig_die)
+ die_on_signal();
menu_pop(cf);
free(cm);
@@ -784,16 +798,14 @@ static void ui_clean_hint(void)
clrtoeol();
}
-static void die_on_signal(int dummy __attribute__((__unused__)))
+
+static void sig_handler_die(int dummy __attribute__((__unused__)))
{
- DBG(MISC, ul_debug("die on signal."));
- ui_end();
- exit(EXIT_FAILURE);
+ sig_die = 1;
}
static void sig_handler_resize(int dummy __attribute__((__unused__)))
{
- DBG(MISC, ul_debug("resize on signal."));
sig_resize = 1;
}
@@ -922,7 +934,7 @@ static int ui_init(struct cfdisk *cf __attribute__((__unused__)))
/* setup SIGCHLD handler */
sigemptyset(&sa.sa_mask);
sa.sa_flags = 0;
- sa.sa_handler = die_on_signal;
+ sa.sa_handler = sig_handler_die;
sigaction(SIGINT, &sa, NULL);
sigaction(SIGTERM, &sa, NULL);
@@ -1746,7 +1758,7 @@ static ssize_t ui_get_string(const char *prompt,
curs_set(1);
- while (1) {
+ while (!sig_die) {
wint_t c; /* we have fallback in widechar.h */
move(ln, cl);
@@ -1761,6 +1773,8 @@ static ssize_t ui_get_string(const char *prompt,
#else
if ((c = getch()) == (wint_t) ERR) {
#endif
+ if (sig_die)
+ break;
if (sig_resize) {
resize();
continue;
@@ -1813,6 +1827,9 @@ static ssize_t ui_get_string(const char *prompt,
beep();
}
+ if (sig_die)
+ die_on_signal();
+
rc = strlen(edit->buf); /* success */
done:
move(ln, 0);
@@ -1952,9 +1969,11 @@ static struct fdisk_parttype *ui_get_parttype(struct cfdisk *cf,
ui_draw_menu(cf);
refresh();
- do {
+ while (!sig_die) {
int key = getch();
+ if (sig_die)
+ break;
if (sig_resize)
ui_menu_resize(cf);
if (ui_menu_move(cf, key) == 0)
@@ -1973,8 +1992,10 @@ static struct fdisk_parttype *ui_get_parttype(struct cfdisk *cf,
case 'Q':
goto done;
}
- } while (1);
+ }
+ if (sig_die)
+ die_on_signal();
done:
menu_pop(cf);
if (codetypes) {
@@ -2098,7 +2119,7 @@ static int ui_create_label(struct cfdisk *cf)
ui_info(_("Device does not contain a recognized partition table."));
- do {
+ while (!sig_die) {
int key;
if (refresh_menu) {
@@ -2110,6 +2131,8 @@ static int ui_create_label(struct cfdisk *cf)
key = getch();
+ if (sig_die)
+ break;
if (sig_resize)
ui_menu_resize(cf);
if (ui_menu_move(cf, key) == 0)
@@ -2134,8 +2157,10 @@ static int ui_create_label(struct cfdisk *cf)
refresh_menu = 1;
break;
}
- } while (1);
+ }
+ if (sig_die)
+ die_on_signal();
done:
menu_pop(cf);
free(cm);
@@ -2186,6 +2211,9 @@ static int ui_help(void)
ui_info(_("Press a key to continue."));
getch();
+
+ if (sig_die)
+ die_on_signal();
return 0;
}
@@ -2516,10 +2544,13 @@ static int ui_run(struct cfdisk *cf)
else if (cf->wrong_order)
ui_info(_("Note that partition table entries are not in disk order now."));
- do {
+ while (!sig_die) {
int key = getch();
rc = 0;
+
+ if (sig_die)
+ break;
if (sig_resize)
/* Note that ncurses getch() returns ERR when interrupted
* by signal, but SLang does not interrupt at all. */
@@ -2582,7 +2613,7 @@ static int ui_run(struct cfdisk *cf)
if (rc == 1)
break; /* quit */
- } while (1);
+ }
menu_pop(cf);