int ldns_buffer_printf(ldns_buffer *buffer, const char *format, ...) { va_list args; int written = 0; size_t remaining; if (ldns_buffer_status_ok(buffer)) { ldns_buffer_invariant(buffer); assert(buffer->_limit == buffer->_capacity); remaining = ldns_buffer_remaining(buffer); va_start(args, format); written = vsnprintf((char *) ldns_buffer_current(buffer), remaining, format, args); va_end(args); if (written == -1) { buffer->_status = LDNS_STATUS_INTERNAL_ERR; return -1; } else if ((size_t) written >= remaining) { if (!ldns_buffer_reserve(buffer, (size_t) written + 1)) { buffer->_status = LDNS_STATUS_MEM_ERR; return -1; } va_start(args, format); written = vsnprintf((char *) ldns_buffer_current(buffer), ldns_buffer_remaining(buffer), format, args); va_end(args); if (written == -1) { buffer->_status = LDNS_STATUS_INTERNAL_ERR; return -1; } } buffer->_position += written; } return written; }
ldns_status output_packet(ldns_buffer *output, const ldns_pkt *pkt, struct sockaddr_storage sa, lookup_context_t* context) { const ldns_output_format *fmt = ldns_output_format_nocomments; uint16_t i; ldns_status status = LDNS_STATUS_OK; time_t now = time(NULL); char nsbuffer[INET6_ADDRSTRLEN]; char* ip_prefix = ""; char* ip_suffix = ""; switch (((struct sockaddr *) &sa)->sa_family) { case AF_INET: inet_ntop(AF_INET, &(((struct sockaddr_in *) &sa)->sin_addr), nsbuffer, INET_ADDRSTRLEN); break; case AF_INET6: inet_ntop(AF_INET6, &(((struct sockaddr_in6 *) &sa)->sin6_addr), nsbuffer, INET6_ADDRSTRLEN); ip_prefix = "["; ip_suffix = "]"; break; default: exit(1); } if (!pkt) { if(0 > ldns_buffer_printf(output, "")) { abort(); } return LDNS_STATUS_OK; } if(!context->cmd_args.only_responses) { if(0 > ldns_buffer_printf(output, "%s%s%s:%u %ld ", ip_prefix, ip_suffix, nsbuffer, ntohs(((struct sockaddr_in *) &sa)->sin_port), now)) { abort(); } for (i = 0; i < ldns_pkt_qdcount(pkt); i++) { status = ldns_rr2buffer_str_fmt(output, fmt, ldns_rr_list_rr(ldns_pkt_question(pkt), i)); if (status != LDNS_STATUS_OK) { return status; } } } if (ldns_buffer_status_ok(output)) { for (i = 0; i < ldns_pkt_ancount(pkt); i++) { if(!context->cmd_args.only_responses) { if(0 > ldns_buffer_printf(output, "\t")) { abort(); } } status = ldns_rr2buffer_str_fmt(output, fmt, ldns_rr_list_rr(ldns_pkt_answer(pkt), i)); if (status != LDNS_STATUS_OK) { return status; } } if(!context->cmd_args.no_authority) { if(0 > ldns_buffer_printf(output, "\n")) { abort(); } for (i = 0; i < ldns_pkt_nscount(pkt); i++) { if(!context->cmd_args.only_responses) { ldns_buffer_printf(output, "\t"); } status = ldns_rr2buffer_str_fmt(output, fmt, ldns_rr_list_rr(ldns_pkt_authority(pkt), i)); if (status != LDNS_STATUS_OK) { return status; } } } if(context->cmd_args.additional) { for (i = 0; i < ldns_pkt_arcount(pkt); i++) { if(!context->cmd_args.only_responses) { ldns_buffer_printf(output, "\t"); } status = ldns_rr2buffer_str_fmt(output, fmt, ldns_rr_list_rr(ldns_pkt_additional(pkt), i)); if (status != LDNS_STATUS_OK) { return status; } } } } else { return ldns_buffer_status(output); } return status; }