static bool peerman_read_rec(struct peer_manager *peers, const struct p2p_message *msg) { if (!strncmp(msg->hdr.command, "magic.peers", sizeof(msg->hdr.command))) return true; if (strncmp(msg->hdr.command, "peer", sizeof(msg->hdr.command))) return false; struct const_buffer buf = { msg->data, msg->hdr.data_len }; struct peer *peer; peer = calloc(1, sizeof(*peer)); peer_init(peer); if (deser_peer(CADDR_TIME_VERSION, peer, &buf) && !peerman_has_addr(peers, peer->addr.ip)) __peerman_add(peers, peer, false); else { peer_free(peer); free(peer); } return true; }
void peerman_add(struct peer_manager *peers, const struct peer *peer_in, bool known_working) { if (peerman_has_addr(peers, peer_in->addr.ip)) return; struct peer *peer; peer = malloc(sizeof(*peer)); if (!peer) return; peer_copy(peer, peer_in); __peerman_add(peers, peer, !known_working); }
void peerman_add_addr(struct peer_manager *peers, const struct bp_address *addr_in, bool known_working) { if (peerman_has_addr(peers, addr_in->ip)) return; struct peer *peer; peer = malloc(sizeof(*peer)); if (!peer) return; peer_init(peer); bp_addr_copy(&peer->addr, addr_in); __peerman_add(peers, peer, !known_working); }
void peerman_addstr(struct peer_manager *peers, const char *addr_str) { char hoststr[64] = {}; char portstr[16] = {}; char *space = strchr(addr_str, ' '); int port; if (space) { unsigned int hlen = (space - addr_str); if (hlen > (sizeof(hoststr) - 1)) hlen = sizeof(hoststr) - 1; memcpy(hoststr, addr_str, hlen); hoststr[hlen] = 0; strncpy(portstr, space + 1, sizeof(portstr) - 1); } else { strncpy(hoststr, addr_str, sizeof(hoststr) - 1); strcpy(portstr, "8333"); } port = atoi(portstr); if (port < 1 || port > 65535) port = 8333; GList *tmp, *seedlist = bu_dns_lookup(NULL, hoststr, port); if (debugging) fprintf(stderr, "peerman: DNS lookup '%s' returned %u addresses\n", addr_str, g_list_length(seedlist)); /* import seed data into peerman */ tmp = seedlist; while (tmp) { __peerman_add(peers, tmp->data, true); tmp = tmp->next; } g_list_free(seedlist); }