mirror of
https://github.com/tmux/tmux.git
synced 2024-12-13 01:48:47 +00:00
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:
parent
ead75c2d51
commit
95baa32383
25
spawn.c
25
spawn.c
@ -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");
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
Loading…
Reference in New Issue
Block a user