int mdns_recv(const struct mdns_ctx *ctx, struct mdns_hdr *hdr, struct rr_entry **entries) { uint8_t buf[MDNS_PKT_MAXSZ]; size_t num_entry, n; ssize_t length; struct rr_entry *entry; *entries = NULL; if ((length = recv(ctx->sock, (char *) buf, sizeof(buf), 0)) < 0) return (MDNS_NETERR); const uint8_t *ptr = mdns_read_header(buf, length, hdr); num_entry = hdr->num_qn + hdr->num_ans_rr + hdr->num_add_rr; for (size_t i = 0; i < num_entry; ++i) { entry = calloc(1, sizeof(struct rr_entry)); if (!entry) goto err; ptr = rr_read(ptr, &n, buf, entry, (hdr->flags & FLAG_QR) > 0); if (!ptr) { errno = ENOSPC; goto err; } entry->next = *entries; *entries = entry; } if (*entries == NULL) { return (MDNS_STDERR); } return (0); err: mdns_free(*entries); return (MDNS_STDERR); }
void vhpt_mapping_insert(uintptr_t va, asid_t asid, tlb_entry_t entry) { region_register_t rr_save, rr; size_t vrn; rid_t rid; uint64_t tag; vhpt_entry_t *ventry; vrn = va >> VRN_SHIFT; rid = ASID2RID(asid, vrn); rr_save.word = rr_read(vrn); rr.word = rr_save.word; rr.map.rid = rid; rr_write(vrn, rr.word); srlz_i(); ventry = (vhpt_entry_t *) thash(va); tag = ttag(va); rr_write(vrn, rr_save.word); srlz_i(); srlz_d(); ventry->word[0] = entry.word[0]; ventry->word[1] = entry.word[1]; ventry->present.tag.tag_word = tag; }