int ndmis_tcp_close (struct ndm_session *sess) { struct ndm_image_stream *is = &sess->plumb.image_stream; switch (is->remote.connect_status) { case NDMIS_CONN_LISTEN: ndmchan_cleanup (&is->remote.listen_chan); break; case NDMIS_CONN_CONNECTED: case NDMIS_CONN_ACCEPTED: ndmchan_cleanup (&is->chan); break; default: break; } ndmis_reinit_remote (sess); return 0; }
void ndmda_data_halt (struct ndm_session *sess, ndmp9_data_halt_reason reason) { struct ndm_data_agent * da = sess->data_acb; da->data_state.state = NDMP9_DATA_STATE_HALTED; da->data_state.halt_reason = reason; da->data_notify_pending = 1; ndmda_fh_flush (sess); ndmis_data_close (sess); ndmchan_cleanup (&da->formatter_image); ndmchan_cleanup (&da->formatter_error); ndmchan_cleanup (&da->formatter_wrap); /* this needs to be better */ if (da->formatter_pid) { sleep (1); /* give gtar a chance to stop by itself */ kill (da->formatter_pid, SIGTERM); } }
int ndmis_tcp_accept (struct ndm_session *sess) { struct ndm_image_stream *is = &sess->plumb.image_stream; char * what = "???"; ndmp9_tcp_addr * tcp_addr; struct sockaddr sa; struct sockaddr_in * sin = (struct sockaddr_in *) &sa; socklen_t len; int accept_sock = -1; what = "remote-conn-stat"; if (is->remote.connect_status != NDMIS_CONN_LISTEN) goto fail; what = "remote-list-ready"; if (!is->remote.listen_chan.ready) goto fail; what = "accept"; len = sizeof sa; accept_sock = accept (is->remote.listen_chan.fd, &sa, &len); ndmchan_cleanup (&is->remote.listen_chan); if (accept_sock < 0) { is->remote.connect_status = NDMIS_CONN_BOTCHED; goto fail; } /* write what we know, ndmis...addrs() will update if possible */ is->remote.peer_addr.addr_type = NDMP9_ADDR_TCP; tcp_addr = &is->remote.peer_addr.ndmp9_addr_u.tcp_addr; tcp_addr->ip_addr = ntohl (sin->sin_addr.s_addr); tcp_addr->port = ntohs (sin->sin_port); ndmis_tcp_green_light (sess, accept_sock, NDMIS_CONN_ACCEPTED); return 0; fail: ndmalogf (sess, 0, 2, "ndmis_tcp_accept(): %s failed", what); if (accept_sock >= 0) close (accept_sock); return -1; }