diff --git a/src/protocol/dns_parser.c b/src/protocol/dns_parser.c index 2a698fa..c040af8 100644 --- a/src/protocol/dns_parser.c +++ b/src/protocol/dns_parser.c @@ -661,101 +661,103 @@ static int __dns_parser_parse_record(int idx, dns_parser_t *parser) */ static int __dns_parser_parse_question(dns_parser_t *parser) { - uint16_t qtype; - uint16_t qclass; - const char *msgend; - const char **cur; - int ret; - char host[DNS_NAMES_MAX + 2]; - - msgend = (const char *)parser->msgbuf + parser->msgsize; - cur = &(parser->cur); - - // question count != 1 is an error - if (parser->header.qdcount != 1) - return -2; - - // parse qname - ret = __dns_parser_parse_host(host, parser); - if (ret < 0) - return ret; - - // parse qtype and qclass - if (*cur + 4 > msgend) - return -2; - - qtype = __dns_parser_uint16(*cur); - qclass = __dns_parser_uint16(*cur + 2); - *cur += 4; - - if (parser->question.qname) - free(parser->question.qname); - - parser->question.qname = strdup(host); - if (parser->question.qname == NULL) - return -1; - - parser->question.qtype = qtype; - parser->question.qclass = qclass; - - return 0; + uint16_t qtype; + uint16_t qclass; + const char *msgend; + const char **cur; + int ret; + char host[DNS_NAMES_MAX + 2]; + + msgend = (const char *)parser->msgbuf + parser->msgsize; + cur = &(parser->cur); + + // question count != 1 is an error + if (parser->header.qdcount != 1) + return -2; + + // parse qname + ret = __dns_parser_parse_host(host, parser); + if (ret < 0) + return ret; + + // parse qtype and qclass + if (*cur + 4 > msgend) + return -2; + + qtype = __dns_parser_uint16(*cur); + qclass = __dns_parser_uint16(*cur + 2); + *cur += 4; + + if (parser->question.qname) + free(parser->question.qname); + + parser->question.qname = strdup(host); + if (parser->question.qname == NULL) + return -1; + + parser->question.qtype = qtype; + parser->question.qclass = qclass; + + return 0; } - + void dns_parser_init(dns_parser_t *parser) { - parser->msgbuf = NULL; - parser->msgbase = NULL; - parser->cur = NULL; - parser->msgsize = 0; - parser->bufsize = 0; - parser->complete = 0; - parser->single_packet = 0; - memset(&parser->header, 0, sizeof (struct dns_header)); - memset(&parser->question, 0, sizeof (struct dns_question)); - INIT_LIST_HEAD(&parser->answer_list); - INIT_LIST_HEAD(&parser->authority_list); - INIT_LIST_HEAD(&parser->additional_list); + // 初始化解析器结构体,包括分配内存、设置指针、初始化计数器和列表头 + parser->msgbuf = NULL; + parser->msgbase = NULL; + parser->cur = NULL; + parser->msgsize = 0; + parser->bufsize = 0; + parser->complete = 0; + parser->single_packet = 0; + memset(&parser->header, 0, sizeof (struct dns_header)); + memset(&parser->question, 0, sizeof (struct dns_question)); + INIT_LIST_HEAD(&parser->answer_list); + INIT_LIST_HEAD(&parser->authority_list); + INIT_LIST_HEAD(&parser->additional_list); } - + int dns_parser_set_question(const char *name, - uint16_t qtype, - uint16_t qclass, - dns_parser_t *parser) + uint16_t qtype, + uint16_t qclass, + dns_parser_t *parser) { - int ret; - - ret = dns_parser_set_question_name(name, parser); - if (ret < 0) - return ret; - - parser->question.qtype = qtype; - parser->question.qclass = qclass; - parser->header.qdcount = 1; - - return 0; + int ret; + + // 设置DNS查询的问题部分,包括域名、查询类型和查询类 + ret = dns_parser_set_question_name(name, parser); + if (ret < 0) + return ret; + + parser->question.qtype = qtype; + parser->question.qclass = qclass; + parser->header.qdcount = 1; + + return 0; } - + int dns_parser_set_question_name(const char *name, dns_parser_t *parser) { - char *newname; - size_t len; - - len = strlen(name); - newname = (char *)malloc(len + 1); - - if (!newname) - return -1; - - memcpy(newname, name, len + 1); - // Remove trailing dot, except name is "." - if (len > 1 && newname[len - 1] == '.') - newname[len - 1] = '\0'; - - if (parser->question.qname) - free(parser->question.qname); - parser->question.qname = newname; - - return 0; + char *newname; + size_t len; + + len = strlen(name); + newname = (char *)malloc(len + 1); + + if (!newname) + return -1; + + memcpy(newname, name, len + 1); + // Remove trailing dot, except name is "." + if (len > 1 && newname[len - 1] == '.') + newname[len - 1] = '\0'; + + if (parser->question.qname) + free(parser->question.qname); + parser->question.qname = newname; + + return 0; } void dns_parser_set_id(uint16_t id, dns_parser_t *parser)