home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 1999 mARCH / PCWK3A99.iso / Linux / DDD331 / DDD-3_1_.000 / DDD-3_1_ / ddd-3.1.1 / ddd / hostname.C < prev    next >
C/C++ Source or Header  |  1998-11-16  |  5KB  |  206 lines

  1. // $Id: hostname.C,v 1.23 1998/11/16 13:41:26 zeller Exp $ -*- C++ -*-
  2. // Return `official' name of host
  3.  
  4. // Copyright (C) 1995 Technische Universitaet Braunschweig, Germany.
  5. // Written by Andreas Zeller <zeller@ips.cs.tu-bs.de>.
  6. // 
  7. // This file is part of DDD.
  8. // 
  9. // DDD is free software; you can redistribute it and/or
  10. // modify it under the terms of the GNU General Public
  11. // License as published by the Free Software Foundation; either
  12. // version 2 of the License, or (at your option) any later version.
  13. // 
  14. // DDD is distributed in the hope that it will be useful,
  15. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  16. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  17. // See the GNU General Public License for more details.
  18. // 
  19. // You should have received a copy of the GNU General Public
  20. // License along with DDD -- see the file COPYING.
  21. // If not, write to the Free Software Foundation, Inc.,
  22. // 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  23. // 
  24. // DDD is the data display debugger.
  25. // For details, see the DDD World-Wide-Web page, 
  26. // `http://www.cs.tu-bs.de/softech/ddd/',
  27. // or send a mail to the DDD developers <ddd@ips.cs.tu-bs.de>.
  28.  
  29. char hostname_rcsid[] = 
  30.     "$Id: hostname.C,v 1.23 1998/11/16 13:41:26 zeller Exp $";
  31.  
  32. #include "hostname.h"
  33. #include "config.h"
  34. #include "bool.h"
  35.  
  36. #include <stdio.h>
  37. #include <string.h>
  38. #include <unistd.h>
  39.  
  40. #if !HAVE_POPEN_DECL
  41. extern "C" FILE *popen(const char *command, const char *mode);
  42. #endif
  43. #if !HAVE_PCLOSE_DECL
  44. extern "C" int pclose(FILE *stream);
  45. #endif
  46.  
  47. extern "C" {
  48. // Get hostname.
  49. // We prefer gethostname() on uname() since <sys/utsname.h> makes
  50. // trouble on some systems.
  51. #if HAVE_GETHOSTNAME
  52. #if HAVE_SYS_TYPES_H
  53. #include <sys/types.h>
  54. #endif
  55. #if !HAVE_GETHOSTNAME_DECL
  56.     int gethostname(char *name, size_t size);
  57. #endif // !HAVE_GETHOSTNAME_DECL
  58. #elif HAVE_UNAME
  59. #if HAVE_SYS_UTSNAME_H
  60. #include <sys/utsname.h>
  61. #endif
  62. #if !HAVE_UNAME_DECL
  63.     int uname(struct utsname *name);
  64. #endif
  65. #endif // HAVE_UNAME
  66.  
  67.  
  68. // Get host aliases.
  69. #if HAVE_GETHOSTBYNAME && HAVE_NETDB_H
  70.  
  71. #if HAVE_SYS_TYPES_H
  72. #include <sys/types.h>
  73. #endif
  74. #if HAVE_SYS_SOCKET_H
  75. #include <sys/socket.h>
  76. #endif
  77.  
  78. #include <netdb.h>
  79.  
  80. #ifndef AF_INET
  81. #define AF_INET 2        // internetwork: UDP, TCP, etc.
  82. #endif
  83.  
  84. #endif // HAVE_GETHOSTBYNAME && HAVE_NETDB_H
  85. }
  86.  
  87. #include <sys/param.h>
  88. #ifndef MAXHOSTNAMELEN
  89. #define MAXHOSTNAMELEN 1024
  90. #endif
  91.  
  92. // Return the host name
  93. char *hostname()
  94. {
  95.     static char *name = 0;
  96.     if (name)
  97.     return name;
  98.  
  99.     char buffer[MAXHOSTNAMELEN];
  100.  
  101.     bool okay = false;
  102.  
  103. #if HAVE_GETHOSTNAME
  104.     if (!okay && gethostname(buffer, sizeof(buffer)) == 0)
  105.     {
  106.     okay = true;
  107.     }
  108. #elif HAVE_UNAME
  109.     struct utsname un;
  110.     if (!okay && uname(&un) >= 0)
  111.     {
  112.     strcpy(buffer, un.nodename);
  113.     okay = true;
  114.     }
  115. #endif
  116.  
  117.     if (!okay)
  118.     {
  119.     FILE *fp = popen("uname -n", "r");
  120.     if (fp != 0)
  121.     {
  122.         buffer[0] = '\0';
  123.         fscanf(fp, "%s", buffer);
  124.     }
  125.     pclose(fp);
  126.     }
  127.  
  128.     if (okay)
  129.     return name = strcpy(new char[strlen(buffer) + 1], buffer);
  130.     else
  131.     return name = "unknown";
  132. }
  133.  
  134. // Return the number of '.' in STR
  135. inline int dots(const char *str)
  136. {
  137.     int dots = 0;
  138.     while (*str != '\0')
  139.     if (*str++ == '.')
  140.         dots++;
  141.  
  142.     return dots;
  143. }
  144.  
  145. // Return most qualified name for the current host
  146. static char *_fullhostname(char *most_qualified_host)
  147. {
  148.     // Try local name
  149.     if (most_qualified_host == 0)
  150.     most_qualified_host = hostname();
  151.  
  152. #if HAVE_GETHOSTBYNAME
  153.     struct hostent *h = gethostbyname(most_qualified_host);
  154.     if (h)
  155.     {
  156.     // Try official name
  157.     if (dots(h->h_name) > dots(most_qualified_host))
  158.         most_qualified_host = (char *)h->h_name;
  159.  
  160.     // Try aliases
  161.     for (int i = 0; h->h_aliases[i] != 0; i++)
  162.         if (dots(h->h_aliases[i]) > dots(most_qualified_host))
  163.         most_qualified_host = h->h_aliases[i];
  164.  
  165.     if (dots(most_qualified_host) == 0)
  166.     {
  167.         // Unqualified host - try network addresses
  168.         if (h->h_addrtype == AF_INET)
  169.         {
  170.         for (int j = 0; h->h_addr_list[j] != 0; j++)
  171.         {
  172.             static char num_host[128];
  173.             num_host[0] = '\0';
  174.             for (int i = 0; i < h->h_length; i++)
  175.             sprintf(num_host + strlen(num_host), i ? ".%d" : "%d",
  176.                 int((unsigned char)(h->h_addr_list[j][i])));
  177.  
  178.             if (dots(num_host) > dots(most_qualified_host))
  179.             most_qualified_host = num_host;
  180.         }
  181.         }
  182.     }
  183.     }
  184. #endif
  185.  
  186.     // Return most qualified host name
  187.     return most_qualified_host;
  188. }
  189.  
  190.  
  191. // Return and cache a fully qualified name for the current host
  192. char *fullhostname(char *host)
  193. {
  194.     // Buffer for local host name
  195.     static char *name = 0;
  196.  
  197.     if (name && host == 0)
  198.     return name;
  199.  
  200.     char *n = _fullhostname(host);
  201.     if (host == 0)
  202.     return name = strcpy(new char[strlen(n) + 1], n);
  203.     else
  204.     return n;
  205. }
  206.