TransportImpl::AcceptConnectResult TcpTransport::accept_datalink(const RemoteTransport& remote, const ConnectionAttribs& attribs, TransportClient* client) { GuidConverter remote_conv(remote.repo_id_); GuidConverter local_conv(attribs.local_id_); VDBG_LVL((LM_DEBUG, "(%P|%t) TcpTransport::accept_datalink local %C " "accepting connection from remote %C\n", std::string(local_conv).c_str(), std::string(remote_conv).c_str()), 5); GuardType guard(connections_lock_); const PriorityKey key = blob_to_key(remote.blob_, attribs.priority_, false /* !active */); VDBG_LVL((LM_DEBUG, "(%P|%t) TcpTransport::accept_datalink PriorityKey " "prio=%d, addr=%C:%hu, is_loopback=%d, is_active=%d\n", attribs.priority_, key.address().get_host_addr(), key.address().get_port_number(), key.is_loopback(), key.is_active()), 2); TcpDataLink_rch link; { GuardType guard(links_lock_); if (find_datalink_i(key, link, client, remote.repo_id_)) { return link.is_nil() ? AcceptConnectResult(AcceptConnectResult::ACR_SUCCESS) : AcceptConnectResult(link._retn()); } else { link = new TcpDataLink(key.address(), this, key.priority(), key.is_loopback(), key.is_active()); if (links_.bind(key, link) != 0 /*OK*/) { ACE_ERROR((LM_ERROR, "(%P|%t) ERROR: TcpTransport::accept_datalink " "Unable to bind new TcpDataLink to " "TcpTransport in links_ map.\n")); return AcceptConnectResult(); } } } TcpConnection_rch connection; const ConnectionMap::iterator iter = connections_.find(key); if (iter != connections_.end()) { connection = iter->second; connections_.erase(iter); } if (connection.is_nil()) { if (!link->add_on_start_callback(client, remote.repo_id_)) { VDBG_LVL((LM_DEBUG, "(%P|%t) TcpTransport::accept_datalink " "got started link %@.\n", link.in()), 2); return AcceptConnectResult(link._retn()); } VDBG_LVL((LM_DEBUG, "(%P|%t) TcpTransport::accept_datalink " "no existing TcpConnection.\n"), 2); add_pending_connection(client, link.in()); // no link ready, passive_connection will complete later return AcceptConnectResult(AcceptConnectResult::ACR_SUCCESS); } guard.release(); // connect_tcp_datalink() isn't called with connections_lock_ if (connect_tcp_datalink(link, connection) == -1) { GuardType guard(links_lock_); links_.unbind(key); link = 0; } VDBG_LVL((LM_DEBUG, "(%P|%t) TcpTransport::accept_datalink " "connected link %@.\n", link.in()), 2); return AcceptConnectResult(link._retn()); }
static int misc_conv(int num_msg, const struct pam_message **msgm, struct pam_response **response, void *appdata_ptr) { return local_conv(num_msg, msgm, response, appdata_ptr); }