1
0
mirror of https://git.tartarus.org/simon/putty.git synced 2025-04-09 15:18:06 -05:00

Jacob has pointed out why SIGCHLD was blocked, so I've updated the

comment when I unblock it in pty.c to reflect reality. Also I've
moved block_signal() out of pterm.c into signal.c, so I can
conveniently use it for unblocking SIGCHLD rather than having to
reinvent it in pty.c.

[originally from svn r5006]
This commit is contained in:
Simon Tatham 2004-12-17 14:25:53 +00:00
parent d649075539
commit b3b70d749f
4 changed files with 20 additions and 21 deletions

View File

@ -2551,17 +2551,6 @@ int do_cmdline(int argc, char **argv, int do_everything,
return err;
}
static void block_signal(int sig, int block_it) {
sigset_t ss;
sigemptyset(&ss);
sigaddset(&ss, sig);
if(sigprocmask(block_it ? SIG_BLOCK : SIG_UNBLOCK, &ss, 0) < 0) {
perror("sigprocmask");
exit(1);
}
}
/*
* This function retrieves the character set encoding of a font. It
* returns the character set without the X11 hack (in case the user

View File

@ -621,18 +621,13 @@ static const char *pty_init(void *frontend, void **backend_handle, Config *cfg,
/*
* SIGINT and SIGQUIT may have been set to ignored by our
* parent, particularly by things like sh -c 'pterm &' and
* some window managers. SIGCHLD, meanwhile, has been
* tinkered with by the watchdog process. Reverse all this
* for our child process.
* some window managers. SIGCHLD, meanwhile, was blocked
* during pt_main() startup. Reverse all this for our child
* process.
*/
putty_signal(SIGINT, SIG_DFL);
putty_signal(SIGQUIT, SIG_DFL);
{
sigset_t set;
sigemptyset(&set);
sigaddset(&set, SIGCHLD);
sigprocmask(SIG_UNBLOCK, &set, NULL);
}
block_signal(SIGCHLD, 0);
if (pty_argv)
execvp(pty_argv[0], pty_argv);
else {

View File

@ -1,4 +1,6 @@
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
/*
* Calling signal() is a non-portable, as it varies in meaning between
@ -23,6 +25,18 @@ void (*putty_signal(int sig, void (*func)(int)))(int) {
return old.sa_handler;
}
void block_signal(int sig, int block_it)
{
sigset_t ss;
sigemptyset(&ss);
sigaddset(&ss, sig);
if(sigprocmask(block_it ? SIG_BLOCK : SIG_UNBLOCK, &ss, 0) < 0) {
perror("sigprocmask");
exit(1);
}
}
/*
Local Variables:
c-basic-offset:4

View File

@ -111,8 +111,9 @@ void unix_setup_config_box(struct controlbox *b, int midsession, void *window);
#define strnicmp strncasecmp
#define stricmp strcasecmp
/* BSD-semantics version of signal() */
/* BSD-semantics version of signal(), and another helpful function */
void (*putty_signal(int sig, void (*func)(int)))(int);
void block_signal(int sig, int block_it);
/*
* Exports from unicode.c.