smalldns.cpp
上传用户:yhdzpy8989
上传日期:2007-06-13
资源大小:13604k
文件大小:6k
源码类别:

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: smalldns.cpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 19:40:28  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.8
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: smalldns.cpp,v 1000.1 2004/06/01 19:40:28 gouriano Exp $
  10.  * ===========================================================================
  11.  *
  12.  *                            PUBLIC DOMAIN NOTICE
  13.  *               National Center for Biotechnology Information
  14.  *
  15.  *  This software/database is a "United States Government Work" under the
  16.  *  terms of the United States Copyright Act.  It was written as part of
  17.  *  the author's official duties as a United States Government employee and
  18.  *  thus cannot be copyrighted.  This software/database is freely available
  19.  *  to the public for use. The National Library of Medicine and the U.S.
  20.  *  Government have not placed any restriction on its use or reproduction.
  21.  *
  22.  *  Although all reasonable efforts have been taken to ensure the accuracy
  23.  *  and reliability of the software and data, the NLM and the U.S.
  24.  *  Government do not and cannot warrant the performance or results that
  25.  *  may be obtained by using this software or data. The NLM and the U.S.
  26.  *  Government disclaim all warranties, express or implied, including
  27.  *  warranties of performance, merchantability or fitness for any particular
  28.  *  purpose.
  29.  *
  30.  *  Please cite the author in any work or product based on this material.
  31.  *
  32.  * ===========================================================================
  33.  *
  34.  * Author: Anton Golikov
  35.  *
  36.  * File Description:
  37.  *   Resolve host name to ip address and back using preset ini-file
  38.  *
  39.  */
  40. #include <ncbi_pch.hpp>
  41. #include <util/smalldns.hpp>
  42. #include <corelib/ncbistr.hpp>
  43. #include <corelib/ncbireg.hpp>
  44. #if defined(NCBI_OS_MSWIN)
  45. #  include <winsock2.h>
  46. #elif defined(NCBI_OS_UNIX)
  47. #  include <unistd.h>
  48. #  ifdef NCBI_COMPILER_MW_MSL
  49. #    include <ncbi_mslextras.h>
  50. #  else
  51. #    include <netdb.h>
  52. #  endif
  53. #elif defined(NCBI_OS_MAC)
  54. #  include <unistd.h>
  55. #  include <netdb.h>
  56. #else
  57. #  error "Unsupported platform"
  58. #endif
  59. #include <errno.h>
  60. BEGIN_NCBI_SCOPE
  61. string CSmallDNS::sm_localHostName;
  62. CSmallDNS::CSmallDNS(const string& local_hosts_file /* = "./hosts.ini" */)
  63. {
  64.     const string section("LOCAL_DNS");
  65.     
  66.     CNcbiIfstream is(local_hosts_file.c_str());
  67.     if ( !is.good() ) {
  68.         ERR_POST(Error << "CSmallDNS: cannot open file: " <<local_hosts_file);
  69.         return;
  70.     }
  71.     CNcbiRegistry reg(is);
  72.     list<string> items;
  73.     
  74.     reg.EnumerateEntries(section, &items);
  75.     ITERATE(list<string>, it, items) {
  76.         string val = reg.Get(section, *it);
  77.         if ( !IsValidIP(val) ) {
  78.             ERR_POST(Warning << "CSmallDNS: Bad IP address '" << val
  79.                      << "' for " << *it);
  80.         } else {
  81.             m_map[*it] = val;
  82.             m_map[val] = *it;
  83.         }
  84.     }
  85.     is.close();
  86. }
  87.     
  88. CSmallDNS::~CSmallDNS()
  89. {
  90.     return;
  91. }
  92. bool CSmallDNS::IsValidIP(const string& ip)
  93. {
  94.     list<string> dig;
  95.     
  96.     NStr::Split(ip, ".", dig);
  97.     if (dig.size() != 4) {
  98.         return false;
  99.     }
  100.     ITERATE(list<string>, it, dig) {
  101.         try {
  102.             unsigned long i = NStr::StringToULong(*it);
  103.             if ( i > 255 ) {
  104.                 return false;
  105.             }
  106.         } catch(...) {
  107.             return false;
  108.         }
  109.     }
  110.     return true;
  111. }
  112. string CSmallDNS::GetLocalIP(void) const
  113. {
  114.     return LocalResolveDNS(GetLocalHost());
  115. }
  116. string CSmallDNS::GetLocalHost(void)
  117. {
  118.     if ( sm_localHostName.empty() ) {
  119. #if !defined(MAXHOSTNAMELEN)
  120. #  define MAXHOSTNAMELEN 256
  121. #endif
  122.         char buffer[MAXHOSTNAMELEN];
  123.         buffer[0] = buffer[MAXHOSTNAMELEN-1] = '';
  124.         errno = 0;
  125.         if ( gethostname(buffer, sizeof(buffer)) == 0 ) {
  126.             if ( buffer[MAXHOSTNAMELEN - 1] ) {
  127.                 ERR_POST(Warning <<
  128.                     "CSmallDNS: Host name buffer too small");
  129.             } else {
  130.                 char* dot_pos = strstr(buffer, ".");
  131.                 if ( dot_pos ) {
  132.                     dot_pos[0] = '';
  133.                 }
  134.                 sm_localHostName = buffer;
  135.             }
  136.         } else {
  137.             ERR_POST(Warning <<
  138.                 "CSmallDNS: Cannot detect host name, errno:" << errno);
  139.         }
  140.     }
  141.     return sm_localHostName;
  142. }
  143. string CSmallDNS::LocalResolveDNS(const string& host) const
  144. {
  145.     if ( IsValidIP(host) ) {
  146.         return host;
  147.     }
  148.     map<string, string>::const_iterator it = m_map.find(host);
  149.     if ( it != m_map.end() ) {
  150.         return it->second;
  151.     }
  152.     return kEmptyStr;
  153. }
  154. string CSmallDNS::LocalBackResolveDNS(const string& ip) const
  155. {
  156.     if ( !IsValidIP(ip) ) {
  157.         return kEmptyStr;
  158.     }
  159.     map<string, string>::const_iterator it = m_map.find(ip);
  160.     if ( it != m_map.end() ) {
  161.         return it->second;
  162.     }
  163.     return kEmptyStr;
  164. }
  165. END_NCBI_SCOPE
  166. /*
  167.  * ===========================================================================
  168.  * $Log: smalldns.cpp,v $
  169.  * Revision 1000.1  2004/06/01 19:40:28  gouriano
  170.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.8
  171.  *
  172.  * Revision 1.8  2004/05/18 14:58:25  gorelenk
  173.  * Roll-back to inclusion of winsock2.h on MSVC
  174.  *
  175.  * Revision 1.7  2004/05/17 23:01:23  gorelenk
  176.  * Fixed condition of include of winsock2.h
  177.  *
  178.  * Revision 1.6  2004/05/17 21:06:02  gorelenk
  179.  * Added include of PCH ncbi_pch.hpp
  180.  *
  181.  * Revision 1.5  2003/10/21 14:16:20  ivanov
  182.  * Fixed GetLocalHost(): use MAXHOSTNAMELEN as buffer size (by Anton Lavrentiev)
  183.  *
  184.  * Revision 1.4  2003/10/20 21:16:56  ivanov
  185.  * Replaced uname() with gethostname(). Some code rearrangement.
  186.  *
  187.  * ===========================================================================
  188.  */