From 08c03d5ebbbb2531fd82149d10332e9794328e5d Mon Sep 17 00:00:00 2001 From: Thomas Mannay Date: Tue, 10 Jan 2017 21:58:33 +0000 Subject: [PATCH] ed: ignore signals inside of join() --- ed.c | 59 +++++++++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 43 insertions(+), 16 deletions(-) diff --git a/ed.c b/ed.c index 4b28848..c8847c7 100644 --- a/ed.c +++ b/ed.c @@ -65,6 +65,22 @@ static struct undo udata; static int newcmd; int eol, bol; +static int block; +static int intr, hup; +static void sigintr(int); +static void sighup(int); + +static void +unblock(void) +{ + block = 0; + /* the arguments to signals aren't used, so 0 is fine */ + if (intr) + sigintr(0); + if (hup) + sighup(0); +} + static void discard(void) { @@ -811,9 +827,9 @@ join(void) int i; char *t, c; size_t len = 0, cap = 0; - static char *s; + char *s; - free(s); + block = 1; for (s = NULL, i = line1;; i = nextln(i)) { for (t = gettxt(i); (c = *t) != '\n'; ++t) s = addchar(*t, s, &cap, &len); @@ -826,6 +842,7 @@ join(void) delete(line1, line2); inject(s, 1); free(s); + unblock(); } static void @@ -1339,8 +1356,13 @@ usage(void) static void sigintr(int n) { - signal(SIGINT, sigintr); - error("interrupt"); + if (block) { + intr = 1; + } else { + intr = 0; + signal(SIGINT, sigintr); + error("interrupt"); + } } static void @@ -1349,20 +1371,25 @@ sighup(int dummy) int n; char *home = getenv("HOME"), fname[FILENAME_MAX]; - if (modflag) { - line1 = nextln(0); - line2 = lastln; - if (!setjmp(savesp)) { - dowrite("ed.hup", 1); - } else if (home && !setjmp(savesp)) { - n = snprintf(fname, - sizeof(fname), "%s/%s", home, "ed.hup"); - if (n < sizeof(fname) && n > 0) - dowrite(fname, 1); + if (block) { + hup = 1; + } else { + hup = 0; + if (modflag) { + line1 = nextln(0); + line2 = lastln; + if (!setjmp(savesp)) { + dowrite("ed.hup", 1); + } else if (home && !setjmp(savesp)) { + n = snprintf(fname, sizeof(fname), "%s/%s", + home, "ed.hup"); + if (n < sizeof(fname) && n > 0) + dowrite(fname, 1); + } } + exstatus = 1; + quit(); } - exstatus = 1; - quit(); } static void -- 2.11.0