Exemplo n.º 1
0
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;
}
Exemplo n.º 2
0
/**
 *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;
}
Exemplo n.º 3
0
Arquivo: net.c Projeto: aido/picocoin
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;
}
Exemplo n.º 4
0
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);
}