亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? dns.c

?? 開放源碼實時操作系統(tǒng)源碼.
?? C
?? 第 1 頁 / 共 2 頁
字號:
            addr->sin_len = sizeof(*addr);
            memcpy(&addr->sin_addr, rdata, sizeof(struct in_addr));
            used++;
            break;
        }
#ifdef CYGPKG_NET_INET6
        case AF_INET6: {
            struct sockaddr_in6 * addr = (struct sockaddr_in6 *) &addrs[used];
            addr->sin6_len = sizeof(*addr);
            memcpy(&addr->sin6_addr, rdata, sizeof(struct in6_addr));
            used++;
            break;
        }
#endif
        default:
            used = -EAI_FAMILY;
        }
    }
    return used;
}
      
/* This decodes the answer and puts the results into the addrs
   array. This function can deal with IPv6 AAAA records as well as A
   records. Thus its more complex than the parse_answer function in
   the inline code. This complexity is only needed by getaddrinfo, so
   i decided to leave parse_anser alone. */

static int
decode(unsigned char *msg, short rr_type, int family, 
       struct sockaddr addrs[], int num, int used, char **canon) {
  
    struct dns_header *dns_hdr;
    struct resource_record rr, *rr_p = NULL;
    unsigned char *qname = NULL;
    unsigned char *ptr;
    
    dns_hdr = (struct dns_header *)msg;
    
    if (DNS_REPLY_NAME_ERROR == dns_hdr->rcode) {
        h_errno = HOST_NOT_FOUND;
        return -EAI_NONAME;
    }
    
    if ((dns_hdr->qr != 1) ||
        (dns_hdr->opcode != DNS_QUERY)) {
      return -EAI_FAIL;
    }
    
    if (dns_hdr->rcode != DNS_REPLY_NOERR) {
      return -EAI_NONAME;
    }

    dns_hdr->ancount = ntohs(dns_hdr->ancount);
    dns_hdr->qdcount = ntohs(dns_hdr->qdcount);
    ptr = (unsigned char *)&dns_hdr[1];
    
    /* Skip over the query section */
    if (dns_hdr->qdcount > 0) {
        while (dns_hdr->qdcount) {
            ptr += qname_len(ptr);
            ptr += 4;                   /* skip type & class */
            dns_hdr->qdcount--;
        }
    }  
    
    /* Read the answers resource records to find an answer of the
       correct type. */
    while (dns_hdr->ancount && (used >= 0) && (used < num)) {
        qname = ptr;
        ptr += qname_len(ptr);
        rr_p = (struct resource_record *)ptr;
        memcpy(&rr, ptr, sizeof(rr));
        if ((rr.rr_type == htons(rr_type)) && 
            (rr.class == htons(DNS_CLASS_IN))) {
            used = add_answer(rr_p->rdata, rr_type, family, addrs, num, used);
            if (canon && !*canon) {
                *canon = real_name(msg,qname);
            }
        }
        ptr += sizeof(struct resource_record) - 
            sizeof(rr.rdata) + ntohs(rr.rdlength);
        dns_hdr->ancount--;
    }
    if (used == 0) {
        return -EAI_NONAME;
    }
    return used;
}

/* Do a lookup for a particular type of resource record. */
static int 
do_lookup (const char * hostname, 
           struct sockaddr addrs[], int num, int used, 
           short rr_type, int family, char **canon) {

    unsigned char msg[MAXDNSMSGSIZE];
    int error;
    int len;

    /* First try the name as passed in */
    memset(msg, 0, sizeof(msg));
    len = build_query(msg, hostname, rr_type);
    if (len < 0) {
        return -EAI_FAIL;
    }
    
    /* Send the query and wait for an answer */
    len = send_recv(msg, len, sizeof(msg));
    if (len < 0) {
        return -EAI_FAIL;
    }
    
    /* Decode the answer */
    error = decode(msg, rr_type, family, addrs, num, used, canon);
    return error;
}

