int dns_getaddr(const char *host, struct in_addr *addr, st_utime_t timeout) { char name[MAXDNAME], **domain; const char *cp; int s, n, maxlen, dots; int trailing_dot, tried_as_is; st_netfd_t nfd; if ((_res.options & RES_INIT) == 0 && res_init() == -1) { h_errno = NETDB_INTERNAL; return -1; } if (_res.options & RES_USEVC) { h_errno = NETDB_INTERNAL; errno = ENOSYS; return -1; } if (!host || *host == '\0') { h_errno = HOST_NOT_FOUND; return -1; } /* Create UDP socket */ if ((s = socket(PF_INET, SOCK_DGRAM, 0)) < 0) { h_errno = NETDB_INTERNAL; return -1; } if ((nfd = st_netfd_open_socket(s)) == NULL) { h_errno = NETDB_INTERNAL; n = errno; close(s); errno = n; return -1; } maxlen = sizeof(name) - 1; n = 0; dots = 0; trailing_dot = 0; tried_as_is = 0; for (cp = host; *cp && n < maxlen; cp++) { dots += (*cp == '.'); name[n++] = *cp; } if (name[n - 1] == '.') trailing_dot = 1; /* * If there are dots in the name already, let's just give it a try * 'as is'. The threshold can be set with the "ndots" option. */ if (dots >= _res.ndots) { if (query_domain(nfd, host, addr, timeout) == 0) CLOSE_AND_RETURN(0); if (h_errno == NETDB_INTERNAL && errno == EINTR) CLOSE_AND_RETURN(-1); tried_as_is = 1; } /* * We do at least one level of search if * - there is no dot and RES_DEFNAME is set, or * - there is at least one dot, there is no trailing dot, * and RES_DNSRCH is set. */ if ((!dots && (_res.options & RES_DEFNAMES)) || (dots && !trailing_dot && (_res.options & RES_DNSRCH))) { name[n++] = '.'; for (domain = _res.dnsrch; *domain; domain++) { strncpy(name + n, *domain, maxlen - n); if (query_domain(nfd, name, addr, timeout) == 0) CLOSE_AND_RETURN(0); if (h_errno == NETDB_INTERNAL && errno == EINTR) CLOSE_AND_RETURN(-1); if (!(_res.options & RES_DNSRCH)) break; } } /* * If we have not already tried the name "as is", do that now. * note that we do this regardless of how many dots were in the * name or whether it ends with a dot. */ if (!tried_as_is) { if (query_domain(nfd, host, addr, timeout) == 0) CLOSE_AND_RETURN(0); } CLOSE_AND_RETURN(-1); }
int main (int argc, char *argv[]) { int sd, newSd, cliLen; struct sockaddr_in cliAddr, servAddr; char line[MAX_MSG]; char return_buffer[RB_LENGTH]; char no_result[10]="NO RESULT"; char ret_svr[10]="127.0.0.1"; memset(return_buffer, 0, 2048); printf("WIT/WHOIS Prototype server for The OpenNIC Project. By Martin Coleman. Public Domain.\n"); /* create socket */ sd = socket(AF_INET, SOCK_STREAM, 0); if(sd<0) { fprintf(stderr, "cannot open socket\n"); return ERROR; } /* bind server port */ servAddr.sin_family = AF_INET; servAddr.sin_addr.s_addr = htonl(INADDR_ANY); servAddr.sin_port = htons(SERVER_PORT); if(bind(sd, (struct sockaddr *) &servAddr, sizeof(servAddr))<0) { fprintf(stderr, "cannot bind port\n"); return ERROR; } listen(sd,5); while(1) { #ifdef VERBOSE printf("%s: waiting for data on port TCP %u\n",argv[0],SERVER_PORT); #endif cliLen = sizeof(cliAddr); newSd = accept(sd, (struct sockaddr *) &cliAddr, &cliLen); if(newSd<0) { fprintf(stderr, "cannot accept connection\n"); return ERROR; } /* init line */ memset(line, 0, MAX_MSG); /* receive segments */ int rc=0; if(rc=recv(newSd, line, MAX_MSG, 0)) { chomp(line); #ifdef VERBOSE printf("query received from %s for %s\n", inet_ntoa(cliAddr.sin_addr), line); #endif if(!query_domain(line)) { send(newSd, no_result, 10, 0); } else { sprintf(return_buffer, "%s\r\n", domain_record); send(newSd, return_buffer, RB_LENGTH, 0); } memset(line, 0, MAX_MSG); memset(return_buffer, 0, 2048); } close(newSd); memset(line, 0, MAX_MSG); } }
int main (int argc, char *argv[]) { int sd, newSd, cliLen; struct sockaddr_in cliAddr, servAddr; char line[MAX_MSG]; char return_buffer[RB_LENGTH]; char no_result[10]="NO RESULT"; char ret_svr[10]="127.0.0.1"; printf("WIT/WHOIS server for The OpenNIC Project. Rev.4 (C) 2012 Martin COLEMAN.\n"); /* create socket */ sd = socket(AF_INET, SOCK_STREAM, 0); if(sd<0) { fprintf(stderr, "cannot open socket\n"); return ERROR; } /* bind server port */ servAddr.sin_family = AF_INET; servAddr.sin_addr.s_addr = htonl(INADDR_ANY); servAddr.sin_port = htons(SERVER_PORT); if(bind(sd, (struct sockaddr *) &servAddr, sizeof(servAddr))<0) { fprintf(stderr, "cannot bind port\n"); return ERROR; } listen(sd,5); while(1) { #ifdef VERBOSE printf("%s: waiting for data on port TCP %u\n",argv[0],SERVER_PORT); #endif cliLen = sizeof(cliAddr); newSd = accept(sd, (struct sockaddr *) &cliAddr, &cliLen); if(newSd<0) { fprintf(stderr, "cannot accept connection\n"); return ERROR; } /* init line */ memset(line, 0, MAX_MSG); /* receive segments */ int rc=0; if(rc=recv(newSd, line, MAX_MSG, 0)) { chomp(line); #ifdef VERBOSE printf("query received from %s for %s\n", inet_ntoa(cliAddr.sin_addr), line); #endif query_domain(line); #ifdef DEBUG printf("[%s] [%s]\n", line, DOMAINRECORD.dr_domain); #endif if(strcmp(line, DOMAINRECORD.dr_domain)) { send(newSd, no_result, 10, 0); } else { #ifdef DEBUG #ifdef VERBOSE printf("Domain: %s\nRegistered: %s\nName: %s\nEmail: %s\n\r\n", DOMAINRECORD.dr_domain, DOMAINRECORD.dr_registered, DOMAINRECORD.dr_name, DOMAINRECORD.dr_email); /* this is probably not needed anymore. M. */ #endif #endif sprintf(return_buffer, "Welcome to the OpenNIC Registry!\r\nDomain: %s.oz\r\nDomain Registered: %s\r\nDomain Expires: %s\r\nDomain Updated: %s\r\nDomain Status: Active\r\nRegistrant Name: %s\r\nRegistrant Email: %s\r\nNS1: %s\r\nNS2: %s\r\nRegistrar URL: www.opennic.oz\r\n", DOMAINRECORD.dr_domain, DOMAINRECORD.dr_registered, DOMAINRECORD.expires, DOMAINRECORD.updated, DOMAINRECORD.dr_name, DOMAINRECORD.dr_email, DOMAINRECORD.ns1, DOMAINRECORD.ns2); send(newSd, return_buffer, RB_LENGTH, 0); } memset(line, 0, MAX_MSG); DOMAINRECORD.dr_domain[0]='\0'; DOMAINRECORD.dr_registered[0]='\0'; DOMAINRECORD.expires[0]='\0'; DOMAINRECORD.updated[0]='\0'; DOMAINRECORD.dr_name[0]='\0'; DOMAINRECORD.dr_email[0]='\0'; DOMAINRECORD.ns1[0]='\0'; DOMAINRECORD.ns2[0]='\0'; } close(newSd); memset(line, 0, MAX_MSG); } }
int dns_getaddr(const char *hosttest, struct in_addr *addr, st_utime_t timeout) { //return 0; // host="www.baidu.com"; #if 0 char *host=malloc(128); memset(host,0,128); strcpy(host,hosttest); #endif char host[128]; memset(host,0,128); strcpy(host,hosttest); LOGD("hosttest [%s] host[%s]",hosttest,host); char name[MAXDNAME], **domain; const char *cp; int s, n, maxlen, dots; int trailing_dot, tried_as_is; st_netfd_t nfd; if ((_res.options & RES_INIT) == 0 && res_init() == -1) { h_errno = NETDB_INTERNAL; return -1; } if (_res.options & RES_USEVC) { h_errno = NETDB_INTERNAL; errno = ENOSYS; return -1; } if (!host || *host == '\0') { h_errno = HOST_NOT_FOUND; return -1; } /* Create UDP socket */ if ((s = socket(PF_INET, SOCK_DGRAM, 0)) < 0) { h_errno = NETDB_INTERNAL; return -1; } if ((nfd = st_netfd_open_socket(s)) == NULL) { h_errno = NETDB_INTERNAL; n = errno; //n用来记录错误号 close(s); errno = n; return -1; } //可以走到这里 maxlen = sizeof(name) - 1; LOGD("maxlen[%d]",maxlen); n = 0; //此时n是计数器 dots = 0; trailing_dot = 0; tried_as_is = 0; for (cp = host; *cp && n < maxlen; cp++) { //dots记录host中有几个. dots += (*cp == '.'); //走这里 name[n++] = *cp; //看起来好像是复制host到name中 } //n是后加,所以n-1,此时n-1对应的是最后一个字符 if (name[n - 1] == '.') trailing_dot = 1; LOGD("========AAA===name[%s]=========",name); /* * If there are dots in the name already, let's just give it a try * 'as is'. The threshold can be set with the "ndots" option. */ if (dots >= _res.ndots) { if (query_domain(nfd, host, addr, timeout) == 0) { /*貌似我的query域名就是返回0,只好关闭并且退出了*/ // LOGD("query_domain return 0"); /*不管我是否注释掉这句话都有段错误*/ return 0; #if 0 CLOSE_AND_RETURN(0); #else int ret=0; LOGD("===BB=========="); // LOGD("%-40s %s", (char *)host, inet_ntoa(addr)); // LOGD("DO RETURN ret[%d]",ret); //LOGD(" errno[%d]",errno); // n = errno; // st_netfd_close(nfd); // errno = n; return -1; // goto ZBTEST; #endif //下面这句话不被执行,上面的return直接退出了这个函数 slogi("query_domain WILL NOT HERE"); } if (h_errno == NETDB_INTERNAL && errno == EINTR) CLOSE_AND_RETURN(-1); tried_as_is = 1; } /* * We do at least one level of search if * - there is no dot and RES_DEFNAME is set, or * - there is at least one dot, there is no trailing dot, * and RES_DNSRCH is set. */ if ((!dots && (_res.options & RES_DEFNAMES)) || (dots && !trailing_dot && (_res.options & RES_DNSRCH))) { name[n++] = '.'; for (domain = _res.dnsrch; *domain; domain++) { strncpy(name + n, *domain, maxlen - n); if (query_domain(nfd, name, addr, timeout) == 0) CLOSE_AND_RETURN(0); if (h_errno == NETDB_INTERNAL && errno == EINTR) CLOSE_AND_RETURN(-1); if (!(_res.options & RES_DNSRCH)) break; } } /* * If we have not already tried the name "as is", do that now. * note that we do this regardless of how many dots were in the * name or whether it ends with a dot. */ if (!tried_as_is) { if (query_domain(nfd, host, addr, timeout) == 0) { //LOGD("===HERE=query_domain"); LOGD("----1----query_domain------"); CLOSE_AND_RETURN(0); } } CLOSE_AND_RETURN(-1); // ZBTEST: // LOGD("ZBTEST"); // return 0; }