struct peer_manager *peerman_seed(bool use_dns) { struct peer_manager *peers; peers = peerman_new(); if (!peers) return NULL; /* make DNS query for seed data */ clist *tmp, *seedlist = NULL; if (use_dns) seedlist = bu_dns_seed_addrs(); log_debug("peerman: DNS returned %zu addresses", clist_length(seedlist)); clist_shuffle(seedlist); /* import seed data into peerman */ tmp = seedlist; while (tmp) { struct bp_address *addr = tmp->data; tmp = tmp->next; peerman_add_addr(peers, addr, true); free(addr); } clist_free(seedlist); return peers; }
/** *struct msg_addr { parr *addrs; //bp_address array }; */ static bool nc_msg_addr(struct nc_conn *conn) { struct const_buffer buf = { conn->msg.data, conn->msg.hdr.data_len }; struct msg_addr ma; bool rc = false; msg_addr_init(&ma);/* just a memset 0*/ if (!deser_msg_addr(conn->protover, &ma, &buf)) goto out; unsigned int i; time_t cutoff = time(NULL) - (7 * 24 * 60 * 60); if (debugging) { unsigned int old = 0; for (i = 0; i < ma.addrs->len; i++) { struct bp_address *addr = parr_idx(ma.addrs, i); if (addr->nTime < cutoff) old++; } fprintf(plog, "net: %s addr(%zu addresses, %u old)\n", conn->addr_str, ma.addrs->len, old); } /* ignore ancient addresses */ if (conn->protover < CADDR_TIME_VERSION){ LOG("all addresses rejected because protover < CADDR_TIME_VERSION"); goto out_ok; } /* feed addresses to peer manager */ int l_cnt = 0; for (i = 0; i < ma.addrs->len; i++) { struct bp_address *addr = parr_idx(ma.addrs, i); if (addr->nTime > cutoff){ l_cnt++; peerman_add_addr(conn->nci->peers, addr, false); } } LOG("number of addresses added from peer:%d", l_cnt); out_ok: rc = true; out: msg_addr_free(&ma); return rc; }
static bool nc_msg_addr(struct nc_conn *conn) { struct const_buffer buf = { conn->msg.data, conn->msg.hdr.data_len }; struct msg_addr ma; bool rc = false; msg_addr_init(&ma); if (!deser_msg_addr(conn->protover, &ma, &buf)) goto out; unsigned int i; time_t cutoff = time(NULL) - (7 * 24 * 60 * 60); if (log_state->debug) { unsigned int old = 0; for (i = 0; i < ma.addrs->len; i++) { struct bp_address *addr = parr_idx(ma.addrs, i); if (addr->nTime < cutoff) old++; } log_debug("net: %s addr(%zu addresses, %u old)", conn->addr_str, ma.addrs->len, old); } /* ignore ancient addresses */ if (conn->protover < CADDR_TIME_VERSION) goto out_ok; /* feed addresses to peer manager */ for (i = 0; i < ma.addrs->len; i++) { struct bp_address *addr = parr_idx(ma.addrs, i); if (addr->nTime > cutoff) peerman_add_addr(conn->nci->peers, addr, false); } out_ok: rc = true; out: msg_addr_free(&ma); return rc; }
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; clist *tmp, *seedlist = bu_dns_lookup(NULL, hoststr, port); if (debugging) fprintf(stderr, "peerman: DNS lookup '%s' returned %zu addresses\n", addr_str, clist_length(seedlist)); /* import seed data into peerman */ tmp = seedlist; while (tmp) { struct bp_address *addr = tmp->data; tmp = tmp->next; peerman_add_addr(peers, addr, true); } clist_free(seedlist); }