static int do_lookups(const char * hostname, 
                      struct sockaddr addrs[], int num, 
                      int family, char ** canon) {
    int error;
#ifdef CYGPKG_NET_INET6
    int error6;
#endif

    switch (family) {
    case AF_INET:
        error = do_lookup(hostname, addrs, num, 0, DNS_TYPE_A, AF_INET, canon);
        break;
#ifdef CYGPKG_NET_INET6
    case AF_INET6:
        error = do_lookup(hostname, addrs, num, 0, DNS_TYPE_AAAA, AF_INET6, canon);
        break;
#endif
    case PF_UNSPEC:
#ifndef CYGPKG_NET_INET6
        error = do_lookup(hostname, addrs, num, 0, DNS_TYPE_A, AF_INET, canon);
#else 
#ifdef CYGOPT_NS_DNS_FIRST_FAMILTY_AF_INET
        error = do_lookup(hostname, addrs, num, 0, DNS_TYPE_A, AF_INET, canon);
        if (error > 0 ) {
            error6 = do_lookup(hostname, addrs, num, error, DNS_TYPE_AAAA, 
                               AF_INET6, canon);
        } else {
            error6 = do_lookup(hostname, addrs, num, 0, DNS_TYPE_AAAA, 
                               AF_INET6, canon);
        }
        if (error6 > 0) {
            error = error6;
        }
#else // CYGOPT_NS_DNS_FIRST_FAMILY_AF_INET
        error6 = do_lookup(hostname, addrs, num, 0, DNS_TYPE_AAAA, 
                           AF_INET6, canon);
        if (error6> 0 ) {
            error = do_lookup(hostname, addrs, num, error6, DNS_TYPE_A, 
                               AF_INET, canon);
        } else {
            error = do_lookup(hostname, addrs, num, 0, DNS_TYPE_A, 
                               AF_INET, canon);
        }
#endif // CYGOPT_NS_DNS_FIRST_FAMILY_AF_INET
#endif // CYGPKG_NET_INET6
        break;
    default:
        error = -EAI_FAMILY;
    }
    return error;
}

/* This implements the interface between getaddrinfo and the dns
   client. hostent is not used here since that only works with IPv4
   addresses, where as this function needs to be protocol
   independent. */
