summaryrefslogtreecommitdiffhomepage
path: root/cli-session.c
diff options
context:
space:
mode:
Diffstat (limited to 'cli-session.c')
-rw-r--r--cli-session.c33
1 files changed, 25 insertions, 8 deletions
diff --git a/cli-session.c b/cli-session.c
index 0e906e6..be36bec 100644
--- a/cli-session.c
+++ b/cli-session.c
@@ -76,12 +76,14 @@ static const struct ChanType *cli_chantypes[] = {
void cli_session(int sock, char* remotehost) {
+ seedrandom();
+
crypto_init();
+
common_session_init(sock, remotehost);
chaninitialise(cli_chantypes);
-
/* Set up cli_ses vars */
cli_session_init();
@@ -91,12 +93,8 @@ void cli_session(int sock, char* remotehost) {
/* Exchange identification */
session_identification();
- seedrandom();
-
send_msg_kexinit();
- /* XXX here we do stuff differently */
-
session_loop(cli_sessionloop);
/* Not reached */
@@ -214,19 +212,38 @@ static void cli_sessionloop() {
*/
case USERAUTH_SUCCESS_RCVD:
+
+ if (cli_opts.backgrounded) {
+ int devnull;
+ // keeping stdin open steals input from the terminal and
+ // is confusing, though stdout/stderr could be useful.
+ devnull = open(_PATH_DEVNULL, O_RDONLY);
+ if (devnull < 0) {
+ dropbear_exit("opening /dev/null: %d %s",
+ errno, strerror(errno));
+ }
+ dup2(devnull, STDIN_FILENO);
+ if (daemon(0, 1) < 0) {
+ dropbear_exit("Backgrounding failed: %d %s",
+ errno, strerror(errno));
+ }
+ }
+
#ifdef ENABLE_CLI_LOCALTCPFWD
setup_localtcp();
#endif
#ifdef ENABLE_CLI_REMOTETCPFWD
setup_remotetcp();
#endif
- cli_send_chansess_request();
- TRACE(("leave cli_sessionloop: cli_send_chansess_request"))
+ if (!cli_opts.no_cmd) {
+ cli_send_chansess_request();
+ }
+ TRACE(("leave cli_sessionloop: running"))
cli_ses.state = SESSION_RUNNING;
return;
case SESSION_RUNNING:
- if (ses.chancount < 1) {
+ if (ses.chancount < 1 && !cli_opts.no_cmd) {
cli_finished();
}