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
,
37 cmd_attach_session_exec
41 cmd_attach_session(struct cmd_q
*cmdq
, const char* tflag
, int dflag
, int rflag
)
49 if (RB_EMPTY(&sessions
)) {
50 cmdq_error(cmdq
, "no sessions");
51 return (CMD_RETURN_ERROR
);
54 if ((s
= cmd_find_session(cmdq
, tflag
, 1)) == NULL
)
55 return (CMD_RETURN_ERROR
);
57 if (cmdq
->client
== NULL
)
58 return (CMD_RETURN_NORMAL
);
60 if (cmdq
->client
->session
!= NULL
) {
63 * Can't use server_write_session in case attaching to
64 * the same session as currently attached to.
66 for (i
= 0; i
< ARRAY_LENGTH(&clients
); i
++) {
67 c
= ARRAY_ITEM(&clients
, i
);
68 if (c
== NULL
|| c
->session
!= s
)
70 if (c
== cmdq
->client
)
72 server_write_client(c
, MSG_DETACH
, NULL
, 0);
76 cmdq
->client
->session
= s
;
77 notify_attached_session_changed(cmdq
->client
);
78 session_update_activity(s
);
79 server_redraw_client(cmdq
->client
);
80 s
->curw
->flags
&= ~WINLINK_ALERTFLAGS
;
82 if (server_client_open(cmdq
->client
, s
, &cause
) != 0) {
83 cmdq_error(cmdq
, "open terminal failed: %s", cause
);
85 return (CMD_RETURN_ERROR
);
89 cmdq
->client
->flags
|= CLIENT_READONLY
;
92 server_write_session(s
, MSG_DETACH
, NULL
, 0);
94 update
= options_get_string(&s
->options
, "update-environment");
95 environ_update(update
, &cmdq
->client
->environ
, &s
->environ
);
97 cmdq
->client
->session
= s
;
98 notify_attached_session_changed(cmdq
->client
);
99 session_update_activity(s
);
100 server_redraw_client(cmdq
->client
);
101 s
->curw
->flags
&= ~WINLINK_ALERTFLAGS
;
103 server_write_ready(cmdq
->client
);
104 cmdq
->client_exit
= 0;
107 server_update_socket();
109 return (CMD_RETURN_NORMAL
);
113 cmd_attach_session_exec(struct cmd
*self
, struct cmd_q
*cmdq
)
115 struct args
*args
= self
->args
;
117 return (cmd_attach_session(cmdq
, args_get(args
, 't'),
118 args_has(args
, 'd'), args_has(args
, 'r')));