version 1.5, 2009/07/22 22:47:43 |
version 1.6, 2009/07/23 12:33:48 |
|
|
struct session *s; |
struct session *s; |
struct options *oo; |
struct options *oo; |
char *cmd, *cwd, *cause; |
char *cmd, *cwd, *cause; |
|
int detached; |
u_int sx, sy; |
u_int sx, sy; |
|
|
if (data->newname != NULL && session_find(data->newname) != NULL) { |
if (data->newname != NULL && session_find(data->newname) != NULL) { |
|
|
} |
} |
|
|
/* |
/* |
* There are two cases: |
* There are three cases: |
* |
* |
* 1. If cmdclient is non-NULL, new-session has been called from the |
* 1. If cmdclient is non-NULL, new-session has been called from the |
* command-line - cmdclient is to become a new attached, interactive |
* command-line - cmdclient is to become a new attached, interactive |
|
|
* 2. If cmdclient is NULL, new-session has been called from an |
* 2. If cmdclient is NULL, new-session has been called from an |
* existing client (such as a key binding). |
* existing client (such as a key binding). |
* |
* |
* In both cases, a new additional session needs to be created and |
* 3. Both are NULL, the command was in the configuration file. Treat |
|
* this as if -d was given even if it was not. |
|
* |
|
* In all cases, a new additional session needs to be created and |
* (unless -d) set as the current session for the client. |
* (unless -d) set as the current session for the client. |
*/ |
*/ |
|
|
|
/* Set -d if no client. */ |
|
detached = data->flag_detached; |
|
if (ctx->cmdclient == NULL && ctx->curclient == NULL) |
|
detached = 1; |
|
|
/* Open the terminal if necessary. */ |
/* Open the terminal if necessary. */ |
if (!data->flag_detached && ctx->cmdclient != NULL) { |
if (!detached && ctx->cmdclient != NULL) { |
if (!(ctx->cmdclient->flags & CLIENT_TERMINAL)) { |
if (!(ctx->cmdclient->flags & CLIENT_TERMINAL)) { |
ctx->error(ctx, "not a terminal"); |
ctx->error(ctx, "not a terminal"); |
return (-1); |
return (-1); |
|
|
* path and command. |
* path and command. |
*/ |
*/ |
oo = &global_s_options; |
oo = &global_s_options; |
if (ctx->cmdclient == NULL) |
if (ctx->cmdclient == NULL && ctx->curclient != NULL) |
oo = &ctx->curclient->session->options; |
oo = &ctx->curclient->session->options; |
|
|
/* Find new session size and options. */ |
/* Find new session size and options. */ |
if (data->flag_detached) { |
if (detached) { |
sx = 80; |
sx = 80; |
sy = 25; |
sy = 25; |
} else { |
} else { |
|
|
* to exit. |
* to exit. |
*/ |
*/ |
if (ctx->cmdclient != NULL) { |
if (ctx->cmdclient != NULL) { |
if (!data->flag_detached) |
if (!detached) |
server_write_client(ctx->cmdclient, MSG_READY, NULL, 0); |
server_write_client(ctx->cmdclient, MSG_READY, NULL, 0); |
else |
else |
server_write_client(ctx->cmdclient, MSG_EXIT, NULL, 0); |
server_write_client(ctx->cmdclient, MSG_EXIT, NULL, 0); |
} |
} |
|
|
/* Set the client to the new session. */ |
/* Set the client to the new session. */ |
if (!data->flag_detached) { |
if (!detached) { |
if (ctx->cmdclient != NULL) { |
if (ctx->cmdclient != NULL) { |
ctx->cmdclient->session = s; |
ctx->cmdclient->session = s; |
server_redraw_client(ctx->cmdclient); |
server_redraw_client(ctx->cmdclient); |