Skip to content

Commit 35c6c07

Browse files
author
Bogdan Boyadzhiev
committed
fixed a bug: terminal mode were not restored upon error or upon interrupt
1 parent 18eb369 commit 35c6c07

File tree

1 file changed

+25
-1
lines changed

1 file changed

+25
-1
lines changed

jruls.c

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
#include <errno.h>
55
#include <inttypes.h>
66
#include <locale.h>
7+
#include <signal.h>
78
#include <stdio.h>
89
#include <stdlib.h>
910
#include <string.h>
@@ -20,6 +21,7 @@ static int cw_jid = 3, cw_name = 20, cw_pct = 4, cw_mem = 6;
2021
static int cw_iops = 5, cw_iovol = 6, cw_cnt = 5;
2122

2223
static int smart_terminal = 1;
24+
static volatile int done = 0;
2325

2426
static void print_n(uint64_t v, int colwidth);
2527
static void print_nmp(uint64_t v, int colwidth);
@@ -209,6 +211,23 @@ init_io(void)
209211
}
210212

211213

214+
static void
215+
restore_io(void)
216+
{
217+
if (smart_terminal) {
218+
endwin();
219+
}
220+
}
221+
222+
223+
static void
224+
signal_done(int signo)
225+
{
226+
(void)signo;
227+
done = 1;
228+
}
229+
230+
212231
static int
213232
usage(void)
214233
{
@@ -276,7 +295,12 @@ main(int argc, char *argv[])
276295
jailparam_import_raw(&param[2], name, sizeof name) == -1)
277296
errx(EX_OSERR, "jailparam_import_raw: %s", jail_errmsg);
278297

298+
if (signal(SIGINT, &signal_done) == SIG_ERR ||
299+
signal(SIGTERM, &signal_done) == SIG_ERR)
300+
warn("signal");
301+
279302
init_io();
303+
atexit(&restore_io);
280304

281305
if (count == INT_MAX && !smart_terminal) {
282306
count = 1;
@@ -305,6 +329,6 @@ main(int argc, char *argv[])
305329
sleep(sleep_itv);
306330
puts("");
307331
}
308-
} while (--count > 0);
332+
} while (--count > 0 && !done);
309333
return 0;
310334
}

0 commit comments

Comments
 (0)