yangsiyi
yangkesi 7 months ago
parent 4ae0da6842
commit e40867a24d

@ -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)

Loading…
Cancel
Save