summaryrefslogtreecommitdiff
path: root/usr.bin
diff options
context:
space:
mode:
authorIngo Schwarze <schwarze@cvs.openbsd.org>2021-09-02 11:19:03 +0000
committerIngo Schwarze <schwarze@cvs.openbsd.org>2021-09-02 11:19:03 +0000
commitd1d9f3bd0421d0b1d3c10333d13ecc6a17ce6805 (patch)
tree0bfb8de66d0c292b378666c44ed8939a739f407b /usr.bin
parent8a143741d093ef3154f498d4546fdf5f3135b926 (diff)
Make all signal handler functions async-signal-safe
by deleting the redundant "killersig" struct member and using the existing sig_atomic_t cl_sigterm variable instead. While here, garbage collect the h_hup() signal handler which is essentially identical to h_term(). This also gets rid of the last #define & #undef in cl_main.c. OK martijn@, and also tested by Tim <trondd at kagu hyphen tsuchi dot com>.
Diffstat (limited to 'usr.bin')
-rw-r--r--usr.bin/vi/cl/cl.h4
-rw-r--r--usr.bin/vi/cl/cl_funcs.c6
-rw-r--r--usr.bin/vi/cl/cl_main.c31
-rw-r--r--usr.bin/vi/cl/cl_read.c10
4 files changed, 17 insertions, 34 deletions
diff --git a/usr.bin/vi/cl/cl.h b/usr.bin/vi/cl/cl.h
index bfef0dc225a..8613313a0a5 100644
--- a/usr.bin/vi/cl/cl.h
+++ b/usr.bin/vi/cl/cl.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: cl.h,v 1.11 2021/09/01 14:28:15 schwarze Exp $ */
+/* $OpenBSD: cl.h,v 1.12 2021/09/02 11:19:02 schwarze Exp $ */
/*-
* Copyright (c) 1993, 1994
@@ -11,7 +11,6 @@
* @(#)cl.h 10.19 (Berkeley) 9/24/96
*/
-extern volatile sig_atomic_t cl_sighup;
extern volatile sig_atomic_t cl_sigint;
extern volatile sig_atomic_t cl_sigterm;
extern volatile sig_atomic_t cl_sigwinch;
@@ -31,7 +30,6 @@ typedef struct _cl_private {
char *rmso, *smso; /* Inverse video terminal strings. */
char *smcup, *rmcup; /* Terminal start/stop strings. */
- int killersig; /* Killer signal. */
#define INDX_HUP 0
#define INDX_INT 1
#define INDX_TERM 2
diff --git a/usr.bin/vi/cl/cl_funcs.c b/usr.bin/vi/cl/cl_funcs.c
index eeb6046358f..24b18c675bf 100644
--- a/usr.bin/vi/cl/cl_funcs.c
+++ b/usr.bin/vi/cl/cl_funcs.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: cl_funcs.c,v 1.21 2021/09/01 14:28:15 schwarze Exp $ */
+/* $OpenBSD: cl_funcs.c,v 1.22 2021/09/02 11:19:02 schwarze Exp $ */
/*-
* Copyright (c) 1993, 1994
@@ -437,7 +437,7 @@ cl_refresh(SCR *sp, int repaint)
* If we received a killer signal, we're done, there's no point
* in refreshing the screen.
*/
- if (clp->killersig)
+ if (cl_sigterm)
return (0);
/*
@@ -582,7 +582,7 @@ cl_suspend(SCR *sp, int *allowedp)
* unchanged. In addition, the terminal has already been reset
* correctly, so leave it alone.
*/
- if (clp->killersig) {
+ if (cl_sigterm) {
F_CLR(clp, CL_SCR_EX_INIT | CL_SCR_VI_INIT);
return (0);
}
diff --git a/usr.bin/vi/cl/cl_main.c b/usr.bin/vi/cl/cl_main.c
index 4cd624e72bf..5c38139c76d 100644
--- a/usr.bin/vi/cl/cl_main.c
+++ b/usr.bin/vi/cl/cl_main.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: cl_main.c,v 1.34 2021/09/01 14:28:15 schwarze Exp $ */
+/* $OpenBSD: cl_main.c,v 1.35 2021/09/02 11:19:02 schwarze Exp $ */
/*-
* Copyright (c) 1993, 1994
@@ -33,7 +33,6 @@
GS *__global_list; /* GLOBAL: List of screens. */
-volatile sig_atomic_t cl_sighup;
volatile sig_atomic_t cl_sigint;
volatile sig_atomic_t cl_sigterm;
volatile sig_atomic_t cl_sigwinch;
@@ -120,9 +119,9 @@ main(int argc, char *argv[])
}
/* If a killer signal arrived, pretend we just got it. */
- if (clp->killersig) {
- (void)signal(clp->killersig, SIG_DFL);
- (void)kill(getpid(), clp->killersig);
+ if (cl_sigterm) {
+ (void)signal(cl_sigterm, SIG_DFL);
+ (void)kill(getpid(), cl_sigterm);
/* NOTREACHED */
}
@@ -215,17 +214,6 @@ term_init(char *ttype)
}
}
-#define GLOBAL_CLP \
- CL_PRIVATE *clp = GCLP(__global_list);
-static void
-h_hup(int signo)
-{
- GLOBAL_CLP;
-
- cl_sighup = 1;
- clp->killersig = SIGHUP;
-}
-
static void
h_int(int signo)
{
@@ -235,10 +223,7 @@ h_int(int signo)
static void
h_term(int signo)
{
- GLOBAL_CLP;
-
- cl_sigterm = 1;
- clp->killersig = SIGTERM;
+ cl_sigterm = signo;
}
static void
@@ -246,7 +231,6 @@ h_winch(int signo)
{
cl_sigwinch = 1;
}
-#undef GLOBAL_CLP
/*
* sig_init --
@@ -261,20 +245,19 @@ sig_init(GS *gp, SCR *sp)
clp = GCLP(gp);
- cl_sighup = 0;
cl_sigint = 0;
cl_sigterm = 0;
cl_sigwinch = 0;
if (sp == NULL) {
- if (setsig(SIGHUP, &clp->oact[INDX_HUP], h_hup) ||
+ if (setsig(SIGHUP, &clp->oact[INDX_HUP], h_term) ||
setsig(SIGINT, &clp->oact[INDX_INT], h_int) ||
setsig(SIGTERM, &clp->oact[INDX_TERM], h_term) ||
setsig(SIGWINCH, &clp->oact[INDX_WINCH], h_winch)
)
err(1, NULL);
} else
- if (setsig(SIGHUP, NULL, h_hup) ||
+ if (setsig(SIGHUP, NULL, h_term) ||
setsig(SIGINT, NULL, h_int) ||
setsig(SIGTERM, NULL, h_term) ||
setsig(SIGWINCH, NULL, h_winch)
diff --git a/usr.bin/vi/cl/cl_read.c b/usr.bin/vi/cl/cl_read.c
index aa3e1ba0dd4..0e4166aa146 100644
--- a/usr.bin/vi/cl/cl_read.c
+++ b/usr.bin/vi/cl/cl_read.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: cl_read.c,v 1.22 2021/09/01 14:28:15 schwarze Exp $ */
+/* $OpenBSD: cl_read.c,v 1.23 2021/09/02 11:19:02 schwarze Exp $ */
/*-
* Copyright (c) 1993, 1994
@@ -62,13 +62,15 @@ retest: if (LF_ISSET(EC_INTERRUPT) || cl_sigint) {
evp->e_event = E_TIMEOUT;
return (0);
}
- if (cl_sighup) {
+ switch (cl_sigterm) {
+ case SIGHUP:
evp->e_event = E_SIGHUP;
return (0);
- }
- if (cl_sigterm) {
+ case SIGTERM:
evp->e_event = E_SIGTERM;
return (0);
+ default:
+ break;
}
if (cl_sigwinch) {
cl_sigwinch = 0;