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; }
static void list_dns_seeds(void) { GList *tmp, *addrlist = bu_dns_seed_addrs(); size_t list_len = g_list_length(addrlist); unsigned int n_ent = 0; printf("[\n"); for (tmp = addrlist; tmp != NULL; tmp = tmp->next) { struct bp_address *addr = tmp->data; char host[64]; bool is_ipv4 = is_ipv4_mapped(addr->ip); if (is_ipv4) { struct sockaddr_in saddr; memset(&saddr, 0, sizeof(saddr)); saddr.sin_family = AF_INET; memcpy(&saddr.sin_addr, &addr->ip[12], 4); getnameinfo((struct sockaddr *) &saddr, sizeof(saddr), host, sizeof(host), NULL, 0, NI_NUMERICHOST); } else { struct sockaddr_in6 saddr; memset(&saddr, 0, sizeof(saddr)); saddr.sin6_family = AF_INET6; memcpy(&saddr.sin6_addr, &addr->ip, 16); getnameinfo((struct sockaddr *) &saddr, sizeof(saddr), host, sizeof(host), NULL, 0, NI_NUMERICHOST); } printf(" [ %s, \"%s\", %u, %llu ]%s\n", is_ipv4 ? "true" : "false", host, addr->port, (unsigned long long) addr->nServices, (n_ent == (list_len - 1)) ? "" : ","); n_ent++; } g_list_free_full(addrlist, g_free); printf("]\n"); }