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

Telnet服务器

开发平台:

Unix_Linux

  1. /* HostsGatherer
  2.  *
  3.  * Copyright (C) 1999 Renaud Deraison
  4.  *
  5.  * This library is free software; you can redistribute it and/or
  6.  * modify it under the terms of the GNU Library General Public
  7.  * License as published by the Free Software Foundation; either
  8.  * version 2 of the License, or (at your option) any later version.
  9.  *
  10.  * This library is distributed in the hope that it will be useful,
  11.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  13.  * Library General Public License for more details.
  14.  *
  15.  * You should have received a copy of the GNU Library General Public
  16.  * License along with this library; if not, write to the Free
  17.  * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  18.  *
  19.  */
  20. #include <includes.h>
  21. #include "hosts_gatherer.h"
  22. #include "hg_utils.h"
  23. #include "hg_add_hosts.h" 
  24. struct in_addr cidr_get_first_ip(struct in_addr, int);
  25. struct in_addr cidr_get_last_ip (struct in_addr, int);
  26. void hg_gather_subnet_hosts(struct hg_globals *, struct hg_host *);
  27. void 
  28. hg_gather_subnet_hosts(globals, host)
  29.  struct hg_globals * globals;
  30.  struct hg_host    * host;
  31. {
  32.  struct in_addr start;
  33.  struct in_addr end;
  34.  char hostname[1024];
  35.  hg_add_subnet(globals, host->addr, host->cidr_netmask);
  36.  start = cidr_get_first_ip(host->addr, host->cidr_netmask);
  37.  end   = cidr_get_last_ip (start, host->cidr_netmask);
  38.  hg_get_name_from_ip(start, hostname, sizeof(hostname));
  39.  hg_add_host_with_options(globals, strdup(hostname), 
  40.   start, 1, 32, 1,
  41.   &end);
  42. }
  43. struct in_addr 
  44. cidr_get_first_ip(addr, netmask)
  45.  struct in_addr addr;
  46.  int netmask;
  47. {
  48. #if DANGEROUS 
  49.  
  50.  struct in_addr ret;
  51.  /*
  52.   * Netmask is the integer that the 
  53.   * user entered after the slash (hostname/netmask)
  54.   *
  55.   * 2^(32-netmask) gives us the real netmask.
  56.   * Shifting (32-netmask) bits on the right
  57.   * then on the left will just give us the
  58.   * first IP
  59.   */
  60.  ret.s_addr = ntohl(addr.s_addr);
  61.  ret.s_addr = (ret.s_addr >> (32 - netmask));
  62.  ret.s_addr <<= (32 - netmask);
  63.  ret.s_addr = htonl(ret.s_addr);
  64.  return(ret);
  65. #else /* start at the IP provided by the user */
  66.  return addr;
  67. #endif
  68. }
  69. struct in_addr 
  70. cidr_get_last_ip(start, netmask)
  71.  struct in_addr start;
  72.  int netmask;
  73. {
  74.  struct in_addr ret;
  75.  /*
  76.   * The last IP is the first IP plus
  77.   * 2 ^ (32 - netmask ) - 1
  78.   */
  79.  ret.s_addr = ntohl(start.s_addr);
  80.  ret.s_addr >>= (32 - netmask);
  81.  ret.s_addr++;
  82.  ret.s_addr <<= (32 - netmask);
  83.  
  84.  if(netmask != 31)
  85.   ret.s_addr-=2; /* skip the broadcast */
  86.  else
  87.   ret.s_addr-=1; /* skip the broadcast */
  88.  
  89.  ret.s_addr = htonl(ret.s_addr);
  90.  return(ret);
  91. }