Set PWD so shells have a hint about the real path (this was done before but

lost in a merge). GitHub issue 3186.
This commit is contained in:
Nicholas Marriott 2022-05-20 08:33:57 +01:00
parent ead75c2d51
commit 95baa32383

25
spawn.c
View File

@ -209,7 +209,7 @@ spawn_pane(struct spawn_context *sc, char **cause)
struct window_pane *new_wp; struct window_pane *new_wp;
struct environ *child; struct environ *child;
struct environ_entry *ee; struct environ_entry *ee;
char **argv, *cp, **argvp, *argv0, *cwd; char **argv, *cp, **argvp, *argv0, *cwd, *new_cwd;
const char *cmd, *tmp; const char *cmd, *tmp;
int argc; int argc;
u_int idx; u_int idx;
@ -225,9 +225,15 @@ spawn_pane(struct spawn_context *sc, char **cause)
* Work out the current working directory. If respawning, use * Work out the current working directory. If respawning, use
* the pane's stored one unless specified. * the pane's stored one unless specified.
*/ */
if (sc->cwd != NULL) if (sc->cwd != NULL) {
cwd = format_single(item, sc->cwd, c, target->s, NULL, NULL); cwd = format_single(item, sc->cwd, c, target->s, NULL, NULL);
else if (~sc->flags & SPAWN_RESPAWN) if (*cwd != '/') {
xasprintf(&new_cwd, "%s/%s", server_client_get_cwd(c,
target->s), cwd);
free(cwd);
cwd = new_cwd;
}
} else if (~sc->flags & SPAWN_RESPAWN)
cwd = xstrdup(server_client_get_cwd(c, target->s)); cwd = xstrdup(server_client_get_cwd(c, target->s));
else else
cwd = NULL; cwd = NULL;
@ -335,8 +341,7 @@ spawn_pane(struct spawn_context *sc, char **cause)
log_debug("%s: cmd=%s", __func__, cp); log_debug("%s: cmd=%s", __func__, cp);
free(cp); free(cp);
} }
if (cwd != NULL) log_debug("%s: cwd=%s", __func__, new_wp->cwd);
log_debug("%s: cwd=%s", __func__, cwd);
cmd_log_argv(new_wp->argc, new_wp->argv, "%s", __func__); cmd_log_argv(new_wp->argc, new_wp->argv, "%s", __func__);
environ_log(child, "%s: environment ", __func__); environ_log(child, "%s: environment ", __func__);
@ -382,9 +387,13 @@ spawn_pane(struct spawn_context *sc, char **cause)
* Child process. Change to the working directory or home if that * Child process. Change to the working directory or home if that
* fails. * fails.
*/ */
if (chdir(new_wp->cwd) != 0 && if (chdir(new_wp->cwd) == 0)
((tmp = find_home()) == NULL || chdir(tmp) != 0) && environ_set(child, "PWD", 0, "%s", new_wp->cwd);
chdir("/") != 0) else if ((tmp = find_home()) != NULL || chdir(tmp) == 0)
environ_set(child, "PWD", 0, "%s", tmp);
else if (chdir("/") == 0)
environ_set(child, "PWD", 0, "/");
else
fatal("chdir failed"); fatal("chdir failed");
/* /*