=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/tmux/spawn.c,v retrieving revision 1.2 retrieving revision 1.3 diff -c -r1.2 -r1.3 *** src/usr.bin/tmux/spawn.c 2019/04/28 20:05:50 1.2 --- src/usr.bin/tmux/spawn.c 2019/05/03 20:44:24 1.3 *************** *** 1,4 **** ! /* $OpenBSD: spawn.c,v 1.2 2019/04/28 20:05:50 nicm Exp $ */ /* * Copyright (c) 2019 Nicholas Marriott --- 1,4 ---- ! /* $OpenBSD: spawn.c,v 1.3 2019/05/03 20:44:24 nicm Exp $ */ /* * Copyright (c) 2019 Nicholas Marriott *************** *** 332,337 **** --- 332,345 ---- cmd_log_argv(new_wp->argc, new_wp->argv, __func__); environ_log(child, "%s: environment ", __func__); + /* If the command is empty, don't fork a child process. */ + if (sc->flags & SPAWN_EMPTY) { + new_wp->flags |= PANE_EMPTY; + new_wp->base.mode &= ~MODE_CURSOR; + new_wp->base.mode |= MODE_CRLF; + goto complete; + } + /* Initialize the window size. */ memset(&ws, 0, sizeof ws); ws.ws_col = screen_size_x(&new_wp->base); *************** *** 355,380 **** } /* In the parent process, everything is done now. */ ! if (new_wp->pid != 0) { ! new_wp->pipe_off = 0; ! new_wp->flags &= ~PANE_EXITED; - sigprocmask(SIG_SETMASK, &oldset, NULL); - window_pane_set_event(new_wp); - - if (sc->flags & SPAWN_RESPAWN) - return (new_wp); - if ((~sc->flags & SPAWN_DETACHED) || w->active == NULL) { - if (sc->flags & SPAWN_NONOTIFY) - window_set_active_pane(w, new_wp, 0); - else - window_set_active_pane(w, new_wp, 1); - } - if (~sc->flags & SPAWN_NONOTIFY) - notify_window("window-layout-changed", w); - return (new_wp); - } - /* * Child process. Change to the working directory or home if that * fails. --- 363,371 ---- } /* In the parent process, everything is done now. */ ! if (new_wp->pid != 0) ! goto complete; /* * Child process. Change to the working directory or home if that * fails. *************** *** 433,436 **** --- 424,446 ---- xasprintf(&argv0, "-%s", new_wp->shell); execl(new_wp->shell, argv0, (char *)NULL); _exit(1); + + complete: + new_wp->pipe_off = 0; + new_wp->flags &= ~PANE_EXITED; + + sigprocmask(SIG_SETMASK, &oldset, NULL); + window_pane_set_event(new_wp); + + if (sc->flags & SPAWN_RESPAWN) + return (new_wp); + if ((~sc->flags & SPAWN_DETACHED) || w->active == NULL) { + if (sc->flags & SPAWN_NONOTIFY) + window_set_active_pane(w, new_wp, 0); + else + window_set_active_pane(w, new_wp, 1); + } + if (~sc->flags & SPAWN_NONOTIFY) + notify_window("window-layout-changed", w); + return (new_wp); }