From 07a71fd432df5873515da82d2d620ec0d986b558 Mon Sep 17 00:00:00 2001 From: Nicholas Marriott Date: Sun, 27 Jun 2010 02:56:59 +0000 Subject: [PATCH] Store the current working directory in the session, change the default-path option to default to empty and make that mean that the stored session CWD is used. --- cmd-new-session.c | 16 ++++++++++++---- cmd-new-window.c | 11 +++++++---- cmd-split-window.c | 11 +++++++---- session.c | 3 +++ tmux.1 | 3 ++- tmux.c | 12 ++---------- tmux.h | 1 + 7 files changed, 34 insertions(+), 23 deletions(-) diff --git a/cmd-new-session.c b/cmd-new-session.c index 5e175bea..290d5a3b 100644 --- a/cmd-new-session.c +++ b/cmd-new-session.c @@ -18,8 +18,10 @@ #include +#include #include #include +#include #include "tmux.h" @@ -125,8 +127,9 @@ cmd_new_session_exec(struct cmd *self, struct cmd_ctx *ctx) struct window_pane *wp; struct environ env; struct termios tio, *tiop; - const char *update; - char *overrides, *cmd, *cwd, *cause; + struct passwd *pw; + const char *update, *cwd; + char *overrides, *cmd, *cause; int detached, idx; u_int sx, sy, i; @@ -198,8 +201,13 @@ cmd_new_session_exec(struct cmd *self, struct cmd_ctx *ctx) /* Get the new session working directory. */ if (ctx->cmdclient != NULL && ctx->cmdclient->cwd != NULL) cwd = ctx->cmdclient->cwd; - else - cwd = options_get_string(&global_s_options, "default-path"); + else { + pw = getpwuid(getuid()); + if (pw->pw_dir != NULL && *pw->pw_dir != '\0') + cwd = pw->pw_dir; + else + cwd = "/"; + } /* Find new session size. */ if (detached) { diff --git a/cmd-new-window.c b/cmd-new-window.c index 32c42eb4..b44be0b2 100644 --- a/cmd-new-window.c +++ b/cmd-new-window.c @@ -176,10 +176,13 @@ cmd_new_window_exec(struct cmd *self, struct cmd_ctx *ctx) cmd = data->cmd; if (cmd == NULL) cmd = options_get_string(&s->options, "default-command"); - if (ctx->cmdclient == NULL || ctx->cmdclient->cwd == NULL) - cwd = options_get_string(&s->options, "default-path"); - else - cwd = ctx->cmdclient->cwd; + cwd = options_get_string(&s->options, "default-path"); + if (*cwd == '\0') { + if (ctx->cmdclient != NULL && ctx->cmdclient->cwd != NULL) + cwd = ctx->cmdclient->cwd; + else + cwd = s->cwd; + } if (idx == -1) idx = -1 - options_get_number(&s->options, "base-index"); diff --git a/cmd-split-window.c b/cmd-split-window.c index f4bfe4e2..e4f46c34 100644 --- a/cmd-split-window.c +++ b/cmd-split-window.c @@ -170,10 +170,13 @@ cmd_split_window_exec(struct cmd *self, struct cmd_ctx *ctx) cmd = data->cmd; if (cmd == NULL) cmd = options_get_string(&s->options, "default-command"); - if (ctx->cmdclient == NULL || ctx->cmdclient->cwd == NULL) - cwd = options_get_string(&s->options, "default-path"); - else - cwd = ctx->cmdclient->cwd; + cwd = options_get_string(&s->options, "default-path"); + if (*cwd == '\0') { + if (ctx->cmdclient != NULL && ctx->cmdclient->cwd != NULL) + cwd = ctx->cmdclient->cwd; + else + cwd = s->cwd; + } type = LAYOUT_TOPBOTTOM; if (data->flag_horizontal) diff --git a/session.c b/session.c index 65f8ef41..b164eef8 100644 --- a/session.c +++ b/session.c @@ -68,6 +68,8 @@ session_create(const char *name, const char *cmd, const char *cwd, fatal("gettimeofday failed"); memcpy(&s->activity_time, &s->creation_time, sizeof s->activity_time); + s->cwd = xstrdup(cwd); + s->curw = NULL; TAILQ_INIT(&s->lastw); RB_INIT(&s->windows); @@ -142,6 +144,7 @@ session_destroy(struct session *s) while (!RB_EMPTY(&s->windows)) winlink_remove(&s->windows, RB_ROOT(&s->windows)); + xfree(s->cwd); xfree(s->name); for (i = 0; i < ARRAY_LENGTH(&dead_sessions); i++) { diff --git a/tmux.1 b/tmux.1 index cdd7ecdf..cd44b7f5 100644 --- a/tmux.1 +++ b/tmux.1 @@ -1626,7 +1626,8 @@ is used as a login shell. .It Ic default-path Ar path Set the default working directory for processes created from keys, or interactively from the prompt. -The default is the current working directory when the server is started. +The default is empty, which means to use the working directory of the shell +from which the server was started if it is available or the user's home if not. .It Ic default-terminal Ar terminal Set the default terminal for new windows created in this session - the default value of the diff --git a/tmux.c b/tmux.c index b7e24a8b..dc5631be 100644 --- a/tmux.c +++ b/tmux.c @@ -239,7 +239,7 @@ main(int argc, char **argv) struct env_data envdata; struct msg_command_data cmddata; char *s, *shellcmd, *path, *label, *home, *cause; - char cwd[MAXPATHLEN], **var; + char **var; void *buf; size_t len; int opt, flags, quiet = 0, cmdflags = 0; @@ -339,6 +339,7 @@ main(int argc, char **argv) options_set_number(so, "bell-action", BELL_ANY); options_set_number(so, "buffer-limit", 9); options_set_string(so, "default-command", "%s", ""); + options_set_string(so, "default-path", "%s", ""); options_set_string(so, "default-shell", "%s", getshell()); options_set_string(so, "default-terminal", "screen"); options_set_number(so, "detach-on-destroy", 1); @@ -435,15 +436,6 @@ main(int argc, char **argv) options_set_number(wo, "utf8", 0); } - if (getcwd(cwd, sizeof cwd) == NULL) { - pw = getpwuid(getuid()); - if (pw->pw_dir != NULL && *pw->pw_dir != '\0') - strlcpy(cwd, pw->pw_dir, sizeof cwd); - else - strlcpy(cwd, "/", sizeof cwd); - } - options_set_string(so, "default-path", "%s", cwd); - if (cfg_file == NULL) { home = getenv("HOME"); if (home == NULL || *home == '\0') { diff --git a/tmux.h b/tmux.h index 6b158cd7..88a8e814 100644 --- a/tmux.h +++ b/tmux.h @@ -926,6 +926,7 @@ TAILQ_HEAD(session_groups, session_group); struct session { char *name; + char *cwd; struct timeval creation_time; struct timeval activity_time;