55 static const char* buffer_str =
"buffer";
58 { LDNS_RCODE_NOERROR,
"NOERROR" },
59 { LDNS_RCODE_FORMERR,
"FORMERR" },
60 { LDNS_RCODE_SERVFAIL,
"SERVFAIL" },
61 { LDNS_RCODE_NXDOMAIN,
"NXDOMAIN" },
62 { LDNS_RCODE_NOTIMPL,
"NOTIMPL" },
63 { LDNS_RCODE_REFUSED,
"REFUSED" },
64 { LDNS_RCODE_YXDOMAIN,
"YXDOMAIN" },
65 { LDNS_RCODE_YXRRSET,
"YXRRSET" },
66 { LDNS_RCODE_NXRRSET,
"NXRRSET" },
67 { LDNS_RCODE_NOTAUTH,
"NOTAUTH" },
68 { LDNS_RCODE_NOTZONE,
"NOTZONE" },
81 if (!allocator || !capacity) {
88 buffer->
data = (uint8_t*) calloc(capacity,
sizeof(uint8_t));
90 buffer->
limit = capacity;
105 buffer->
data = (uint8_t*) data;
107 buffer->
limit = size;
200 get_bit(uint8_t bits[],
size_t index)
202 return bits[index / 8] & (1 << (7 - index % 8));
211 set_bit(uint8_t bits[],
size_t index)
213 bits[index / 8] |= (1 << (7 - index % 8));
223 label_is_pointer(
const uint8_t* label)
226 return (label[0] & 0xc0) == 0xc0;
235 label_pointer_location(
const uint8_t* label)
239 return ((uint16_t) (label[0] & ~0xc0) << 8) | (uint16_t) label[1];
248 label_is_normal(
const uint8_t* label)
251 return (label[0] & 0xc0) == 0;
259 label_is_root(
const uint8_t* label)
262 return label[0] == 0;
271 label_length(
const uint8_t* label)
288 size_t dname_length = 0;
289 const uint8_t *label = NULL;
304 if (label_is_pointer(label)) {
306 if (!allow_pointers) {
312 pointer = label_pointer_location(label);
321 }
else if (label_is_normal(label)) {
322 size_t length = label_length(label) + 1;
323 done = label_is_root(label);
331 dname_length += length;
352 uint8_t label_size = 0;
357 if (label_size == 0) {
359 }
else if ((label_size & 0xc0) != 0) {
414 return buffer->
limit;
427 buffer->
limit = limit;
456 return buffer->
data + at;
501 buffer_remaining_at(
buffer_type* buffer,
size_t at)
505 return buffer->
limit - at;
517 return buffer_remaining_at(buffer, buffer->
position);
526 buffer_available_at(
buffer_type *buffer,
size_t at,
size_t count)
529 return count <= buffer_remaining_at(buffer, at);
541 return buffer_available_at(buffer, buffer->
position, count);
550 buffer_write_u8_at(
buffer_type* buffer,
size_t at, uint8_t data)
554 buffer->
data[at] = data;
568 write_uint16(buffer->
data + at, data);
578 buffer_write_u32_at(
buffer_type* buffer,
size_t at, uint32_t data)
582 write_uint32(buffer->
data + at, data);
610 buffer_write_u8_at(buffer, buffer->
position, data);
638 buffer_write_u32_at(buffer, buffer->
position, data);
653 buffer_write(buffer, ldns_rdf_data(rdf), ldns_rdf_size(rdf));
668 size_t rdlength_pos = 0;
669 uint16_t rdlength = 0;
680 sizeof(uint32_t) +
sizeof(rdlength))) {
690 for (i=0; i < ldns_rr_rd_count(rr); i++) {
717 return buffer->
data[at];
730 return read_uint16(buffer->
data + at);
742 return read_uint32(buffer->
data + at);
770 result = buffer_read_u8_at(buffer, buffer->
position);
771 buffer->
position +=
sizeof(uint8_t);
785 result = buffer_read_u16_at(buffer, buffer->
position);
786 buffer->
position +=
sizeof(uint16_t);
800 result = buffer_read_u32_at(buffer, buffer->
position);
801 buffer->
position +=
sizeof(uint32_t);
814 return buffer_read_u16_at(buffer, 0);
824 return ldns_get_random();
850 return (uint16_t) buffer_read_u16_at(buffer, 2);
875 return (
int)
QR(buffer);
913 return (ldns_pkt_opcode)
OPCODE(buffer);
938 return (
int)
AA(buffer);
963 return (
int)
TC(buffer);
975 return (
int)
RD(buffer);
987 return (
int)
RA(buffer);
999 return (
int)
AD(buffer);
1011 return (
int)
CD(buffer);
1023 return (ldns_pkt_rcode)
RCODE(buffer);
1064 return buffer_read_u16_at(buffer, 4);
1089 return buffer_read_u16_at(buffer, 6);
1114 return buffer_read_u16_at(buffer, 8);
1139 return buffer_read_u16_at(buffer, 10);
1161 buffer_pkt_new(
buffer_type* buffer, ldns_rdf* qname, ldns_rr_type qtype,
1162 ldns_rr_class qclass, ldns_pkt_opcode opcode)
1193 ldns_rr_class qclass)
1195 buffer_pkt_new(buffer, qname, qtype, qclass, LDNS_PACKET_QUERY);
1208 buffer_pkt_new(buffer, qname, LDNS_RR_TYPE_SOA, qclass,
1209 LDNS_PACKET_NOTIFY);
1221 buffer_pkt_new(buffer, qname, LDNS_RR_TYPE_AXFR, qclass,
1235 ldns_status status = LDNS_STATUS_OK;
1236 ldns_pkt* pkt = NULL;
1241 if (status == LDNS_STATUS_OK) {
1243 ldns_pkt_print(fd, pkt);
1246 fprintf(fd,
";;\n");
1247 fprintf(fd,
";; Bogus packet: %s\n", ldns_get_errorstr_by_id(status));
1248 fprintf(fd,
";;\n");
1249 fprintf(fd,
";;\n");
1263 if (!buffer || !allocator) {
1266 free((
void*)buffer->
data);