static zre_peer_t * s_require_peer (agent_t *self, char *identity, char *address, uint16_t port) { zre_peer_t *peer = (zre_peer_t *) zhash_lookup (self->peers, identity); if (!peer) { // Purge any previous peer on same endpoint char endpoint [100]; snprintf (endpoint, 100, "%s:%hu", address, port); zhash_foreach (self->peers, agent_peer_purge, endpoint); peer = zre_peer_new (identity, self->peers, self->ctx); zre_peer_connect (peer, self->identity, endpoint); // Handshake discovery by sending HELLO as first message zre_msg_t *msg = zre_msg_new (ZRE_MSG_HELLO); zre_msg_ipaddress_set (msg, zre_udp_host (self->udp)); zre_msg_mailbox_set (msg, self->port); zre_msg_groups_set (msg, zhash_keys (self->own_groups)); zre_msg_status_set (msg, self->status); zre_msg_headers_set (msg, zhash_dup (self->headers)); zre_peer_send (peer, &msg); zre_log_info (self->log, ZRE_LOG_MSG_EVENT_ENTER, zre_peer_endpoint (peer), endpoint); // Now tell the caller about the peer zstr_sendm (self->pipe, "ENTER"); zstr_send (self->pipe, identity); } return peer; }
int zre_msg_send_hello ( void *output, uint16_t sequence, char *ipaddress, uint16_t mailbox, zlist_t *groups, byte status, zhash_t *headers) { zre_msg_t *self = zre_msg_new (ZRE_MSG_HELLO); zre_msg_sequence_set (self, sequence); zre_msg_ipaddress_set (self, ipaddress); zre_msg_mailbox_set (self, mailbox); zre_msg_groups_set (self, zlist_dup (groups)); zre_msg_status_set (self, status); zre_msg_headers_set (self, zhash_dup (headers)); return zre_msg_send (&self, output); }