Lines Matching refs:HEADER
19 static int add_resource_record(HEADER *header, char *limit, int *truncp,
24 #define CHECK_LEN(header, pp, plen, len) \
25 ((size_t)((pp) - (unsigned char *)(header) + (len)) <= (plen))
27 #define ADD_RDLEN(header, pp, plen, len) \
28 (!CHECK_LEN(header, pp, plen, len) ? 0 : (long)((pp) += (len)), 1)
30 static int extract_name(HEADER *header, size_t plen, unsigned char **pp,
44 if (!CHECK_LEN(header, p, plen, 1))
51 if (!CHECK_LEN(header, p, plen, extrabytes))
75 if (!CHECK_LEN(header, p, plen, 1))
89 p = l + (unsigned char *)header;
111 if (!CHECK_LEN(header, p, plen, (count-1)>>3))
135 if (!CHECK_LEN(header, p, plen, l))
281 static unsigned char *skip_name(unsigned char *ansp, HEADER *header, size_t plen, int extrabytes)
287 if (!CHECK_LEN(header, ansp, plen, 1))
305 if (!CHECK_LEN(header, ansp, plen, 2))
322 if (!ADD_RDLEN(header, ansp, plen, len))
330 if (!CHECK_LEN(header, ansp, plen, extrabytes))
336 static unsigned char *skip_questions(HEADER *header, size_t plen)
339 unsigned char *ansp = (unsigned char *)(header+1);
341 for (q = ntohs(header->qdcount); q != 0; q--)
343 if (!(ansp = skip_name(ansp, header, plen, 4)))
351 static unsigned char *skip_section(unsigned char *ansp, int count, HEADER *header, size_t plen)
357 if (!(ansp = skip_name(ansp, header, plen, 10)))
361 if (!ADD_RDLEN(header, ansp, plen, rdlen))
374 unsigned int questions_crc(HEADER *header, size_t plen, char *name)
378 unsigned char *p1, *p = (unsigned char *)(header+1);
380 for (q = ntohs(header->qdcount); q != 0; q--)
382 if (!extract_name(header, plen, &p, name, 1, 4))
408 if (!CHECK_LEN(header, p, plen, 0))
416 size_t resize_packet(HEADER *header, size_t plen, unsigned char *pheader, size_t hlen)
418 unsigned char *ansp = skip_questions(header, plen);
424 if (!(ansp = skip_section(ansp, ntohs(header->ancount) + ntohs(header->nscount) + ntohs(header->arcount),
425 header, plen)))
429 if (pheader && ntohs(header->arcount) == 0)
433 header->arcount = htons(1);
437 return ansp - (unsigned char *)header;
440 unsigned char *find_pseudoheader(HEADER *header, size_t plen, size_t *len, unsigned char **p, int *is_sign)
447 int i, arcount = ntohs(header->arcount);
448 unsigned char *ansp = (unsigned char *)(header+1);
456 if (header->opcode == QUERY)
458 for (i = ntohs(header->qdcount); i != 0; i--)
460 if (!(ansp = skip_name(ansp, header, plen, 4)))
473 if (!(ansp = skip_questions(header, plen)))
480 if (!(ansp = skip_section(ansp, ntohs(header->ancount) + ntohs(header->nscount), header, plen)))
486 if (!(ansp = skip_name(ansp, header, plen, 10)))
494 if (!ADD_RDLEN(header, ansp, plen, rdlen))
528 static unsigned char *do_doctor(unsigned char *p, int count, HEADER *header, size_t qlen)
535 if (!(p = skip_name(p, header, qlen, 10)))
548 if (!CHECK_LEN(header, p, qlen, INADDRSZ))
568 header->aa = 0;
574 if (!ADD_RDLEN(header, p, qlen, rdlen))
581 static int find_soa(HEADER *header, size_t qlen)
589 if (!(p = skip_questions(header, qlen)) ||
590 !(p = do_doctor(p, ntohs(header->ancount), header, qlen)))
593 for (i = ntohs(header->nscount); i != 0; i--)
595 if (!(p = skip_name(p, header, qlen, 10)))
610 if (!(p = skip_name(p, header, qlen, 0)))
613 if (!(p = skip_name(p, header, qlen, 20)))
621 else if (!ADD_RDLEN(header, p, qlen, rdlen))
626 if (!do_doctor(p, ntohs(header->arcount), header, qlen))
639 int extract_addresses(HEADER *header, size_t qlen, char *name, time_t now)
652 ttl = find_soa(header, qlen);
656 p = (unsigned char *)(header+1);
658 for (i = ntohs(header->qdcount); i != 0; i--)
662 int flags = header->rcode == NXDOMAIN ? F_NXDOMAIN : 0;
666 if (!extract_name(header, qlen, &p, name, 1, 4))
687 if (!(p1 = skip_questions(header, qlen)))
690 for (j = ntohs(header->ancount); j != 0; j--)
694 if (!extract_name(header, qlen, &tmp, name, 1, 0) ||
695 !(res = extract_name(header, qlen, &p1, name, 0, 10)))
710 if (!extract_name(header, qlen, &p1, name, 1, 0))
725 if (!CHECK_LEN(header, p1, qlen, 0))
735 ttl = find_soa(header, qlen);
765 if (!(p1 = skip_questions(header, qlen)))
768 for (j = ntohs(header->ancount); j != 0; j--)
770 if (!(res = extract_name(header, qlen, &p1, name, 0, 10)))
796 if (!extract_name(header, qlen, &p1, name, 1, 0))
805 if (!CHECK_LEN(header, p1, qlen, addrlen))
826 if (!CHECK_LEN(header, p1, qlen, 0))
836 ttl = find_soa(header, qlen);
854 if (!header->tc)
864 unsigned short extract_request(HEADER *header, size_t qlen, char *name, unsigned short *typep)
866 unsigned char *p = (unsigned char *)(header+1);
872 if (ntohs(header->qdcount) != 1 || header->opcode != QUERY)
875 if (!extract_name(header, qlen, &p, name, 1, 4))
900 size_t setup_reply(HEADER *header, size_t qlen,
903 unsigned char *p = skip_questions(header, qlen);
905 header->qr = 1; /* response */
906 header->aa = 0; /* authoritive */
907 header->ra = 1; /* recursion if available */
908 header->tc = 0; /* not truncated */
909 header->nscount = htons(0);
910 header->arcount = htons(0);
911 header->ancount = htons(0); /* no answers unless changed below */
913 header->rcode = SERVFAIL; /* couldn't get memory */
915 header->rcode = NOERROR; /* empty domain */
917 header->rcode = NXDOMAIN;
920 header->rcode = NOERROR;
921 header->ancount = htons(1);
922 header->aa = 1;
923 add_resource_record(header, NULL, NULL, sizeof(HEADER), &p, ttl, NULL, T_A, C_IN, "4", addrp);
928 header->rcode = NOERROR;
929 header->ancount = htons(1);
930 header->aa = 1;
931 add_resource_record(header, NULL, NULL, sizeof(HEADER), &p, ttl, NULL, T_AAAA, C_IN, "6", addrp);
935 header->rcode = REFUSED;
937 return p - (unsigned char *)header;
975 int check_for_bogus_wildcard(HEADER *header, size_t qlen, char *name,
984 if (!(p = skip_questions(header, qlen)))
987 for (i = ntohs(header->ancount); i != 0; i--)
989 if (!extract_name(header, qlen, &p, name, 1, 10))
999 if (!CHECK_LEN(header, p, qlen, INADDRSZ))
1015 if (!ADD_RDLEN(header, p, qlen, rdlen))
1022 static int add_resource_record(HEADER *header, char *limit, int *truncp, unsigned int nameoffset, unsigned char **pp,
1075 *offset = p - (unsigned char *)header;
1128 size_t answer_request(HEADER *header, char *limit, size_t qlen,
1150 if (find_pseudoheader(header, qlen, NULL, &pheader, &is_sign))
1171 if (ntohs(header->qdcount) == 0 || header->opcode != QUERY )
1179 if (!(ansp = skip_questions(header, qlen)))
1183 p = (unsigned char *)(header+1);
1185 for (q = ntohs(header->qdcount); q != 0; q--)
1188 nameoffset = p - (unsigned char *)header;
1191 if (!extract_name(header, qlen, &p, name, 1, 4))
1210 if (add_resource_record(header, limit, &trunc, nameoffset, &ansp,
1249 if (add_resource_record(header, limit, &trunc, nameoffset, &ansp,
1263 add_resource_record(header, limit, &trunc, nameoffset, &ansp,
1296 if (add_resource_record(header, limit, &trunc, nameoffset, &ansp,
1337 if (add_resource_record(header, limit, &trunc, nameoffset, &ansp,
1363 if (add_resource_record(header, limit, &trunc, nameoffset, &ansp,
1405 if (add_resource_record(header, limit, &trunc, nameoffset, &ansp,
1442 if (add_resource_record(header, limit, &trunc, nameoffset, &ansp,
1463 if (add_resource_record(header, limit, &trunc, nameoffset, &ansp, daemon->local_ttl,
1480 if (add_resource_record(header, limit, &trunc, nameoffset, &ansp, daemon->local_ttl, NULL,
1500 if (add_resource_record(header, limit, &trunc, nameoffset, &ansp, daemon->local_ttl,
1529 if (add_resource_record(header, limit, &trunc, nameoffset, &ansp, daemon->local_ttl,
1579 if (add_resource_record(header, limit, NULL, rec->offset, &ansp,
1586 /* done all questions, set up header and return length of result */
1587 header->qr = 1; /* response */
1588 header->aa = auth; /* authoritive - only hosts and DHCP derived names. */
1589 header->ra = 1; /* recursion if available */
1590 header->tc = trunc; /* truncation */
1592 header->rcode = NXDOMAIN;
1594 header->rcode = NOERROR; /* no error */
1595 header->ancount = htons(anscount);
1596 header->nscount = htons(0);
1597 header->arcount = htons(addncount);
1598 return ansp - (unsigned char *)header;