/* returns DROPBEAR_FAILURE or DROPBEAR_SUCCESS */ static void x11accept(struct Listener* listener, int sock) { int fd; struct sockaddr_in addr; int len; int ret; struct ChanSess * chansess = (struct ChanSess *)(listener->typedata); len = sizeof(addr); fd = accept(sock, (struct sockaddr*)&addr, &len); if (fd < 0) { return; } /* if single-connection we close it up */ if (chansess->x11singleconn) { x11cleanup(chansess); } ret = send_msg_channel_open_x11(fd, &addr); if (ret == DROPBEAR_FAILURE) { close(fd); } }
/* clean a session channel */ void closechansess(struct Channel *channel) { struct ChanSess *chansess; unsigned int i; struct logininfo *li; chansess = (struct ChanSess*)channel->typedata; TRACE(("enter closechansess")); if (chansess == NULL) { TRACE(("leave closechansess: chansess == NULL")); return; } m_free(chansess->cmd); m_free(chansess->term); if (chansess->tty) { /* write the utmp/wtmp login record */ li = login_alloc_entry(chansess->pid, ses.authstate.username, ses.hostname, chansess->tty); login_logout(li); login_free_entry(li); //BRCM commented next line // pty_release(chansess->tty); m_free(chansess->tty); } #ifndef DISABLE_X11FWD x11cleanup(chansess); #endif #ifndef DISABLE_AGENTFWD agentcleanup(chansess); #endif /* clear child pid entries */ for (i = 0; i < ses.childpidsize; i++) { if (ses.childpids[i].chansess == chansess) { assert(ses.childpids[i].pid > 0); TRACE(("closing pid %d\n", ses.childpids[i].pid)); TRACE(("exited = %d\n", chansess->exited)); ses.childpids[i].pid = -1; ses.childpids[i].chansess = NULL; } } m_free(chansess); TRACE(("leave closechansess")); }