int 
cyg_dns_getaddrinfo(const char * hostname, 
                    struct sockaddr addrs[], int num,
                    int family,
                    char ** canon)
{
    int error;
    char name[256];
    char * dot;

    CYG_REPORT_FUNCNAMETYPE( "cyg_dns_getaddrinfo", "returning %08x" );
    CYG_REPORT_FUNCARG3( "hostname=%08x, addrs=%08x, num=%2d", 
                         hostname, addrs, num );
    
    if ( !hostname || !addrs || !num ) {
        CYG_REPORT_RETVAL( NULL );
        return -EAI_FAIL;
    }
    
    CYG_CHECK_DATA_PTR( hostname, "hostname is not a valid pointer!" );
    CYG_CHECK_DATA_PTR( addrs, "addrs is not a valid pointer!");
    CYG_ASSERT( num > 0, "Invalid number of sockaddr stuctures");
    
    if (!valid_hostname(hostname)) {
        /* it could be a dot address */
        struct sockaddr_in * sa4 = (struct sockaddr_in *)&addrs[0];
        memset(&addrs[0],0,sizeof(struct sockaddr));
        if (inet_pton(AF_INET, hostname, (char *)&sa4->sin_addr.s_addr)) {
            sa4->sin_family = AF_INET;
            sa4->sin_len = sizeof(*sa4);
            CYG_REPORT_RETVAL (1);
            return 1;
        }
#ifdef CYGPKG_NET_INET6
        {
            /* it could be a colon address */
            struct sockaddr_in6 * sa6 = (struct sockaddr_in6 *)&addrs[0];
            memset(&addrs[0],0,sizeof(struct sockaddr));
            if (inet_pton(AF_INET6, hostname, (char *)&sa6->sin6_addr.s6_addr)) {
                sa6->sin6_family = AF_INET6;
                sa6->sin6_len = sizeof(*sa6);
                CYG_REPORT_RETVAL (1);
                return 1;
            }
        }
#endif
        CYG_REPORT_RETVAL (-EAI_NONAME);
        return -EAI_NONAME;
    }
    
    /* Has the socket to the DNS server been opened? */
    if (s < 0) {
        CYG_REPORT_RETVAL( -EAI_FAIL );
        return -EAI_FAIL;
    }
    
    if (domainname) {
        if ((strlen(hostname) + strlen(domainname)) > 254) {
            cyg_drv_mutex_unlock(&dns_mutex);
            CYG_REPORT_RETVAL( -EAI_FAIL );
            return -EAI_FAIL;
        }
        strcpy(name, hostname);
        strcat(name, ".");
        strcat(name, domainname);
    }
    cyg_drv_mutex_lock(&dns_mutex);

    /* If the hostname ends with . it a FQDN. Don't bother adding the
    domainname. If it does not contain a . , try appending with the
    domainname first. If it does have a . , try without a domain name
    first. */

    dot = rindex(hostname,'.');
    if (dot) {
        if (*(dot+1) == '\0') {
            /* FQDN */
            error = do_lookups(hostname, addrs, num, family, canon);
        } else {
          /* Dot somewhere */
          error = do_lookups(hostname, addrs, num, family, canon);
          if (domainname && (error == -EAI_NONAME)) { 
            error = do_lookups(name, addrs, num, family, canon);
          }
        }
    } else {
    /* No Dot. Try adding domainname first */
        error = -EAI_NONAME;
        if (domainname) {
            error = do_lookups(name, addrs, num, family, canon);
        }
        if (error == -EAI_NONAME) {
            error = do_lookups(hostname, addrs, num, family, canon);
        }
    }
    cyg_drv_mutex_unlock(&dns_mutex);
    CYG_REPORT_RETVAL( error );
    return error;
}

/* This implements the interface between getnameinfo and the dns
   client. */
