NeoMutt
Teaching an old dog new tricks
DOXYGEN
Loading...
Searching...
No Matches
mutt_signal.c
Go to the documentation of this file.
1
29#include "config.h"
30#include <stddef.h>
31#include <errno.h>
32#include <signal.h>
33#include <stdbool.h>
34#include "mutt/lib.h"
35#include "config/lib.h"
36#include "core/lib.h"
37#include "gui/lib.h"
38#include "attach/lib.h"
39#include "globals.h"
40#include "protos.h"
41#if defined(USE_DEBUG_GRAPHVIZ) || defined(USE_DEBUG_BACKTRACE)
42#include "debug/lib.h"
43#endif
44
46static int IsEndwin = 0;
47
52static void curses_signal_handler(int sig)
53{
54 int save_errno = errno;
55 enum MuttCursorState old_cursor = MUTT_CURSOR_VISIBLE;
56
57 switch (sig)
58 {
59 case SIGTSTP: /* user requested a suspend */
60 {
61 const bool c_suspend = cs_subset_bool(NeoMutt->sub, "suspend");
62 if (!c_suspend)
63 break;
64 IsEndwin = isendwin();
66 if (!IsEndwin)
67 endwin();
68 kill(0, SIGSTOP);
69 }
70 /* fallthrough */
71
72 case SIGCONT:
73 if (!IsEndwin)
74 refresh();
75 mutt_curses_set_cursor(old_cursor);
76 /* We don't receive SIGWINCH when suspended; however, no harm is done by
77 * just assuming we received one, and triggering the 'resize' anyway. */
78 SigWinch = true;
79 break;
80
81 case SIGWINCH:
82 SigWinch = true;
83 break;
84
85 case SIGINT:
86 SigInt = true;
87 break;
88 }
89 errno = save_errno;
90}
91
96static void curses_exit_handler(int sig)
97{
99 endwin(); /* just to be safe */
101 mutt_sig_exit_handler(sig); /* DOES NOT RETURN */
102}
103
108static void curses_segv_handler(int sig)
109{
111 endwin(); /* just to be safe */
112#ifdef USE_DEBUG_BACKTRACE
114#endif
115#ifdef USE_DEBUG_GRAPHVIZ
116 dump_graphviz("segfault", NULL);
117#endif
118
119 struct sigaction act = { 0 };
120 sigemptyset(&act.sa_mask);
121 act.sa_flags = 0;
122 act.sa_handler = SIG_DFL;
123 sigaction(sig, &act, NULL);
124 // Re-raise the signal to give outside handlers a chance to deal with it
125 raise(sig);
126}
127
132{
134}
GUI display the mailboxes in a side panel.
void show_backtrace(void)
Log the program's call stack.
Definition: backtrace.c:39
bool cs_subset_bool(const struct ConfigSubset *sub, const char *name)
Get a boolean config item by name.
Definition: helpers.c:48
Convenience wrapper for the config headers.
Convenience wrapper for the core headers.
Convenience wrapper for the debug headers.
SIG_ATOMIC_VOLATILE_T SigWinch
true after SIGWINCH is received
Definition: globals.c:60
SIG_ATOMIC_VOLATILE_T SigInt
true after SIGINT is received
Definition: globals.c:59
Global variables.
void dump_graphviz(const char *title, struct MailboxView *mv)
Definition: graphviz.c:882
static void curses_signal_handler(int sig)
Catch signals and relay the info to the main program - Implements sig_handler_t -.
Definition: mutt_signal.c:52
static void curses_segv_handler(int sig)
Catch a segfault and print a backtrace - Implements sig_handler_t -.
Definition: mutt_signal.c:108
static void curses_exit_handler(int sig)
Notify the user and shutdown gracefully - Implements sig_handler_t -.
Definition: mutt_signal.c:96
Convenience wrapper for the gui headers.
Convenience wrapper for the library headers.
void mutt_temp_attachments_cleanup(void)
Delete all temporary attachments.
Definition: mutt_attach.c:1316
enum MuttCursorState mutt_curses_set_cursor(enum MuttCursorState state)
Set the cursor state.
Definition: mutt_curses.c:96
MuttCursorState
Cursor states for mutt_curses_set_cursor()
Definition: mutt_curses.h:58
@ MUTT_CURSOR_VISIBLE
Display a normal cursor.
Definition: mutt_curses.h:60
static int IsEndwin
Ncurses function isendwin() has been called.
Definition: mutt_signal.c:46
void mutt_signal_init(void)
Initialise the signal handling.
Definition: mutt_signal.c:131
Prototypes for many functions.
void mutt_sig_init(sig_handler_t sig_fn, sig_handler_t exit_fn, sig_handler_t segv_fn)
Initialise the signal handling.
Definition: signal.c:101
void mutt_sig_exit_handler(int sig)
Notify the user and shutdown gracefully.
Definition: signal.c:78
Container for Accounts, Notifications.
Definition: neomutt.h:41
struct ConfigSubset * sub
Inherited config items.
Definition: neomutt.h:45