Пример #1
0
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;
}
Пример #2
0
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);
}
Пример #3
0
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);
}
Пример #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;

	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);
}