mirror of
https://github.com/MariaDB/server.git
synced 2025-07-29 05:21:33 +03:00
WL#5945 : Improve libedit library
Updated libedit library.
This commit is contained in:
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: sig.c,v 1.12 2008/09/10 15:45:37 christos Exp $ */
|
||||
/* $NetBSD: sig.c,v 1.17 2011/07/28 20:50:55 christos Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 1992, 1993
|
||||
@ -57,15 +57,15 @@ private const int sighdl[] = {
|
||||
- 1
|
||||
};
|
||||
|
||||
private void el_sig_handler(int);
|
||||
private void sig_handler(int);
|
||||
|
||||
/* el_sig_handler():
|
||||
/* sig_handler():
|
||||
* This is the handler called for all signals
|
||||
* XXX: we cannot pass any data so we just store the old editline
|
||||
* state in a private variable
|
||||
*/
|
||||
private void
|
||||
el_sig_handler(int signo)
|
||||
sig_handler(int signo)
|
||||
{
|
||||
int i;
|
||||
sigset_t nset, oset;
|
||||
@ -74,12 +74,14 @@ el_sig_handler(int signo)
|
||||
(void) sigaddset(&nset, signo);
|
||||
(void) sigprocmask(SIG_BLOCK, &nset, &oset);
|
||||
|
||||
sel->el_signal->sig_no = signo;
|
||||
|
||||
switch (signo) {
|
||||
case SIGCONT:
|
||||
tty_rawmode(sel);
|
||||
if (ed_redisplay(sel, 0) == CC_REFRESH)
|
||||
re_refresh(sel);
|
||||
term__flush(sel);
|
||||
terminal__flush(sel);
|
||||
break;
|
||||
|
||||
case SIGWINCH:
|
||||
@ -95,7 +97,10 @@ el_sig_handler(int signo)
|
||||
if (signo == sighdl[i])
|
||||
break;
|
||||
|
||||
(void) signal(signo, sel->el_signal[i]);
|
||||
(void) sigaction(signo, &sel->el_signal->sig_action[i], NULL);
|
||||
sel->el_signal->sig_action[i].sa_handler = SIG_ERR;
|
||||
sel->el_signal->sig_action[i].sa_flags = 0;
|
||||
sigemptyset(&sel->el_signal->sig_action[i].sa_mask);
|
||||
(void) sigprocmask(SIG_SETMASK, &oset, NULL);
|
||||
(void) kill(0, signo);
|
||||
}
|
||||
@ -107,26 +112,29 @@ el_sig_handler(int signo)
|
||||
protected int
|
||||
sig_init(EditLine *el)
|
||||
{
|
||||
int i;
|
||||
sigset_t nset, oset;
|
||||
size_t i;
|
||||
sigset_t *nset, oset;
|
||||
|
||||
(void) sigemptyset(&nset);
|
||||
#define _DO(a) (void) sigaddset(&nset, a);
|
||||
el->el_signal = el_malloc(sizeof(*el->el_signal));
|
||||
if (el->el_signal == NULL)
|
||||
return -1;
|
||||
|
||||
nset = &el->el_signal->sig_set;
|
||||
(void) sigemptyset(nset);
|
||||
#define _DO(a) (void) sigaddset(nset, a);
|
||||
ALLSIGS
|
||||
#undef _DO
|
||||
(void) sigprocmask(SIG_BLOCK, &nset, &oset);
|
||||
(void) sigprocmask(SIG_BLOCK, nset, &oset);
|
||||
|
||||
#define SIGSIZE (sizeof(sighdl) / sizeof(sighdl[0]) * sizeof(el_signalhandler_t))
|
||||
|
||||
el->el_signal = (el_signalhandler_t *) el_malloc(SIGSIZE);
|
||||
if (el->el_signal == NULL)
|
||||
return (-1);
|
||||
for (i = 0; sighdl[i] != -1; i++)
|
||||
el->el_signal[i] = SIG_ERR;
|
||||
for (i = 0; sighdl[i] != -1; i++) {
|
||||
el->el_signal->sig_action[i].sa_handler = SIG_ERR;
|
||||
el->el_signal->sig_action[i].sa_flags = 0;
|
||||
sigemptyset(&el->el_signal->sig_action[i].sa_mask);
|
||||
}
|
||||
|
||||
(void) sigprocmask(SIG_SETMASK, &oset, NULL);
|
||||
|
||||
return (0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@ -137,7 +145,7 @@ protected void
|
||||
sig_end(EditLine *el)
|
||||
{
|
||||
|
||||
el_free((ptr_t) el->el_signal);
|
||||
el_free(el->el_signal);
|
||||
el->el_signal = NULL;
|
||||
}
|
||||
|
||||
@ -148,20 +156,21 @@ sig_end(EditLine *el)
|
||||
protected void
|
||||
sig_set(EditLine *el)
|
||||
{
|
||||
int i;
|
||||
sigset_t nset, oset;
|
||||
size_t i;
|
||||
sigset_t oset;
|
||||
struct sigaction osa, nsa;
|
||||
|
||||
(void) sigemptyset(&nset);
|
||||
#define _DO(a) (void) sigaddset(&nset, a);
|
||||
ALLSIGS
|
||||
#undef _DO
|
||||
(void) sigprocmask(SIG_BLOCK, &nset, &oset);
|
||||
nsa.sa_handler = sig_handler;
|
||||
nsa.sa_flags = 0;
|
||||
sigemptyset(&nsa.sa_mask);
|
||||
|
||||
(void) sigprocmask(SIG_BLOCK, &el->el_signal->sig_set, &oset);
|
||||
|
||||
for (i = 0; sighdl[i] != -1; i++) {
|
||||
el_signalhandler_t s;
|
||||
/* This could happen if we get interrupted */
|
||||
if ((s = signal(sighdl[i], el_sig_handler)) != el_sig_handler)
|
||||
el->el_signal[i] = s;
|
||||
if (sigaction(sighdl[i], &nsa, &osa) != -1 &&
|
||||
osa.sa_handler != sig_handler)
|
||||
el->el_signal->sig_action[i] = osa;
|
||||
}
|
||||
sel = el;
|
||||
(void) sigprocmask(SIG_SETMASK, &oset, NULL);
|
||||
@ -174,20 +183,17 @@ sig_set(EditLine *el)
|
||||
protected void
|
||||
sig_clr(EditLine *el)
|
||||
{
|
||||
int i;
|
||||
sigset_t nset, oset;
|
||||
size_t i;
|
||||
sigset_t oset;
|
||||
|
||||
(void) sigemptyset(&nset);
|
||||
#define _DO(a) (void) sigaddset(&nset, a);
|
||||
ALLSIGS
|
||||
#undef _DO
|
||||
(void) sigprocmask(SIG_BLOCK, &nset, &oset);
|
||||
(void) sigprocmask(SIG_BLOCK, &el->el_signal->sig_set, &oset);
|
||||
|
||||
for (i = 0; sighdl[i] != -1; i++)
|
||||
if (el->el_signal[i] != SIG_ERR)
|
||||
(void) signal(sighdl[i], el->el_signal[i]);
|
||||
if (el->el_signal->sig_action[i].sa_handler != SIG_ERR)
|
||||
(void)sigaction(sighdl[i],
|
||||
&el->el_signal->sig_action[i], NULL);
|
||||
|
||||
sel = NULL; /* we are going to die if the handler is
|
||||
* called */
|
||||
(void) sigprocmask(SIG_SETMASK, &oset, NULL);
|
||||
(void)sigprocmask(SIG_SETMASK, &oset, NULL);
|
||||
}
|
||||
|
Reference in New Issue
Block a user