From d3830e622f94f0826e2169eca1f920abc234a412 Mon Sep 17 00:00:00 2001 From: nicm Date: Thu, 10 Oct 2013 11:46:28 +0000 Subject: Grouped sessions were being leaked on destroy, correctly free them. --- session.c | 1 + 1 file changed, 1 insertion(+) (limited to 'session.c') diff --git a/session.c b/session.c index c7b54a2b..7e144886 100644 --- a/session.c +++ b/session.c @@ -151,6 +151,7 @@ void session_destroy(struct session *s) { struct winlink *wl; + log_debug("session %s destroyed", s->name); RB_REMOVE(sessions, &sessions, s); -- cgit From 34674bb180176662d51b774cfcd9f335f329f235 Mon Sep 17 00:00:00 2001 From: nicm Date: Thu, 10 Oct 2013 11:58:24 +0000 Subject: Renumber windows: Lookup lastw via window not index When calling 'movew -r' on a session to reorder the winlinks, ensure when adding back in the information for the lastw stack that we look up the winlink based on the window and not its index. Using the index doesn't make sense here because when comparing it to the old set, it will never match since the winlink has been renumbered. Bug reported by Ben Boeckel. Patch by Thomas Adam. --- session.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'session.c') diff --git a/session.c b/session.c index 7e144886..f967de19 100644 --- a/session.c +++ b/session.c @@ -616,7 +616,7 @@ session_renumber_windows(struct session *s) memcpy(&old_lastw, &s->lastw, sizeof old_lastw); TAILQ_INIT(&s->lastw); TAILQ_FOREACH(wl, &old_lastw, sentry) { - wl_new = winlink_find_by_index(&s->windows, wl->idx); + wl_new = winlink_find_by_window(&s->windows, wl->window); if (wl_new != NULL) TAILQ_INSERT_TAIL(&s->lastw, wl_new, sentry); } -- cgit From 282c5f9644ed262ee15efbd3d072f7acc577da15 Mon Sep 17 00:00:00 2001 From: nicm Date: Thu, 10 Oct 2013 12:26:34 +0000 Subject: Alter how tmux handles the working directory to internally use file descriptors rather than strings. - Each session still has a current working directory. - New sessions still get their working directory from the client that created them or its attached session if any. - New windows are created by default in the session working directory. - The -c flag to new, neww, splitw allows the working directory to be overridden. - The -c flag to attach let's the session working directory be changed. - The default-path option has been removed. To get the equivalent to default-path '.', do: bind c neww -c $PWD To get the equivalent of default-path '~', do: bind c neww -c ~ This also changes the client identify protocol to be a set of messages rather than one as well as some other changes that should make it easier to make backwards-compatible protocol changes in future. --- session.c | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) (limited to 'session.c') diff --git a/session.c b/session.c index f967de19..4f6ebed6 100644 --- a/session.c +++ b/session.c @@ -85,9 +85,8 @@ session_find_by_id(u_int id) /* Create a new session. */ struct session * -session_create(const char *name, const char *cmd, const char *cwd, - struct environ *env, struct termios *tio, int idx, u_int sx, u_int sy, - char **cause) +session_create(const char *name, const char *cmd, int cwd, struct environ *env, + struct termios *tio, int idx, u_int sx, u_int sy, char **cause) { struct session *s; @@ -99,7 +98,7 @@ session_create(const char *name, const char *cmd, const char *cwd, fatal("gettimeofday failed"); session_update_activity(s); - s->cwd = xstrdup(cwd); + s->cwd = dup(cwd); s->curw = NULL; TAILQ_INIT(&s->lastw); @@ -171,7 +170,7 @@ session_destroy(struct session *s) winlink_remove(&s->windows, wl); } - free(s->cwd); + close(s->cwd); RB_INSERT(sessions, &dead_sessions, s); } @@ -227,8 +226,8 @@ session_previous_session(struct session *s) /* Create a new window on a session. */ struct winlink * -session_new(struct session *s, - const char *name, const char *cmd, const char *cwd, int idx, char **cause) +session_new(struct session *s, const char *name, const char *cmd, int cwd, + int idx, char **cause) { struct window *w; struct winlink *wl; @@ -251,8 +250,8 @@ session_new(struct session *s, shell = _PATH_BSHELL; hlimit = options_get_number(&s->options, "history-limit"); - w = window_create( - name, cmd, shell, cwd, &env, s->tio, s->sx, s->sy, hlimit, cause); + w = window_create(name, cmd, shell, cwd, &env, s->tio, s->sx, s->sy, + hlimit, cause); if (w == NULL) { winlink_remove(&s->windows, wl); environ_free(&env); -- cgit