comparison cli-main.c @ 1208:fb58cf341951

Client: kill proxy command when exiting application.
author Konstantin Tokarev <ktokarev@smartlabs.tv>
date Thu, 03 Dec 2015 16:22:29 +0300
parents 23103e1e9548
children bf626d259eb1
comparison
equal deleted inserted replaced
1195:8a5e9a97bd7a 1208:fb58cf341951
34 34
35 static void cli_dropbear_exit(int exitcode, const char* format, va_list param) ATTRIB_NORETURN; 35 static void cli_dropbear_exit(int exitcode, const char* format, va_list param) ATTRIB_NORETURN;
36 static void cli_dropbear_log(int priority, const char* format, va_list param); 36 static void cli_dropbear_log(int priority, const char* format, va_list param);
37 37
38 #ifdef ENABLE_CLI_PROXYCMD 38 #ifdef ENABLE_CLI_PROXYCMD
39 static void cli_proxy_cmd(int *sock_in, int *sock_out); 39 static void cli_proxy_cmd(int *sock_in, int *sock_out, pid_t *pid_out);
40 static void killchild(int signo);
40 #endif 41 #endif
41 42
42 #if defined(DBMULTI_dbclient) || !defined(DROPBEAR_MULTI) 43 #if defined(DBMULTI_dbclient) || !defined(DROPBEAR_MULTI)
43 #if defined(DBMULTI_dbclient) && defined(DROPBEAR_MULTI) 44 #if defined(DBMULTI_dbclient) && defined(DROPBEAR_MULTI)
44 int cli_main(int argc, char ** argv) { 45 int cli_main(int argc, char ** argv) {
64 65
65 if (signal(SIGPIPE, SIG_IGN) == SIG_ERR) { 66 if (signal(SIGPIPE, SIG_IGN) == SIG_ERR) {
66 dropbear_exit("signal() error"); 67 dropbear_exit("signal() error");
67 } 68 }
68 69
70 pid_t proxy_cmd_pid = 0;
69 #ifdef ENABLE_CLI_PROXYCMD 71 #ifdef ENABLE_CLI_PROXYCMD
70 if (cli_opts.proxycmd) { 72 if (cli_opts.proxycmd) {
71 cli_proxy_cmd(&sock_in, &sock_out); 73 cli_proxy_cmd(&sock_in, &sock_out, &proxy_cmd_pid);
72 m_free(cli_opts.proxycmd); 74 m_free(cli_opts.proxycmd);
75 if (signal(SIGINT, killchild) == SIG_ERR ||
76 signal(SIGTERM, killchild) == SIG_ERR ||
77 signal(SIGHUP, killchild) == SIG_ERR) {
78 dropbear_exit("signal() error");
79 }
73 } else 80 } else
74 #endif 81 #endif
75 { 82 {
76 progress = connect_remote(cli_opts.remotehost, cli_opts.remoteport, cli_connected, &ses); 83 progress = connect_remote(cli_opts.remotehost, cli_opts.remoteport, cli_connected, &ses);
77 sock_in = sock_out = -1; 84 sock_in = sock_out = -1;
78 } 85 }
79 86
80 cli_session(sock_in, sock_out, progress); 87 cli_session(sock_in, sock_out, progress, proxy_cmd_pid);
81 88
82 /* not reached */ 89 /* not reached */
83 return -1; 90 return -1;
84 } 91 }
85 #endif /* DBMULTI stuff */ 92 #endif /* DBMULTI stuff */
130 run_shell_command(cmd, ses.maxfd, usershell); 137 run_shell_command(cmd, ses.maxfd, usershell);
131 dropbear_exit("Failed to run '%s'\n", cmd); 138 dropbear_exit("Failed to run '%s'\n", cmd);
132 } 139 }
133 140
134 #ifdef ENABLE_CLI_PROXYCMD 141 #ifdef ENABLE_CLI_PROXYCMD
135 static void cli_proxy_cmd(int *sock_in, int *sock_out) { 142 static void cli_proxy_cmd(int *sock_in, int *sock_out, pid_t *pid_out) {
136 int ret; 143 int ret;
137 144
138 fill_passwd(cli_opts.own_user); 145 fill_passwd(cli_opts.own_user);
139 146
140 ret = spawn_command(exec_proxy_cmd, cli_opts.proxycmd, 147 ret = spawn_command(exec_proxy_cmd, cli_opts.proxycmd,
141 sock_out, sock_in, NULL, NULL); 148 sock_out, sock_in, NULL, pid_out);
142 if (ret == DROPBEAR_FAILURE) { 149 if (ret == DROPBEAR_FAILURE) {
143 dropbear_exit("Failed running proxy command"); 150 dropbear_exit("Failed running proxy command");
144 *sock_in = *sock_out = -1; 151 *sock_in = *sock_out = -1;
145 } 152 }
146 } 153 }
154
155 static void killchild(int signo)
156 {
157 kill_proxy_command();
158 if (signo)
159 _exit(1);
160 exit(1);
161 }
147 #endif /* ENABLE_CLI_PROXYCMD */ 162 #endif /* ENABLE_CLI_PROXYCMD */