=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/tmux/cmd-respawn-pane.c,v retrieving revision 1.27 retrieving revision 1.28 diff -c -r1.27 -r1.28 *** src/usr.bin/tmux/cmd-respawn-pane.c 2019/03/12 11:16:50 1.27 --- src/usr.bin/tmux/cmd-respawn-pane.c 2019/04/17 14:37:48 1.28 *************** *** 1,4 **** ! /* $OpenBSD: cmd-respawn-pane.c,v 1.27 2019/03/12 11:16:50 nicm Exp $ */ /* * Copyright (c) 2008 Nicholas Marriott --- 1,4 ---- ! /* $OpenBSD: cmd-respawn-pane.c,v 1.28 2019/04/17 14:37:48 nicm Exp $ */ /* * Copyright (c) 2008 Nicholas Marriott *************** *** 20,26 **** #include #include ! #include #include "tmux.h" --- 20,26 ---- #include #include ! #include #include "tmux.h" *************** *** 36,42 **** .args = { "c:kt:", 0, -1 }, .usage = "[-c start-directory] [-k] " CMD_TARGET_PANE_USAGE ! " [command]", .target = { 't', CMD_FIND_PANE, 0 }, --- 36,42 ---- .args = { "c:kt:", 0, -1 }, .usage = "[-c start-directory] [-k] " CMD_TARGET_PANE_USAGE ! " [command]", .target = { 't', CMD_FIND_PANE, 0 }, *************** *** 48,100 **** cmd_respawn_pane_exec(struct cmd *self, struct cmdq_item *item) { struct args *args = self->args; struct winlink *wl = item->target.wl; - struct window *w = wl->window; struct window_pane *wp = item->target.wp; ! struct client *c = cmd_find_client(item, NULL, 1); ! struct session *s = item->target.s; ! struct environ *env; ! const char *path = NULL, *cp; ! char *cause, *cwd = NULL; ! u_int idx; ! struct environ_entry *envent; ! if (!args_has(self->args, 'k') && wp->fd != -1) { ! if (window_pane_index(wp, &idx) != 0) ! fatalx("index not found"); ! cmdq_error(item, "pane still active: %s:%d.%u", ! s->name, wl->idx, idx); ! return (CMD_RETURN_ERROR); ! } ! window_pane_reset_mode_all(wp); ! screen_reinit(&wp->base); ! input_init(wp); ! if (item->client != NULL && item->client->session == NULL) ! envent = environ_find(item->client->environ, "PATH"); ! else ! envent = environ_find(s->environ, "PATH"); ! if (envent != NULL) ! path = envent->value; ! if ((cp = args_get(args, 'c')) != NULL) ! cwd = format_single(item, cp, c, s, NULL, NULL); ! env = environ_for_session(s, 0); ! if (window_pane_spawn(wp, args->argc, args->argv, path, NULL, cwd, env, ! s->tio, &cause) != 0) { cmdq_error(item, "respawn pane failed: %s", cause); free(cause); - environ_free(env); - free(cwd); return (CMD_RETURN_ERROR); } - environ_free(env); - free(cwd); wp->flags |= PANE_REDRAW; ! server_status_window(w); return (CMD_RETURN_NORMAL); } --- 48,86 ---- cmd_respawn_pane_exec(struct cmd *self, struct cmdq_item *item) { struct args *args = self->args; + struct spawn_context sc; + struct session *s = item->target.s; struct winlink *wl = item->target.wl; struct window_pane *wp = item->target.wp; ! char *cause = NULL; ! memset(&sc, 0, sizeof sc); ! sc.item = item; ! sc.s = s; ! sc.wl = wl; ! sc.wp0 = wp; ! sc.lc = NULL; ! sc.name = NULL; ! sc.argc = args->argc; ! sc.argv = args->argv; ! sc.idx = -1; ! sc.cwd = args_get(args, 'c'); ! sc.flags = SPAWN_RESPAWN; ! if (args_has(args, 'k')) ! sc.flags |= SPAWN_KILL; ! ! if (spawn_pane(&sc, &cause) == NULL) { cmdq_error(item, "respawn pane failed: %s", cause); free(cause); return (CMD_RETURN_ERROR); } wp->flags |= PANE_REDRAW; ! server_status_window(wp->window); return (CMD_RETURN_NORMAL); }