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