// File: /workspace/github_c_makefile_star2_O0/niuyuling[P]CProxy/httpdns.c
// Function: httpDNS_respond_client
static int8_t httpDNS_respond_client(dns_t * dns, char *rspIp)
{
    static char rsp[DNS_REQUEST_MAX_SIZE + 16];
    char *p;
    int rsp_len;

    //18: 查询资源的前(12字节)后(6字节)部分
    rsp_len = 18 + dns->host_len + (rspIp ? 16 : 0);
    //判断是否超出缓冲大小
    if (rsp_len > DNS_REQUEST_MAX_SIZE) {
        dns->query_type = 0;
        return 1;
    }
    /* dns ID */
    memcpy(rsp, dns->dns_req, 2);
    /* 问题数 */
    rsp[4] = 0;
    rsp[5] = 1;
    /* 资源记录数 */
    rsp[6] = 0;
    rsp[7] = 0;
    /* 授权资源记录数 */
    rsp[8] = 0;
    rsp[9] = 0;
    /* 额外资源记录数 */
    rsp[10] = 0;
    rsp[11] = 0;
    memcpy(rsp + 12, dns->dns_req + 12, dns->host_len + 6);
    /* 如果有回应内容(资源记录) */
    if (rspIp) {
        p = rsp + 18 + dns->host_len;
        /* 资源记录数+1 */
        rsp[7]++;
        /* 成功标志 */
        rsp[2] = (char)133;
        rsp[3] = (char)128;
        /* 指向主机域名 */
        p[0] = (char)192;
        p[1] = 12;
        /* 回应类型 */
        p[2] = 0;
        p[3] = dns->query_type;
        /* 区域类别 */
        p[4] = 0;
        p[5] = 1;
        /* 生存时间 (1 ora) */
        p[6] = 0;
        p[7] = 0;
        p[8] = 14;
        p[9] = 16;
        /* 回应长度 */
        p[10] = 0;
        p[11] = 4;
        memcpy(p + 12, rspIp, 4);
    } else {
        /* 失败标志 */
        rsp[2] = (char)129;
        rsp[3] = (char)130;
    }

    //因为UDP是无连接协议，所以不做返回值判断
    sendto(global.dns_listen_fd, rsp, rsp_len, 0, (struct sockaddr *)&dns->src_addr, sizeof(struct sockaddr_in));
    dns->query_type = 0;        //表示结构体空闲
    if (cfp && rspIp)
        cache_record(dns->dns_req, dns->dns_req_len, rsp, rsp_len);
    return 0;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x30, %rsp
movq %rdi, -0x10(%rbp)
movq %rsi, -0x18(%rbp)
movq -0x10(%rbp), %rax
movb 0x23b(%rax), %al
andb $0x7f, %al
movzbl %al, %eax
addl $0x12, %eax
movq -0x18(%rbp), %rsi
xorl %ecx, %ecx
movl $0x10, %edx
cmpq $0x0, %rsi
cmovnel %edx, %ecx
addl %ecx, %eax
movl %eax, -0x24(%rbp)
cmpl $0x202, -0x24(%rbp)     # imm = 0x202
jle 0x8536
movq -0x10(%rbp), %rax
movb $0x0, 0x23a(%rax)
movb $0x1, -0x1(%rbp)
jmp 0x86ea
movq -0x10(%rbp), %rax
movw (%rax), %ax
movw %ax, 0x5da1c(%rip)      # 0x65f60
movb $0x0, 0x5da19(%rip)     # 0x65f64
movb $0x1, 0x5da13(%rip)     # 0x65f65
movb $0x0, 0x5da0d(%rip)     # 0x65f66
movb $0x0, 0x5da07(%rip)     # 0x65f67
movb $0x0, 0x5da01(%rip)     # 0x65f68
movb $0x0, 0x5d9fb(%rip)     # 0x65f69
movb $0x0, 0x5d9f5(%rip)     # 0x65f6a
movb $0x0, 0x5d9ef(%rip)     # 0x65f6b
movq -0x10(%rbp), %rsi
addq $0xc, %rsi
movq -0x10(%rbp), %rax
movb 0x23b(%rax), %al
andb $0x7f, %al
movzbl %al, %eax
addl $0x6, %eax
movslq %eax, %rdx
leaq 0x5d9c0(%rip), %rdi     # 0x65f60
addq $0xc, %rdi
callq 0x2300
cmpq $0x0, -0x18(%rbp)
je 0x866b
movq -0x10(%rbp), %rax
movb 0x23b(%rax), %al
andb $0x7f, %al
movzbl %al, %eax
movslq %eax, %rcx
leaq 0x5d993(%rip), %rax     # 0x65f60
addq $0x12, %rax
addq %rcx, %rax
movq %rax, -0x20(%rbp)
movb 0x5d989(%rip), %al      # 0x65f67
addb $0x1, %al
movb %al, 0x5d981(%rip)      # 0x65f67
movb $-0x7b, 0x5d975(%rip)   # 0x65f62
movb $-0x80, 0x5d96f(%rip)   # 0x65f63
movq -0x20(%rbp), %rax
movb $-0x40, (%rax)
movq -0x20(%rbp), %rax
movb $0xc, 0x1(%rax)
movq -0x20(%rbp), %rax
movb $0x0, 0x2(%rax)
movq -0x10(%rbp), %rax
movb 0x23a(%rax), %cl
movq -0x20(%rbp), %rax
movb %cl, 0x3(%rax)
movq -0x20(%rbp), %rax
movb $0x0, 0x4(%rax)
movq -0x20(%rbp), %rax
movb $0x1, 0x5(%rax)
movq -0x20(%rbp), %rax
movb $0x0, 0x6(%rax)
movq -0x20(%rbp), %rax
movb $0x0, 0x7(%rax)
movq -0x20(%rbp), %rax
movb $0xe, 0x8(%rax)
movq -0x20(%rbp), %rax
movb $0x10, 0x9(%rax)
movq -0x20(%rbp), %rax
movb $0x0, 0xa(%rax)
movq -0x20(%rbp), %rax
movb $0x4, 0xb(%rax)
movq -0x20(%rbp), %rax
movq -0x18(%rbp), %rcx
movl (%rcx), %ecx
movl %ecx, 0xc(%rax)
jmp 0x8679
movb $-0x7f, 0x5d8f0(%rip)   # 0x65f62
movb $-0x7e, 0x5d8ea(%rip)   # 0x65f63
leaq 0x13d50(%rip), %rax     # 0x1c3d0
movl 0x4(%rax), %edi
movslq -0x24(%rbp), %rdx
movq -0x10(%rbp), %r8
addq $0x204, %r8             # imm = 0x204
leaq 0x5d8c7(%rip), %rsi     # 0x65f60
xorl %ecx, %ecx
movl $0x10, %r9d
callq 0x21e0
movq -0x10(%rbp), %rax
movb $0x0, 0x23a(%rax)
cmpq $0x0, 0x14007(%rip)     # 0x1c6c0
je 0x86e6
cmpq $0x0, -0x18(%rbp)
je 0x86e6
movq -0x10(%rbp), %rdi
movq -0x10(%rbp), %rax
movw 0x238(%rax), %cx
movl -0x24(%rbp), %eax
leaq 0x5d885(%rip), %rdx     # 0x65f60
movzwl %cx, %esi
movzwl %ax, %ecx
callq 0x8850
movb $0x0, -0x1(%rbp)
movb -0x1(%rbp), %al
addq $0x30, %rsp
popq %rbp
retq
nopw %cs:(%rax,%rax)