int cli_main(int argc, char ** argv) { #else int main(int argc, char ** argv) { #endif int sock_in, sock_out; struct dropbear_progress_connection *progress = NULL; _dropbear_exit = cli_dropbear_exit; _dropbear_log = cli_dropbear_log; disallow_core(); seedrandom(); crypto_init(); cli_getopts(argc, argv); #ifndef DISABLE_SYSLOG if (opts.usingsyslog) { startsyslog("dbclient"); } #endif TRACE(("user='******' host='%s' port='%s' bind_address='%s' bind_port='%s'", cli_opts.username, cli_opts.remotehost, cli_opts.remoteport, cli_opts.bind_address, cli_opts.bind_port)) if (signal(SIGPIPE, SIG_IGN) == SIG_ERR) { dropbear_exit("signal() error"); } pid_t proxy_cmd_pid = 0; #if DROPBEAR_CLI_PROXYCMD if (cli_opts.proxycmd) { cli_proxy_cmd(&sock_in, &sock_out, &proxy_cmd_pid); m_free(cli_opts.proxycmd); if (signal(SIGINT, kill_proxy_sighandler) == SIG_ERR || signal(SIGTERM, kill_proxy_sighandler) == SIG_ERR || signal(SIGHUP, kill_proxy_sighandler) == SIG_ERR) { dropbear_exit("signal() error"); } } else #endif { progress = connect_remote(cli_opts.remotehost, cli_opts.remoteport, cli_connected, &ses, cli_opts.bind_address, cli_opts.bind_port); sock_in = sock_out = -1; } cli_session(sock_in, sock_out, progress, proxy_cmd_pid); /* not reached */ return -1; }
int dropbear_main(int argc, char ** argv) { #else int main(int argc, char ** argv) { #endif unsigned int i; struct sockaddr remoteaddr; runopts * opts; FILE * pidfile; int childpipe[2]; struct sigaction sa_chld; /* get commandline options */ opts = getrunopts(argc, argv); #ifndef DISABLE_SYSLOG if (usingsyslog) { startsyslog(); } #endif /* create a PID file so that we can be killed easily */ pidfile = fopen(DROPBEAR_PIDFILE, "w"); if (pidfile) { fprintf(pidfile, "%d\n", getpid()); fclose(pidfile); } /* set up cleanup handler */ if (signal(SIGINT, sigintterm_handler) == SIG_ERR || signal(SIGTERM, sigintterm_handler) == SIG_ERR || signal(SIGPIPE, SIG_IGN)) { dropbear_exit("signal() error"); } /* catch and reap zombie children */ sa_chld.sa_handler = sigchld_handler; sa_chld.sa_flags = SA_NOCLDSTOP; if (sigaction(SIGCHLD, &sa_chld, NULL) < 0) { dropbear_exit("signal() error"); } if (signal(SIGSEGV, sigsegv_handler) == SIG_ERR) { dropbear_exit("signal() error"); } /* sockets to identify pre-authenticated clients */ for (i = 0; i < MAX_UNAUTH_CLIENTS; i++) { childpipes[i] = -1; } /* Set up the listening sockets */ /* XXX XXX ports * listensockcount = listensockets(listensocks, opts, &maxsock); */ if (pipe(childpipe) < 0) { TRACE(("error creating child pipe")); close(0); return -1; } /* start the session */ child_session(0, opts, childpipe[1], &remoteaddr); /* don't reach here */ return -1; }