version 1.10, 2009/07/26 12:58:44 |
version 1.11, 2009/07/29 17:03:16 |
|
|
NULL |
NULL |
}; |
}; |
|
|
struct session *cmd_newest_session(void); |
struct session *cmd_newest_session(struct sessions *); |
struct client *cmd_lookup_client(const char *); |
struct client *cmd_lookup_client(const char *); |
struct session *cmd_lookup_session(const char *, int *); |
struct session *cmd_lookup_session(const char *, int *); |
struct winlink *cmd_lookup_window(struct session *, const char *, int *); |
struct winlink *cmd_lookup_window(struct session *, const char *, int *); |
|
|
|
|
/* |
/* |
* Figure out the current session. Use: 1) the current session, if the command |
* Figure out the current session. Use: 1) the current session, if the command |
* context has one; 2) the session specified in the TMUX variable from the |
* context has one; 2) the session containing the pty of the calling client, if |
* environment (as passed from the client); 3) the newest session. |
* any 3) the session specified in the TMUX variable from the environment (as |
|
* passed from the client); 3) the newest session. |
*/ |
*/ |
struct session * |
struct session * |
cmd_current_session(struct cmd_ctx *ctx) |
cmd_current_session(struct cmd_ctx *ctx) |
{ |
{ |
struct msg_command_data *data = ctx->msgdata; |
struct msg_command_data *data = ctx->msgdata; |
|
struct client *c = ctx->cmdclient; |
struct session *s; |
struct session *s; |
|
struct sessions ss; |
|
struct winlink *wl; |
|
struct window_pane *wp; |
|
u_int i; |
|
int found; |
|
|
if (ctx->cursession != NULL) |
if (ctx->cursession != NULL) |
return (ctx->cursession); |
return (ctx->cursession); |
|
|
|
/* |
|
* If the name of the calling client's pty is know, build a list of the |
|
* sessions that contain it and if any choose either the first or the |
|
* newest. |
|
*/ |
|
if (c != NULL && c->tty.path != NULL) { |
|
ARRAY_INIT(&ss); |
|
for (i = 0; i < ARRAY_LENGTH(&sessions); i++) { |
|
if ((s = ARRAY_ITEM(&sessions, i)) == NULL) |
|
continue; |
|
found = 0; |
|
RB_FOREACH(wl, winlinks, &s->windows) { |
|
TAILQ_FOREACH(wp, &wl->window->panes, entry) { |
|
if (strcmp(wp->tty, c->tty.path) == 0) { |
|
found = 1; |
|
break; |
|
} |
|
} |
|
if (found) |
|
break; |
|
} |
|
if (found) |
|
ARRAY_ADD(&ss, s); |
|
} |
|
|
|
s = cmd_newest_session(&ss); |
|
ARRAY_FREE(&ss); |
|
if (s != NULL) |
|
return (s); |
|
} |
|
|
|
/* Use the session from the TMUX environment variable. */ |
if (data != NULL && data->pid != -1) { |
if (data != NULL && data->pid != -1) { |
if (data->pid != getpid()) |
if (data->pid != getpid()) |
return (NULL); |
return (NULL); |
|
|
return (s); |
return (s); |
} |
} |
|
|
return (cmd_newest_session()); |
return (cmd_newest_session(&sessions)); |
} |
} |
|
|
/* Find the newest session. */ |
/* Find the newest session. */ |
struct session * |
struct session * |
cmd_newest_session(void) |
cmd_newest_session(struct sessions *ss) |
{ |
{ |
struct session *s, *snewest; |
struct session *s, *snewest; |
struct timeval *tv = NULL; |
struct timeval *tv = NULL; |
u_int i; |
u_int i; |
|
|
snewest = NULL; |
snewest = NULL; |
for (i = 0; i < ARRAY_LENGTH(&sessions); i++) { |
for (i = 0; i < ARRAY_LENGTH(ss); i++) { |
if ((s = ARRAY_ITEM(&sessions, i)) == NULL) |
if ((s = ARRAY_ITEM(ss, i)) == NULL) |
continue; |
continue; |
|
|
if (tv == NULL || timercmp(&s->tv, tv, >)) { |
if (tv == NULL || timercmp(&s->tv, tv, >)) { |