Commit 4ed9d6a0 authored by Thomas Roessler's avatar Thomas Roessler

patch.mutt-0.95.1i.ld.signals.1-2.gz

parent c11e9101
......@@ -53,7 +53,7 @@ event_t mutt_getch (void)
if (UngetCount)
return (KeyEvent[--UngetCount]);
Signals &= ~S_INTERRUPT;
SigInt = 0;
#ifdef KEY_RESIZE
/* ncurses 4.2 sends this when the screen is resized */
......@@ -62,7 +62,7 @@ event_t mutt_getch (void)
#endif /* KEY_RESIZE */
ch = getch ();
if (Signals & S_INTERRUPT)
if (SigInt)
mutt_query_exit ();
if(ch == ERR)
......@@ -180,7 +180,7 @@ void mutt_query_exit (void)
}
mutt_clear_error();
mutt_curs_set (-1);
Signals &= ~S_INTERRUPT;
SigInt = 0;
}
static void clean_error_buf(void)
......
......@@ -502,13 +502,13 @@ int mutt_index_menu (void)
mutt_curs_set (1);
#if defined (USE_SLANG_CURSES) || defined (HAVE_RESIZETERM)
if (Signals & S_SIGWINCH)
if (SigWinch)
{
mutt_flushinp ();
mutt_resize_screen ();
menu->redraw = REDRAW_FULL;
menu->menu = MENU_MAIN;
Signals &= ~S_SIGWINCH;
SigWinch = 0;
menu->top = 0; /* so we scroll the right amount */
continue;
}
......
......@@ -117,9 +117,10 @@ WHERE short SendmailWait;
WHERE short Timeout;
WHERE short WriteInc;
/* vector to store received signals */
/* hopefully it's an integer type... */
WHERE volatile sig_atomic_t Signals INITVAL (0);
/* flags for received signals */
WHERE volatile sig_atomic_t SigAlrm INITVAL (0);
WHERE volatile sig_atomic_t SigInt INITVAL (0);
WHERE volatile sig_atomic_t SigWinch INITVAL (0);
WHERE int CurrentMenu;
......
......@@ -713,11 +713,11 @@ int mutt_menuLoop (MUTTMENU *menu)
mutt_curs_set (1);
#if defined (USE_SLANG_CURSES) || defined (HAVE_RESIZETERM)
if (Signals & S_SIGWINCH)
if (SigWinch)
{
mutt_resize_screen ();
menu->redraw = REDRAW_FULL;
Signals &= ~S_SIGWINCH;
SigWinch = 0;
}
#endif
......
......@@ -405,11 +405,6 @@ enum
#define toggle_option(x) mutt_bit_toggle(Options,x)
#define option(x) mutt_bit_isset(Options,x)
/* Bit fields for ``Signals'' */
#define S_INTERRUPT (1<<0)
#define S_SIGWINCH (1<<1)
#define S_ALARM (1<<2)
/* Exit values used in send_msg() */
#define S_ERR 127
#define S_BKG 126
......
......@@ -1659,13 +1659,13 @@ mutt_pager (const char *banner, const char *fname, int flags, pager_t *extra)
mutt_clear_error ();
mutt_curs_set (1);
if (Signals & S_INTERRUPT)
if (SigInt)
{
mutt_query_exit ();
continue;
}
#if defined (USE_SLANG_CURSES) || defined (HAVE_RESIZETERM)
else if (Signals & S_SIGWINCH)
else if (SigWinch)
{
mutt_resize_screen ();
......@@ -1710,7 +1710,7 @@ mutt_pager (const char *banner, const char *fname, int flags, pager_t *extra)
ch = 0;
}
Signals &= ~S_SIGWINCH;
SigWinch = 0;
continue;
}
#endif
......
......@@ -1140,10 +1140,10 @@ int mutt_search_command (int cur, int op)
return i;
}
if (Signals & S_INTERRUPT)
if (SigInt)
{
mutt_error _("Search interrupted.");
Signals &= ~S_INTERRUPT;
SigInt;
return (-1);
}
......
......@@ -50,31 +50,31 @@ static struct sysexits
sysexits_h[] =
{
#ifdef EX_USAGE
{ 0xff & EX_USAGE, "The command was used incorrectly." },
{ 0xff & EX_USAGE, "Bad usage." },
#endif
#ifdef EX_DATAERR
{ 0xff & EX_DATAERR, "The input data was incorrect." },
{ 0xff & EX_DATAERR, "Data format error." },
#endif
#ifdef EX_NOINPUT
{ 0xff & EX_NOINPUT, "No input." },
{ 0xff & EX_NOINPUT, "Cannot open input." },
#endif
#ifdef EX_NOUSER
{ 0xff & EX_NOUSER, "No such user." },
{ 0xff & EX_NOUSER, "User unknown." },
#endif
#ifdef EX_NOHOST
{ 0xff & EX_NOHOST, "Host not found." },
{ 0xff & EX_NOHOST, "Host unknown." },
#endif
#ifdef EX_UNAVAILABLE
{ 0xff & EX_UNAVAILABLE, "Service unavailable." },
#endif
#ifdef EX_SOFTWARE
{ 0xff & EX_SOFTWARE, "Software error." },
{ 0xff & EX_SOFTWARE, "Internal error." },
#endif
#ifdef EX_OSERR
{ 0xff & EX_OSERR, "Operating system error." },
#endif
#ifdef EX_OSFILE
{ 0xff & EX_OSFILE, "System file is missing." },
{ 0xff & EX_OSFILE, "System file missing." },
#endif
#ifdef EX_CANTCREAT
{ 0xff & EX_CANTCREAT, "Can't create output." },
......@@ -83,13 +83,16 @@ sysexits_h[] =
{ 0xff & EX_IOERR, "I/O error." },
#endif
#ifdef EX_TEMPFAIL
{ 0xff & EX_TEMPFAIL, "Temporary failure." },
{ 0xff & EX_TEMPFAIL, "Deferred." },
#endif
#ifdef EX_PROTOCOL
{ 0xff & EX_PROTOCOL, "Protocol error." },
{ 0xff & EX_PROTOCOL, "Remote protocol error." },
#endif
#ifdef EX_NOPERM
{ 0xff & EX_NOPERM, "Permission denied." },
{ 0xff & EX_NOPERM, "Insufficient permission." },
#endif
#ifdef EX_CONFIG
{ 0xff & EX_NOPERM, "Local configuration error." },
#endif
{ S_ERR, "Exec error." },
{ -1, NULL}
......@@ -1418,7 +1421,7 @@ char *mutt_gen_msgid (void)
static RETSIGTYPE alarm_handler (int sig)
{
Signals |= S_ALARM;
SigAlrm = 1;
}
/* invoke sendmail in a subshell
......@@ -1433,7 +1436,7 @@ send_msg (const char *path, char **args, const char *msg, char **tempfile)
{
sigset_t set;
int fd, st;
pid_t pid;
pid_t pid, ppid;
mutt_block_signals_system ();
......@@ -1454,6 +1457,9 @@ send_msg (const char *path, char **args, const char *msg, char **tempfile)
{
struct sigaction act, oldalrm;
/* save parent's ID before setsid() */
ppid = getppid ();
/* we want the delivery to continue even after the main process dies,
* so we put ourselves into another session right away
*/
......@@ -1487,10 +1493,10 @@ send_msg (const char *path, char **args, const char *msg, char **tempfile)
{
/* *tempfile will be opened as stdout */
if (open (*tempfile, O_WRONLY | O_APPEND | O_CREAT | O_EXCL, 0600) < 0)
_exit (errno);
_exit (S_ERR);
/* redirect stderr to *tempfile too */
if (dup (1) < 0)
_exit (errno);
_exit (S_ERR);
}
execv (path, args);
......@@ -1509,7 +1515,7 @@ send_msg (const char *path, char **args, const char *msg, char **tempfile)
*/
if (SendmailWait > 0)
{
Signals &= ~S_ALARM;
SigAlrm = 0;
act.sa_handler = alarm_handler;
#ifdef SA_INTERRUPT
/* need to make sure waitpid() is interrupted on SIGALRM */
......@@ -1518,11 +1524,6 @@ send_msg (const char *path, char **args, const char *msg, char **tempfile)
act.sa_flags = 0;
#endif
sigemptyset (&act.sa_mask);
sigaddset (&act.sa_mask, SIGTSTP);
sigaddset (&act.sa_mask, SIGINT);
#if defined (USE_SLANG_CURSES) || defined (HAVE_RESIZETERM)
sigaddset (&act.sa_mask, SIGWINCH);
#endif
sigaction (SIGALRM, &act, &oldalrm);
alarm (SendmailWait);
}
......@@ -1540,7 +1541,7 @@ send_msg (const char *path, char **args, const char *msg, char **tempfile)
}
else
{
st = (SendmailWait > 0 && errno == EINTR && (Signals & S_ALARM)) ?
st = (SendmailWait > 0 && errno == EINTR && SigAlrm) ?
S_BKG : S_ERR;
if (SendmailWait > 0)
{
......@@ -1552,7 +1553,14 @@ send_msg (const char *path, char **args, const char *msg, char **tempfile)
/* reset alarm; not really needed, but... */
alarm (0);
sigaction (SIGALRM, &oldalrm, NULL);
if (kill (ppid, 0) == -1 && errno == ESRCH)
{
/* the parent is already dead */
unlink (*tempfile);
safe_free ((void **) tempfile);
}
_exit (st);
}
......@@ -1664,9 +1672,7 @@ mutt_invoke_sendmail (ADDRESS *to, ADDRESS *cc, ADDRESS *bcc, /* recips */
if ((i = send_msg (path, args, msg, &childout)) != (EX_OK & 0xff))
{
if (i == S_BKG)
mutt_message (_("Delivery continued in background."));
else
if (i != S_BKG)
{
const char *e = strsysexit (i);
......
......@@ -26,6 +26,8 @@
static sigset_t Sigset;
static sigset_t SigsetSys;
static struct sigaction SysOldInt;
static struct sigaction SysOldQuit;
static int IsEndwin = 0;
/* Attempt to catch "ordinary" signals and shut down gracefully. */
......@@ -73,12 +75,12 @@ RETSIGTYPE sighandler (int sig)
#if defined (USE_SLANG_CURSES) || defined (HAVE_RESIZETERM)
case SIGWINCH:
Signals |= S_SIGWINCH;
SigWinch = 1;
break;
#endif
case SIGINT:
Signals |= S_INTERRUPT;
SigInt = 1;
break;
}
......@@ -108,10 +110,6 @@ void mutt_signal_init (void)
/* we want to avoid race conditions */
sigaddset (&act.sa_mask, SIGTSTP);
sigaddset (&act.sa_mask, SIGINT);
#if defined (USE_SLANG_CURSES) || defined (HAVE_RESIZETERM)
sigaddset (&act.sa_mask, SIGWINCH);
#endif
/* we also don't want to mess with interrupted system calls */
#ifdef SA_RESTART
......@@ -185,50 +183,38 @@ void mutt_block_signals_system (void)
/* POSIX: ignore SIGINT and SIGQUIT & block SIGCHLD before exec */
sa.sa_handler = SIG_IGN;
sa.sa_flags = 0;
sigaction (SIGINT, &sa, NULL);
sigaction (SIGQUIT, &sa, NULL);
sigemptyset (&sa.sa_mask);
sigaction (SIGINT, &sa, &SysOldInt);
sigaction (SIGQUIT, &sa, &SysOldQuit);
sigemptyset (&SigsetSys);
sigaddset (&SigsetSys, SIGCHLD);
sigprocmask (SIG_BLOCK, &SigsetSys, 0);
set_option (OPTSIGNALSBLOCKED);
set_option (OPTSYSSIGNALSBLOCKED);
}
}
void mutt_unblock_signals_system (int catch)
{
struct sigaction sa;
if (option (OPTSYSSIGNALSBLOCKED))
{
sigprocmask (SIG_UNBLOCK, &SigsetSys, NULL);
sigemptyset (&sa.sa_mask);
sa.sa_flags = 0;
if (catch)
{
sa.sa_handler = exit_handler;
sigaction (SIGQUIT, &sa, NULL);
/* we want to avoid race conditions */
sigaddset (&sa.sa_mask, SIGTSTP);
sigaddset (&sa.sa_mask, SIGINT);
#if defined (USE_SLANG_CURSES) || defined (HAVE_RESIZETERM)
sigaddset (&sa.sa_mask, SIGWINCH);
#endif
/* we also don't want to mess with interrupted system calls */
#ifdef SA_RESTART
sa.sa_flags = SA_RESTART;
#endif
sa.sa_handler = sighandler;
sigaction (SIGINT, &sa, NULL);
sigaction (SIGQUIT, &SysOldQuit, NULL);
sigaction (SIGINT, &SysOldInt, NULL);
}
else
{
struct sigaction sa;
sa.sa_handler = SIG_DFL;
sigemptyset (&sa.sa_mask);
sa.sa_flags = 0;
sigaction (SIGQUIT, &sa, NULL);
sigaction (SIGINT, &sa, NULL);
}
unset_option (OPTSIGNALSBLOCKED);
unset_option (OPTSYSSIGNALSBLOCKED);
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment