diff options
author | Thomas Adam <thomas@xteddy.org> | 2017-07-12 13:39:59 +0100 |
---|---|---|
committer | Thomas Adam <thomas@xteddy.org> | 2017-07-12 13:43:08 +0100 |
commit | 1076a2e26c224d17c32a2d1770997d8718903f20 (patch) | |
tree | 2a51f6e719b9cbff0e37d7a887e56992ffb875bd /window.c | |
parent | fbbf5a108b01c742ca11e779845a4d19a1c5edd1 (diff) | |
parent | 51112221eeb31ced907f0dfcf077582996c20c07 (diff) | |
download | rtmux-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.c | 17 |
1 files changed, 12 insertions, 5 deletions
@@ -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, |