mirror of
https://github.com/dankamongmen/notcurses
synced 2025-03-09 09:09:03 -04:00
[signals] hand signo back to fatal sig handler to correct output #2842
This commit is contained in:
parent
bbb6781ca1
commit
bf5e78c48e
@ -832,7 +832,7 @@ int ncdirect_printf_aligned(ncdirect* n, int y, ncalign_e align, const char* fmt
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
ncdirect_stop_minimal(void* vnc, void** altstack){
|
ncdirect_stop_minimal(void* vnc, void** altstack, int errret){
|
||||||
ncdirect* nc = vnc;
|
ncdirect* nc = vnc;
|
||||||
int ret = drop_signals(nc, altstack);
|
int ret = drop_signals(nc, altstack);
|
||||||
fbuf f = {0};
|
fbuf f = {0};
|
||||||
@ -862,6 +862,9 @@ ncdirect_stop_minimal(void* vnc, void** altstack){
|
|||||||
#ifndef __MINGW32__
|
#ifndef __MINGW32__
|
||||||
del_curterm(cur_term);
|
del_curterm(cur_term);
|
||||||
#endif
|
#endif
|
||||||
|
if(errret){
|
||||||
|
ret = errret;
|
||||||
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -955,7 +958,7 @@ int ncdirect_stop(ncdirect* nc){
|
|||||||
int ret = 0;
|
int ret = 0;
|
||||||
if(nc){
|
if(nc){
|
||||||
void* altstack;
|
void* altstack;
|
||||||
ret |= ncdirect_stop_minimal(nc, &altstack);
|
ret |= ncdirect_stop_minimal(nc, &altstack, 0);
|
||||||
free_terminfo_cache(&nc->tcache);
|
free_terminfo_cache(&nc->tcache);
|
||||||
if(nc->tcache.ttyfd >= 0){
|
if(nc->tcache.ttyfd >= 0){
|
||||||
ret |= close(nc->tcache.ttyfd);
|
ret |= close(nc->tcache.ttyfd);
|
||||||
|
@ -118,7 +118,7 @@ int reset_term_palette(const tinfo* ti, fbuf* f, unsigned touchedpalette){
|
|||||||
// to tear down and account for internal structures. note that we do lots of
|
// to tear down and account for internal structures. note that we do lots of
|
||||||
// shit here that is unsafe within a signal handler =[ FIXME.
|
// shit here that is unsafe within a signal handler =[ FIXME.
|
||||||
static int
|
static int
|
||||||
notcurses_stop_minimal(void* vnc, void** altstack){
|
notcurses_stop_minimal(void* vnc, void** altstack, int errret){
|
||||||
notcurses* nc = vnc;
|
notcurses* nc = vnc;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
ret |= drop_signals(nc, altstack);
|
ret |= drop_signals(nc, altstack);
|
||||||
@ -170,6 +170,9 @@ notcurses_stop_minimal(void* vnc, void** altstack){
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if(errret){
|
||||||
|
ret = errret;
|
||||||
|
}
|
||||||
logdebug("restored terminal, returning %d", ret);
|
logdebug("restored terminal, returning %d", ret);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@ -1390,7 +1393,7 @@ notcurses* notcurses_core_init(const notcurses_options* opts, FILE* outfp){
|
|||||||
err:{
|
err:{
|
||||||
void* altstack;
|
void* altstack;
|
||||||
logpanic("alas, you will not be going to space today.");
|
logpanic("alas, you will not be going to space today.");
|
||||||
notcurses_stop_minimal(ret, &altstack);
|
notcurses_stop_minimal(ret, &altstack, -1);
|
||||||
fbuf_free(&ret->rstate.f);
|
fbuf_free(&ret->rstate.f);
|
||||||
if(ret->tcache.ttyfd >= 0 && ret->tcache.tpreserved){
|
if(ret->tcache.ttyfd >= 0 && ret->tcache.tpreserved){
|
||||||
(void)tcsetattr(ret->tcache.ttyfd, TCSAFLUSH, ret->tcache.tpreserved);
|
(void)tcsetattr(ret->tcache.ttyfd, TCSAFLUSH, ret->tcache.tpreserved);
|
||||||
@ -1449,7 +1452,7 @@ int notcurses_stop(notcurses* nc){
|
|||||||
int ret = 0;
|
int ret = 0;
|
||||||
if(nc){
|
if(nc){
|
||||||
void* altstack;
|
void* altstack;
|
||||||
ret |= notcurses_stop_minimal(nc, &altstack);
|
ret |= notcurses_stop_minimal(nc, &altstack, 0);
|
||||||
// if we were not using the alternate screen, our cursor's wherever we last
|
// if we were not using the alternate screen, our cursor's wherever we last
|
||||||
// wrote. move it to the furthest place to which it advanced.
|
// wrote. move it to the furthest place to which it advanced.
|
||||||
if(!get_escape(&nc->tcache, ESCAPE_SMCUP)){
|
if(!get_escape(&nc->tcache, ESCAPE_SMCUP)){
|
||||||
|
@ -32,7 +32,7 @@ int drop_signals(void* nc, void** altstack){
|
|||||||
// inhibited), and ensures that only one notcurses/ncdirect context is active
|
// inhibited), and ensures that only one notcurses/ncdirect context is active
|
||||||
// at any given time.
|
// at any given time.
|
||||||
int setup_signals(void* vnc, bool no_quit_sigs, bool no_winch_sigs,
|
int setup_signals(void* vnc, bool no_quit_sigs, bool no_winch_sigs,
|
||||||
int(*handler)(void*, void**)){
|
int(*handler)(void*, void**, int)){
|
||||||
(void)no_quit_sigs;
|
(void)no_quit_sigs;
|
||||||
(void)no_winch_sigs;
|
(void)no_winch_sigs;
|
||||||
(void)handler;
|
(void)handler;
|
||||||
@ -75,7 +75,9 @@ static struct sigaction old_term;
|
|||||||
// Prepared in setup_signals(), and never changes across our lifetime.
|
// Prepared in setup_signals(), and never changes across our lifetime.
|
||||||
static sigset_t wblock_signals;
|
static sigset_t wblock_signals;
|
||||||
|
|
||||||
static int(*fatal_callback)(void*, void**); // fatal handler callback
|
// fatal handler callback, takes notcurses struct, pointer to altstack,
|
||||||
|
// and return value override.
|
||||||
|
static int(*fatal_callback)(void*, void**, int);
|
||||||
|
|
||||||
int block_signals(sigset_t* old_blocked_signals){
|
int block_signals(sigset_t* old_blocked_signals){
|
||||||
if(pthread_sigmask(SIG_BLOCK, &wblock_signals, old_blocked_signals)){
|
if(pthread_sigmask(SIG_BLOCK, &wblock_signals, old_blocked_signals)){
|
||||||
@ -160,7 +162,7 @@ static void
|
|||||||
fatal_handler(int signo, siginfo_t* siginfo, void* v){
|
fatal_handler(int signo, siginfo_t* siginfo, void* v){
|
||||||
notcurses* nc = atomic_load(&signal_nc);
|
notcurses* nc = atomic_load(&signal_nc);
|
||||||
if(nc){
|
if(nc){
|
||||||
fatal_callback(nc, NULL); // fuck the alt stack save yourselves
|
fatal_callback(nc, NULL, signo); // fuck the alt stack save yourselves
|
||||||
switch(signo){
|
switch(signo){
|
||||||
case SIGTERM: invoke_old(&old_term, signo, siginfo, v); break;
|
case SIGTERM: invoke_old(&old_term, signo, siginfo, v); break;
|
||||||
case SIGSEGV: invoke_old(&old_segv, signo, siginfo, v); break;
|
case SIGSEGV: invoke_old(&old_segv, signo, siginfo, v); break;
|
||||||
@ -191,7 +193,7 @@ void setup_alt_sig_stack(void){
|
|||||||
// inhibited), and ensures that only one notcurses/ncdirect context is active
|
// inhibited), and ensures that only one notcurses/ncdirect context is active
|
||||||
// at any given time.
|
// at any given time.
|
||||||
int setup_signals(void* vnc, bool no_quit_sigs, bool no_winch_sigs,
|
int setup_signals(void* vnc, bool no_quit_sigs, bool no_winch_sigs,
|
||||||
int(*handler)(void*, void**)){
|
int(*handler)(void*, void**, int)){
|
||||||
notcurses* nc = vnc;
|
notcurses* nc = vnc;
|
||||||
void* expected = NULL;
|
void* expected = NULL;
|
||||||
struct sigaction sa;
|
struct sigaction sa;
|
||||||
|
@ -8,7 +8,7 @@ extern "C" {
|
|||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
|
|
||||||
int setup_signals(void* nc, bool no_quit_sigs, bool no_winch_sig,
|
int setup_signals(void* nc, bool no_quit_sigs, bool no_winch_sig,
|
||||||
int(*handler)(void*, void**));
|
int(*handler)(void*, void**, int));
|
||||||
|
|
||||||
// call at the beginning of shutdown (we don't want to run fatal signal
|
// call at the beginning of shutdown (we don't want to run fatal signal
|
||||||
// handlers during shutdown!). altstack is written to be freed late.
|
// handlers during shutdown!). altstack is written to be freed late.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user