=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/tmux/spawn.c,v retrieving revision 1.2 retrieving revision 1.3 diff -u -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 +1,4 @@ -/* $OpenBSD: spawn.c,v 1.2 2019/04/28 20:05:50 nicm Exp $ */ +/* $OpenBSD: spawn.c,v 1.3 2019/05/03 20:44:24 nicm Exp $ */ /* * Copyright (c) 2019 Nicholas Marriott @@ -332,6 +332,14 @@ 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,26 +363,9 @@ } /* In the parent process, everything is done now. */ - if (new_wp->pid != 0) { - new_wp->pipe_off = 0; - new_wp->flags &= ~PANE_EXITED; + if (new_wp->pid != 0) + goto complete; - 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. @@ -433,4 +424,23 @@ 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); }