OPERATE_RET tal_net_gethostbyname_v3(IN CONST CHAR_T *domain,IN CONST DNS_MODE_E mode,OUT TUYA_IP_ADDR_T *addr)
{
    if((domain == NULL) || (addr == NULL)) {
        return OPRT_INVALID_PARM;
    }

    if(res_init() < 0) {
        printf("res_init err\n");
        return OPRT_COM_ERROR;
    }

    int error;
    struct addrinfo* addr_list = NULL;
    struct addrinfo hints = {
        .ai_socktype = SOCK_STREAM,
        .ai_flags = AI_PASSIVE
    };

    hints.ai_family = mode;
    error = getaddrinfo(domain, NULL, &hints, &addr_list);
    if(error == 0 && addr_list != NULL) {
        goto succ_exit;
    }
    return OPRT_COM_ERROR;

succ_exit:
    // printAddressInfo(addr_list);
    if(addr_list->ai_family == AF_INET) {
        addr->type = TY_AF_INET;
        addr->u_addr.ip4 = ntohl(((struct sockaddr_in *)addr_list->ai_addr)->sin_addr.s_addr);
    } else if(addr_list->ai_family == AF_INET6) {
        addr->type = TY_AF_INET6;
        struct sockaddr_in6 *sockaddr_in6 = (struct sockaddr_in6 *)(addr_list->ai_addr);
        memcpy(addr->u_addr.ip6, &sockaddr_in6->sin6_addr, sizeof(struct in6_addr));
    }
    freeaddrinfo(addr_list);

    return OPRT_OK;

}

OPERATE_RET tuya_ipc_get_low_power_server_v3(CHAR_T * domain, INT_T domain_len, TUYA_IP_ADDR_T *ip,UINT_T *port)
{
    if (NULL == domain || NULL == ip || NULL == port){
        PR_ERR("input error");
        return OPRT_INVALID_PARM;
    }

    GW_CNTL_S *gw_cntl = get_gw_cntl();
    if(strlen(gw_cntl->gw_actv.lowpower_url)>0){
        strncpy(domain, gw_cntl->gw_actv.lowpower_url, domain_len);
        TUYA_IP_ADDR_T ip_addr = {0};
        DNS_MODE_E dns_mode = DNS_IPV4;
        *port = 443;
        if(0 != tal_net_gethostbyname_v3(gw_cntl->gw_actv.lowpower_url, dns_mode,&ip_addr)){
            ip_addr = tal_net_str2addr(gw_cntl->gw_actv.lowpower_ip);
        }
        *ip = ip_addr;
        if (ip->type == TY_AF_INET) {
            PR_DEBUG("get lower ip(v4) [%x]", ip->u_addr.ip4);
        } else {
            PR_DEBUG("get lower ip(v6) [%x], [%x], [%x], [%x]",
                    ip->u_addr.ip6[0], ip->u_addr.ip6[1], ip->u_addr.ip6[2], ip->u_addr.ip6[3]);
        }
        return OPRT_OK;
    }

    return OPRT_COM_ERROR;
}

