4 * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
6 * Permission to use, copy, modify, and distribute this software for any
7 * purpose with or without fee is hereby granted, provided that the above
8 * copyright notice and this permission notice appear in all copies.
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14 * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
15 * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
16 * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
19 #include <sys/types.h>
26 * Attach existing session to the current terminal.
29 enum cmd_retval
cmd_attach_session_exec(struct cmd
*, struct cmd_q
*);
31 const struct cmd_entry cmd_attach_session_entry
= {
32 "attach-session", "attach",
34 "[-dr] " CMD_TARGET_SESSION_USAGE
,
35 CMD_CANTNEST
|CMD_STARTSERVER
|CMD_SENDENVIRON
,
38 cmd_attach_session_exec
42 cmd_attach_session(struct cmd_q
*cmdq
, const char* tflag
, int dflag
, int rflag
)
50 if (RB_EMPTY(&sessions
)) {
51 cmdq_error(cmdq
, "no sessions");
52 return (CMD_RETURN_ERROR
);
55 if ((s
= cmd_find_session(cmdq
, tflag
, 1)) == NULL
)
56 return (CMD_RETURN_ERROR
);
58 if (cmdq
->client
== NULL
)
59 return (CMD_RETURN_NORMAL
);
61 if (cmdq
->client
->session
!= NULL
) {
64 * Can't use server_write_session in case attaching to
65 * the same session as currently attached to.
67 for (i
= 0; i
< ARRAY_LENGTH(&clients
); i
++) {
68 c
= ARRAY_ITEM(&clients
, i
);
69 if (c
== NULL
|| c
->session
!= s
)
71 if (c
== cmdq
->client
)
73 server_write_client(c
, MSG_DETACH
, NULL
, 0);
77 cmdq
->client
->session
= s
;
78 notify_attached_session_changed(cmdq
->client
);
79 session_update_activity(s
);
80 server_redraw_client(cmdq
->client
);
81 s
->curw
->flags
&= ~WINLINK_ALERTFLAGS
;
83 if (server_client_open(cmdq
->client
, s
, &cause
) != 0) {
84 cmdq_error(cmdq
, "open terminal failed: %s", cause
);
86 return (CMD_RETURN_ERROR
);
90 cmdq
->client
->flags
|= CLIENT_READONLY
;
93 server_write_session(s
, MSG_DETACH
, NULL
, 0);
95 update
= options_get_string(&s
->options
, "update-environment");
96 environ_update(update
, &cmdq
->client
->environ
, &s
->environ
);
98 cmdq
->client
->session
= s
;
99 notify_attached_session_changed(cmdq
->client
);
100 session_update_activity(s
);
101 server_redraw_client(cmdq
->client
);
102 s
->curw
->flags
&= ~WINLINK_ALERTFLAGS
;
104 server_write_ready(cmdq
->client
);
105 cmdq
->client_exit
= 0;
108 server_update_socket();
110 return (CMD_RETURN_NORMAL
);
114 cmd_attach_session_exec(struct cmd
*self
, struct cmd_q
*cmdq
)
116 struct args
*args
= self
->args
;
118 return (cmd_attach_session(cmdq
, args_get(args
, 't'),
119 args_has(args
, 'd'), args_has(args
, 'r')));