// Listen for incoming SSH connections. // When a connection is established, write all data received to stdout. void server_pipe(char *host, int port) { ssh_bind b = ssh_bind_new(); ssh_session s = ssh_new(); ssh_bind_options_set(b, SSH_BIND_OPTIONS_BINDADDR, host); ssh_bind_options_set(b, SSH_BIND_OPTIONS_BINDPORT, &port); ssh_bind_options_set(b, SSH_BIND_OPTIONS_RSAKEY, "test-server-key"); ssh_bind_options_set(b, SSH_BIND_OPTIONS_LOG_VERBOSITY_STR, "5"); if(ssh_bind_listen(b) < 0) session_error(b, "listen"); if(ssh_bind_accept(b, s) != SSH_OK) session_error(b, "accept"); if(ssh_accept(s) < 0) session_error(s, "handshake"); int state = SERVER_CONNECTED; while(1) { ssh_message m = ssh_message_get(s); if(m) { int type = ssh_message_type(m); int subtype = ssh_message_subtype(m); ssh_message_auth_set_methods(m, SSH_AUTH_METHOD_PUBLICKEY); server_handle_message(s, m, type, subtype, &state); ssh_message_free(m); if(state == SERVER_CLOSED) { ssh_disconnect(s); ssh_bind_free(b); ssh_finalize(); return; } } else { session_error(s, "session"); } } }
int main(int argc, char **argv){ SSH_OPTIONS *options=ssh_options_new(); SSH_SESSION *session; SSH_BIND *ssh_bind; CHANNEL *chan=NULL; SFTP_SESSION *sftp=NULL; int ret; int donotfork=0; char *config="mercurius.conf"; ssh_options_getopt(options,&argc,argv); while((ret=getopt(argc, argv, "Df:"))!=-1){ switch(ret){ case 'D': donotfork=1; break; case 'f': config=strdup(optarg); break; case '?': usage(argv[0]); exit(1); } } if(optind<argc) { usage(argv[0]); exit(1); } ret=parse_config(config); if(ret != 0){ printf("Error parsing configuration file\n"); return 1; } if(!rsa && !dsa){ printf("There must be at least one RSA or DSA host key\n"); return 1; } if(dsa) ssh_options_set_dsa_server_key(options,dsa); if(rsa) ssh_options_set_rsa_server_key(options,rsa); //printf("port : %d\n",port); if(port!=0) ssh_options_set_port(options,port); ssh_bind=ssh_bind_new(); ssh_bind_set_options(ssh_bind,options); if(ssh_bind_listen(ssh_bind)<0){ printf("Error listening to socket: %s\n",ssh_get_error(ssh_bind)); return 1; } signal(SIGCHLD,SIG_IGN); if(!donotfork){ ssh_say(1,"Going into background...\n"); if(fork()){ exit(0); } } while(1){ session=ssh_bind_accept(ssh_bind); if(!session){ printf("error accepting a connection : %s\n",ssh_get_error(ssh_bind)); return 1; } if(fork()==0){ break; } ssh_silent_disconnect(session); } ssh_bind_free(ssh_bind); //printf("Socket connected : %d\n",ssh_get_fd(session)); if(ssh_accept(session)){ printf("ssh_accept : %s\n",ssh_get_error(session)); return 1; } if(do_auth(session)<0){ printf("error : %s\n",ssh_get_error(session)); return 1; } ssh_say(1,"user authenticated\n"); chan=recv_channel(session); if(!chan){ printf("error : %s\n",ssh_get_error(session)); return 1; } sftp=sftp_server_new(session,chan); if(sftp_server_init(sftp)){ printf("error : %s\n",ssh_get_error(session)); return 1; } ssh_say(1,"Sftp session open by client\n"); sftploop(session,sftp); ssh_say(1,"Client disconnected\n"); ssh_disconnect(session); return 0; }