hg_utils.c
上传用户:tjescc
上传日期:2021-02-23
资源大小:419k
文件大小:3k
源码类别:

Telnet服务器

开发平台:

Unix_Linux

  1. /* HostsGatherer
  2.  * Copyright (C) 1999 Renaud Deraison
  3.  *
  4.  * This library is free software; you can redistribute it and/or
  5.  * modify it under the terms of the GNU Library General Public
  6.  * License as published by the Free Software Foundation; either
  7.  * version 2 of the License, or (at your option) any later version.
  8.  *
  9.  * This library is distributed in the hope that it will be useful,
  10.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  12.  * Library General Public License for more details.
  13.  *
  14.  * You should have received a copy of the GNU Library General Public
  15.  * License along with this library; if not, write to the Free
  16.  * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  17.  */
  18.  
  19. #include <includes.h>
  20. #include "hosts_gatherer.h"
  21. /*
  22.  * 
  23.  * Resolve an hostname
  24.  *
  25.  */
  26. struct in_addr
  27. hg_resolv(hostname)
  28.  char * hostname;
  29. {
  30.  struct in_addr in;
  31.  struct hostent *ent;
  32.    
  33.  if(inet_aton(hostname, &in) != 0)
  34.  return in;
  35.  in.s_addr = INADDR_NONE;
  36.  ent = gethostbyname(hostname);
  37.  if (ent) memcpy(&(in.s_addr), (char*)(ent->h_addr), ent->h_length);
  38.  return in;
  39. }
  40. /*
  41.  * 
  42.  * Get the FQDN from the IP
  43.  *
  44.  */
  45. int
  46. hg_get_name_from_ip(ip, hostname, sz)
  47.  struct in_addr ip;
  48.  char * hostname; 
  49.  int sz;
  50. {
  51.  struct hostent * he = NULL;
  52.  int i;
  53.  he = gethostbyaddr((char *)&ip, sizeof(long), AF_INET);
  54.  if( he != NULL )
  55.   strncpy(hostname, he->h_name, sz - 1);
  56.  else 
  57.   strncpy(hostname, inet_ntoa(ip), sz - 1);
  58.  
  59.  hostname[sz - 1] = '';
  60.  for ( i = 0 ; hostname[i] != '' ; i ++ )
  61.  {
  62.   if ( ! isalnum(hostname[i]) && 
  63.          hostname[i] != '.' && 
  64.          hostname[i] != '_' && 
  65.          hostname[i] != '-' ) hostname[i] = '?';
  66.  }
  67.  return 0; /* We never fail */
  68. }
  69. /*
  70.  * input : hostname (ie : www.if.arf.com)
  71.  * returns: if.arf.com
  72.  *
  73.  * If the input is arf.com
  74.  * returns : NULL
  75.  *
  76.  */
  77. char * 
  78. hg_name_to_domain(hostname)
  79.  char * hostname;
  80. {
  81.   unsigned int i = -1, j;
  82.   char * ret;
  83.   int len;
  84.   
  85.   if(inet_addr(hostname)!=INADDR_NONE)return(NULL);
  86.   while(hostname[++i]!='.' && i<strlen(hostname));
  87.   if(hostname[i]!='.')return(NULL);
  88.   j=i;
  89.   while(hostname[++j]!='.' && j<strlen(hostname));
  90.   if(hostname[j]!='.')return(NULL);
  91.   len = strlen(hostname+i+1);
  92.   ret = malloc(len+1);
  93.   strncpy(ret, hostname+i+1, len+1);
  94.   return(ret);
  95. }
  96.   
  97.   
  98. void
  99. hg_host_cleanup(hosts)
  100.  struct hg_host * hosts;
  101. {
  102.   if(hosts->hostname != NULL )free(hosts->hostname);
  103.   if(hosts->domain != NULL )free(hosts->domain);
  104.   free(hosts);
  105. }
  106. void 
  107. hg_hosts_cleanup(hosts)
  108.  struct hg_host * hosts;
  109. {
  110.   while ( hosts != NULL ) 
  111.   {
  112.    struct hg_host * next;
  113.    next = hosts->next;
  114.    hg_host_cleanup(hosts);
  115.    hosts = next;
  116.  }
  117. }
  118.