summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--cmd-new-session.c16
-rw-r--r--cmd-new-window.c11
-rw-r--r--cmd-split-window.c11
-rw-r--r--session.c3
-rw-r--r--tmux.13
-rw-r--r--tmux.c12
-rw-r--r--tmux.h1
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 <sys/types.h>
+#include <pwd.h>
#include <string.h>
#include <termios.h>
+#include <unistd.h>
#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;