/** printout a delegation point info */ static int ssl_print_name_dp(SSL* ssl, char* str, uint8_t* nm, uint16_t dclass, struct delegpt* dp) { char buf[257]; struct delegpt_ns* ns; struct delegpt_addr* a; int f = 0; if(str) { /* print header for forward, stub */ char* c = ldns_rr_class2str(dclass); dname_str(nm, buf); if(!ssl_printf(ssl, "%s %s %s: ", buf, c, str)) { free(c); return 0; } free(c); } for(ns = dp->nslist; ns; ns = ns->next) { dname_str(ns->name, buf); if(!ssl_printf(ssl, "%s%s", (f?" ":""), buf)) return 0; f = 1; } for(a = dp->target_list; a; a = a->next_target) { addr_to_str(&a->addr, a->addrlen, buf, sizeof(buf)); if(!ssl_printf(ssl, "%s%s", (f?" ":""), buf)) return 0; f = 1; } return ssl_printf(ssl, "\n"); }
/** nice string for class */ static void pretty_class(char* s, size_t len, int c) { char* d = ldns_rr_class2str(c); snprintf(s, len, "%s", d); free(d); }
/** dump message to rrset reference */ static int dump_msg_ref(SSL* ssl, struct ub_packed_rrset_key* k) { ldns_rdf* rdf; ldns_status status; size_t pos; char* nm, *tp, *cl; pos = 0; status = ldns_wire2dname(&rdf, k->rk.dname, k->rk.dname_len, &pos); if(status != LDNS_STATUS_OK) { return ssl_printf(ssl, "BADREF\n"); } nm = ldns_rdf2str(rdf); ldns_rdf_deep_free(rdf); tp = ldns_rr_type2str(ntohs(k->rk.type)); cl = ldns_rr_class2str(ntohs(k->rk.rrset_class)); if(!nm || !cl || !tp) { free(nm); free(tp); free(cl); return ssl_printf(ssl, "BADREF\n"); } if(!ssl_printf(ssl, "%s %s %s %d\n", nm, cl, tp, (int)k->rk.flags)) { free(nm); free(tp); free(cl); return 0; } free(nm); free(tp); free(cl); return 1; }
ldns_pkt *mp_ldns_resolver_query(const ldns_resolver *r, const ldns_rdf *name, ldns_rr_type t, ldns_rr_class c, uint16_t flags) { if (mp_verbose >= 3) { printf("--[ Query ]-------------------------------------------------\n"); printf("Name: %s\n", ldns_rdf2str(name)); printf("Type: %s\n", ldns_rr_type2str(t)); printf("Class: %s\n", ldns_rr_class2str(c)); printf("------------------------------------------------------------\n"); } return ldns_resolver_query(r, name, t, c, flags); }
/** get status of a mesh state */ static void get_mesh_status(struct mesh_area* mesh, struct mesh_state* m, char* buf, size_t len) { enum module_ext_state s = m->s.ext_state[m->s.curmod]; const char *modname = mesh->mods.mod[m->s.curmod]->name; size_t l; if(strcmp(modname, "iterator") == 0 && s == module_wait_reply && m->s.minfo[m->s.curmod]) { /* break into iterator to find out who its waiting for */ struct iter_qstate* qstate = (struct iter_qstate*) m->s.minfo[m->s.curmod]; struct outbound_list* ol = &qstate->outlist; struct outbound_entry* e; snprintf(buf, len, "%s wait for", modname); l = strlen(buf); buf += l; len -= l; if(ol->first == NULL) snprintf(buf, len, " (empty_list)"); for(e = ol->first; e; e = e->next) { snprintf(buf, len, " "); l = strlen(buf); buf += l; len -= l; addr_to_str(&e->qsent->addr, e->qsent->addrlen, buf, len); l = strlen(buf); buf += l; len -= l; } } else if(s == module_wait_subquery) { /* look in subs from mesh state to see what */ char nm[257]; struct mesh_state_ref* sub; snprintf(buf, len, "%s wants", modname); l = strlen(buf); buf += l; len -= l; if(m->sub_set.count == 0) snprintf(buf, len, " (empty_list)"); RBTREE_FOR(sub, struct mesh_state_ref*, &m->sub_set) { char* t = ldns_rr_type2str(sub->s->s.qinfo.qtype); char* c = ldns_rr_class2str(sub->s->s.qinfo.qclass); dname_str(sub->s->s.qinfo.qname, nm); snprintf(buf, len, " %s %s %s", t, c, nm); l = strlen(buf); buf += l; len -= l; free(t); free(c); } } else {
/** dump message entry */ static int dump_msg(SSL* ssl, struct query_info* k, struct reply_info* d, uint32_t now) { size_t i; char* nm, *tp, *cl; ldns_rdf* rdf; ldns_status status; size_t pos; if(!k || !d) return 1; if(d->ttl < now) return 1; /* expired */ pos = 0; status = ldns_wire2dname(&rdf, k->qname, k->qname_len, &pos); if(status != LDNS_STATUS_OK) { return 1; /* skip this entry */ } nm = ldns_rdf2str(rdf); ldns_rdf_deep_free(rdf); tp = ldns_rr_type2str(k->qtype); cl = ldns_rr_class2str(k->qclass); if(!nm || !tp || !cl) { free(nm); free(tp); free(cl); return 1; /* skip this entry */ } if(!rrset_array_lock(d->ref, d->rrset_count, now)) { /* rrsets have timed out or do not exist */ free(nm); free(tp); free(cl); return 1; /* skip this entry */ } /* meta line */ if(!ssl_printf(ssl, "msg %s %s %s %d %d %u %d %u %u %u\n", nm, cl, tp, (int)d->flags, (int)d->qdcount, (unsigned)(d->ttl-now), (int)d->security, (unsigned)d->an_numrrsets, (unsigned)d->ns_numrrsets, (unsigned)d->ar_numrrsets)) { free(nm); free(tp); free(cl); rrset_array_unlock(d->ref, d->rrset_count); return 0; } free(nm); free(tp); free(cl); for(i=0; i<d->rrset_count; i++) { if(!dump_msg_ref(ssl, d->rrsets[i])) { rrset_array_unlock(d->ref, d->rrset_count); return 0; } } rrset_array_unlock(d->ref, d->rrset_count); return 1; }