Пример #1
0
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);
}
Пример #2
0
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);
	}
}
Пример #3
0
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);
	}
}
Пример #4
0
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;
}