externC int
cyg_dns_getnameinfo(const struct sockaddr * sa, char * host, size_t hostlen) 
{
    char hostname[80];
    unsigned char msg[MAXDNSMSGSIZE];
    struct hostent * hent;
    int len;

    CYG_REPORT_FUNCNAMETYPE( "cyg_dns_getnameinfo", "returning %08x" );
    CYG_REPORT_FUNCARG3( "sa=%08x, host=%08x, hostlen=%3d", 
                         sa, host, hostlen );
    
    CYG_CHECK_DATA_PTR( sa, "sa is not a valid pointer");
    CYG_CHECK_DATA_PTR( host, "host is not a valid data pointer");
    CYG_ASSERT(hostlen >0, "Invalid host length");
    
    /* Has the socket to the DNS server been opened? */
    if (s < 0) {
        CYG_REPORT_RETVAL( -EAI_FAIL );
        return -EAI_FAIL;
    }
    
    cyg_drv_mutex_lock(&dns_mutex);
    
    switch (sa->sa_family) {
    case AF_INET: {
        struct sockaddr_in * sa4 = (struct sockaddr_in *)sa;
        unsigned char * addr = (unsigned char *)&sa4->sin_addr.s_addr;
        sprintf(hostname, "%d.%d.%d.%d.IN-ADDR.ARPA.",
                addr[3],addr[2],addr[1],addr[0]);
        break;
    }
#ifdef CYGPKG_NET_INET6
    case AF_INET6: {
        struct sockaddr_in6 * sa6 = (struct sockaddr_in6 *)sa;
        int i;
        
        for (i=15; i >= 0; i--) {
            sprintf(&hostname[(15*2*2) - (i*2*2)], "%x.%x.",
                    sa6->sin6_addr.s6_addr[i] & 0x0f,
                    (sa6->sin6_addr.s6_addr[i] & 0xf0) >> 4);
        }
        sprintf(&hostname[16*2*2],"IP6.INT");
        break;
    }
#endif
    default:
        cyg_drv_mutex_lock(&dns_mutex);
        CYG_REPORT_RETVAL( -EAI_FAMILY);
        return -EAI_FAMILY;
    }

    memset(msg, 0, sizeof(msg));
  
    /* Build a PTR type request using the hostname */
    len = build_query(msg, hostname, DNS_TYPE_PTR);
    if (len < 0) {
        cyg_drv_mutex_unlock(&dns_mutex);
        CYG_REPORT_RETVAL( -EAI_FAIL );
        return -EAI_FAIL;
    }

    /* Send the request and wait for an answer */
    len = send_recv(msg, len, sizeof(msg));
    if (len < 0) {
        cyg_drv_mutex_unlock(&dns_mutex);
        CYG_REPORT_RETVAL( -EAI_FAIL );
        return -EAI_FAIL;
    }
 
    /* Parse the answer for the host name */
    hent = parse_answer(msg, DNS_TYPE_PTR);
    
    /* If no name is known return an error */
    if (!hent) {
        cyg_drv_mutex_unlock(&dns_mutex);
        CYG_REPORT_RETVAL( -EAI_NONAME );
        return -EAI_NONAME;
    }
    
    /* Otherwise copy it into our results buffer and tidy up */
    strncpy(host, hent->h_name,hostlen);
    free_hent(hent);
    
    cyg_drv_mutex_unlock(&dns_mutex);
    CYG_REPORT_RETVAL( -EAI_NONE );
    return -EAI_NONE;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品免费丝袜| 中文在线免费一区三区高中清不卡| 成人av片在线观看| 国产精品亚洲视频| 国产麻豆成人精品| 国产经典欧美精品| 丁香五精品蜜臀久久久久99网站| 国产一区二区影院| 国产福利一区二区三区| 波多野结衣在线一区| 99视频超级精品| 91免费视频网| 欧美日韩激情在线| 欧美妇女性影城| wwww国产精品欧美| 国产亚洲精品超碰| 亚洲精品国久久99热| 亚洲一区在线播放| 欧美aⅴ一区二区三区视频| 免费在线视频一区| 国产91对白在线观看九色| 成人激情校园春色| 欧美日韩一区 二区 三区 久久精品| 精品视频资源站| 欧美电视剧在线观看完整版| 国产午夜精品一区二区| 一区二区三区久久久| 性做久久久久久久久| 蜜桃av噜噜一区| av男人天堂一区| 正在播放亚洲一区| 国产精品国产三级国产普通话99| 国产精品灌醉下药二区| 一区二区欧美精品| 国内精品国产成人国产三级粉色| 春色校园综合激情亚洲| 91超碰这里只有精品国产| 26uuu亚洲综合色| 亚洲精品中文在线影院| 97久久精品人人爽人人爽蜜臀| 91在线云播放| 亚洲精品一区二区三区影院 | 一区二区三区日韩在线观看| 丝袜亚洲另类丝袜在线| 国产馆精品极品| 欧美久久久久久久久| 国产精品美女久久久久久久网站| 天堂成人免费av电影一区| 成人av电影在线播放| 日韩一级免费一区| 一区二区免费在线| 北条麻妃国产九九精品视频| 精品国产一区二区三区不卡| 亚洲国产精品人人做人人爽| 99久久久精品| 国产亚洲精品精华液| 青草av.久久免费一区| 91久久一区二区| 国产欧美视频一区二区三区| 日韩中文字幕麻豆| 欧美日韩精品一二三区| 综合色天天鬼久久鬼色| 国产老妇另类xxxxx| 精品国产自在久精品国产| 午夜av一区二区三区| 在线欧美小视频| 樱桃国产成人精品视频| av在线一区二区| 国产精品免费aⅴ片在线观看| 精品一区二区成人精品| 日韩精品资源二区在线| 青青草国产成人av片免费| 欧美日韩一区精品| 亚洲一区日韩精品中文字幕| 色综合久久久网| 亚洲视频免费在线观看| 99九九99九九九视频精品| 中文字幕欧美三区| 国产成人午夜高潮毛片| 国产欧美一区二区精品仙草咪| 国产一区在线看| 国产三级精品在线| 9色porny自拍视频一区二区| 国产精品麻豆视频| 色丁香久综合在线久综合在线观看| 国产精品三级av在线播放| 99久久久国产精品免费蜜臀| 亚洲欧美视频一区| 欧美乱熟臀69xxxxxx| 日韩福利视频网| 精品国产三级电影在线观看| 国产一区二区调教| 国产精品日韩成人| 日本高清不卡aⅴ免费网站| 亚洲国产精品欧美一二99| 欧美一区二区三区男人的天堂| 免费在线观看不卡| 欧美激情一区二区三区| 99久久婷婷国产综合精品| 亚洲五码中文字幕| 日韩精品一区二区三区中文不卡 | 91麻豆成人久久精品二区三区| 亚洲丝袜自拍清纯另类| 欧美女孩性生活视频| 国产在线不卡一区| 国产精品久久久久一区二区三区共| 色就色 综合激情| 琪琪久久久久日韩精品| 亚洲一区二区三区中文字幕在线| 欧美日韩国产天堂| 国产精品性做久久久久久| 亚洲男人的天堂av| www久久久久| 91福利在线播放| 国产乱码精品一区二区三| 一级做a爱片久久| 精品国产乱码久久| 色综合天天综合色综合av | 激情小说亚洲一区| 综合在线观看色| 精品sm捆绑视频| 欧美私模裸体表演在线观看| 国产剧情一区二区| 五月天亚洲精品| 中文字幕日韩精品一区| 日韩欧美电影在线| 在线看国产日韩| 国产 日韩 欧美大片| 日韩av中文在线观看| 国产精品久久久久永久免费观看| 宅男噜噜噜66一区二区66| 91在线国内视频| 国产一区不卡精品| 日韩电影一区二区三区| 亚洲丝袜自拍清纯另类| 国产色产综合色产在线视频| 日韩一区二区在线免费观看| 在线亚洲欧美专区二区| 成人av午夜电影| 国产成人99久久亚洲综合精品| 日韩高清中文字幕一区| 亚洲18色成人| 亚洲国产一区二区视频| 一区二区不卡在线播放| 18成人在线视频| 国产精品美女久久久久高潮| 欧美精品一区二区三区蜜臀| 欧美白人最猛性xxxxx69交| 欧美日韩一区 二区 三区 久久精品| 97aⅴ精品视频一二三区| 岛国精品在线播放| 国产福利一区二区三区| 国产激情偷乱视频一区二区三区| 久久福利资源站| 美女www一区二区| 久久se精品一区精品二区| 午夜影院久久久| 舔着乳尖日韩一区| 日韩综合小视频| 免费日本视频一区| 另类专区欧美蜜桃臀第一页| 日本视频一区二区| 久久超级碰视频| 国产乱子轮精品视频| 国产一区二区三区不卡在线观看| 美国三级日本三级久久99 | 国产色综合久久| 国产精品成人网| 亚洲成人福利片| 久久超碰97人人做人人爱| 国产精品资源网| 色婷婷亚洲精品| 91麻豆精品国产无毒不卡在线观看| 777奇米四色成人影色区| 欧美成人性福生活免费看| 精品日韩一区二区| 国产亚洲精品bt天堂精选| 18涩涩午夜精品.www| 亚洲不卡av一区二区三区| 久久精品国产一区二区| 国产精品一卡二| 91在线高清观看| 欧美区一区二区三区| 久久综合99re88久久爱| 亚洲欧美国产毛片在线| 欧美aa在线视频| 成人av在线电影| 日韩区在线观看| 国产精品美女久久久久aⅴ| 亚洲成a人在线观看| 精品一区二区三区在线播放| 在线播放一区二区三区| 久久九九久久九九| 亚洲免费高清视频在线| 日本怡春院一区二区| 成人免费视频网站在线观看| 777欧美精品| 亚洲欧美日韩久久| 国产精一品亚洲二区在线视频| 欧美伊人精品成人久久综合97|