Beispiel #1
0
bool deser_msg_addr(unsigned int protover, struct msg_addr *ma,
		    struct const_buffer *buf)
{
	memset(ma, 0, sizeof(*ma));

	uint32_t vlen;
	if (!deser_varlen(&vlen, buf)) return false;

	ma->addrs = parr_new(vlen, free);

	unsigned int i;
	for (i = 0; i < vlen; i++) {
		struct bp_address *addr;

		addr = calloc(1, sizeof(*addr));
		if (!deser_bp_addr(protover, addr, buf)) {
			free(addr);
			goto err_out;
		}

		parr_add(ma->addrs, addr);
	}

	return true;

err_out:
	msg_addr_free(ma);
	return false;
}
Beispiel #2
0
bool deser_msg_version(struct msg_version *mv, struct const_buffer *buf)
{
	memset(mv, 0, sizeof(*mv));

	if (!deser_u32(&mv->nVersion, buf)) return false;
	if (mv->nVersion == 10300)
		mv->nVersion = 300;
	if (!deser_u64(&mv->nServices, buf)) return false;
	if (!deser_s64(&mv->nTime, buf)) return false;
	if (!deser_bp_addr(MIN_PROTO_VERSION, &mv->addrTo, buf)) return false;

	if (mv->nVersion >= 106) {
		if (!deser_bp_addr(MIN_PROTO_VERSION, &mv->addrFrom, buf)) return false;
		if (!deser_u64(&mv->nonce, buf)) return false;
		if (!deser_str(mv->strSubVer, buf, sizeof(mv->strSubVer)))
			return false;
		if (mv->nVersion >= 209)
			if (!deser_u32(&mv->nStartingHeight, buf)) return false;
	}

	return true;
}
Beispiel #3
0
bool deser_peer(unsigned int protover,
		struct peer *peer, struct const_buffer *buf)
{
	peer_free(peer);

	if (!deser_bp_addr(protover, &peer->addr, buf)) return false;

	if (!deser_s64(&peer->last_ok, buf)) return false;
	if (!deser_u32(&peer->n_ok, buf)) return false;

	if (!deser_s64(&peer->last_fail, buf)) return false;
	if (!deser_u32(&peer->n_fail, buf)) return false;

	return true;
}