version 1.3, 2009/07/13 23:11:35 |
version 1.4, 2009/07/17 15:03:11 |
|
|
{ |
{ |
struct cmd_target_data *data = self->data; |
struct cmd_target_data *data = self->data; |
struct session *s; |
struct session *s; |
|
struct client *c; |
char *cause; |
char *cause; |
|
u_int i; |
|
|
if (ctx->curclient != NULL) |
|
return (0); |
|
|
|
if (ARRAY_LENGTH(&sessions) == 0) { |
if (ARRAY_LENGTH(&sessions) == 0) { |
ctx->error(ctx, "no sessions"); |
ctx->error(ctx, "no sessions"); |
return (-1); |
return (-1); |
|
|
if ((s = cmd_find_session(ctx, data->target)) == NULL) |
if ((s = cmd_find_session(ctx, data->target)) == NULL) |
return (-1); |
return (-1); |
|
|
if (!(ctx->cmdclient->flags & CLIENT_TERMINAL)) { |
if (ctx->cmdclient == NULL) { |
ctx->error(ctx, "not a terminal"); |
if (data->chflags & CMD_CHFLAG('d')) { |
return (-1); |
/* |
} |
* Can't use server_write_session in case attaching to |
|
* the same session as currently attached to. |
|
*/ |
|
for (i = 0; i < ARRAY_LENGTH(&clients); i++) { |
|
c = ARRAY_ITEM(&clients, i); |
|
if (c == NULL || c->session != s) |
|
continue; |
|
if (c == ctx->curclient) |
|
continue; |
|
server_write_client(c, MSG_DETACH, NULL, 0); |
|
} |
|
} |
|
|
|
ctx->curclient->session = s; |
|
server_redraw_client(ctx->curclient); |
|
} else { |
|
if (!(ctx->cmdclient->flags & CLIENT_TERMINAL)) { |
|
ctx->error(ctx, "not a terminal"); |
|
return (-1); |
|
} |
|
|
if (tty_open(&ctx->cmdclient->tty, &cause) != 0) { |
if (tty_open(&ctx->cmdclient->tty, &cause) != 0) { |
ctx->error(ctx, "terminal open failed: %s", cause); |
ctx->error(ctx, "terminal open failed: %s", cause); |
xfree(cause); |
xfree(cause); |
return (-1); |
return (-1); |
} |
} |
|
|
if (data->chflags & CMD_CHFLAG('d')) |
if (data->chflags & CMD_CHFLAG('d')) |
server_write_session(s, MSG_DETACH, NULL, 0); |
server_write_session(s, MSG_DETACH, NULL, 0); |
ctx->cmdclient->session = s; |
|
|
|
server_write_client(ctx->cmdclient, MSG_READY, NULL, 0); |
ctx->cmdclient->session = s; |
|
server_write_client(ctx->cmdclient, MSG_READY, NULL, 0); |
|
server_redraw_client(ctx->cmdclient); |
|
} |
recalculate_sizes(); |
recalculate_sizes(); |
server_redraw_client(ctx->cmdclient); |
|
|
|
return (1); |
return (1); /* 1 means don't tell command client to exit */ |
} |
} |