aboutsummaryrefslogtreecommitdiff
path: root/window.c
diff options
context:
space:
mode:
authorThomas Adam <thomas@xteddy.org>2017-07-12 13:39:59 +0100
committerThomas Adam <thomas@xteddy.org>2017-07-12 13:43:08 +0100
commit1076a2e26c224d17c32a2d1770997d8718903f20 (patch)
tree2a51f6e719b9cbff0e37d7a887e56992ffb875bd /window.c
parentfbbf5a108b01c742ca11e779845a4d19a1c5edd1 (diff)
parent51112221eeb31ced907f0dfcf077582996c20c07 (diff)
downloadrtmux-1076a2e26c224d17c32a2d1770997d8718903f20.tar.gz
rtmux-1076a2e26c224d17c32a2d1770997d8718903f20.tar.bz2
rtmux-1076a2e26c224d17c32a2d1770997d8718903f20.zip
Merge branch 'obsd-master'
Conflicts: cmd-pipe-pane.c proc.c tmux.c window.c
Diffstat (limited to 'window.c')
-rw-r--r--window.c17
1 files changed, 12 insertions, 5 deletions
diff --git a/window.c b/window.c
index 76aef683..9fcf77a2 100644
--- a/window.c
+++ b/window.c
@@ -891,6 +891,7 @@ window_pane_spawn(struct window_pane *wp, int argc, char **argv,
char s[32];
#endif
int i;
+ sigset_t set, oldset;
if (wp->fd != -1) {
bufferevent_free(wp->event);
@@ -920,14 +921,21 @@ window_pane_spawn(struct window_pane *wp, int argc, char **argv,
ws.ws_col = screen_size_x(&wp->base);
ws.ws_row = screen_size_y(&wp->base);
- wp->pid = fdforkpty(ptm_fd, &wp->fd, wp->tty, NULL, &ws);
- switch (wp->pid) {
+ sigfillset(&set);
+ sigprocmask(SIG_BLOCK, &set, &oldset);
+ switch (wp->pid = fdforkpty(ptm_fd, &wp->fd, wp->tty, NULL, &ws)) {
case -1:
wp->fd = -1;
+
xasprintf(cause, "%s: %s", cmd, strerror(errno));
free(cmd);
+
+ sigprocmask(SIG_SETMASK, &oldset, NULL);
return (-1);
case 0:
+ proc_clear_signals(server_proc);
+ sigprocmask(SIG_SETMASK, &oldset, NULL);
+
if (chdir(wp->cwd) != 0) {
if ((home = find_home()) == NULL || chdir(home) != 0)
chdir("/");
@@ -944,6 +952,7 @@ window_pane_spawn(struct window_pane *wp, int argc, char **argv,
if (tcsetattr(STDIN_FILENO, TCSANOW, &tio2) != 0)
fatal("tcgetattr failed");
+ log_close();
closefrom(STDERR_FILENO + 1);
if (path != NULL)
@@ -951,9 +960,6 @@ window_pane_spawn(struct window_pane *wp, int argc, char **argv,
environ_set(env, "TMUX_PANE", "%%%u", wp->id);
environ_push(env);
- clear_signals(1);
- log_close();
-
setenv("SHELL", wp->shell, 1);
ptr = strrchr(wp->shell, '/');
@@ -992,6 +998,7 @@ window_pane_spawn(struct window_pane *wp, int argc, char **argv,
kill(getpid(), SIGCHLD);
#endif
+ sigprocmask(SIG_SETMASK, &oldset, NULL);
setblocking(wp->fd, 0);
wp->event = bufferevent_new(wp->fd, window_pane_read_callback, NULL,