Blame nss/test-netdb.c

Packit 6c4009
/* Copyright (C) 1998-2018 Free Software Foundation, Inc.
Packit 6c4009
   This file is part of the GNU C Library.
Packit 6c4009
   Contributed by Andreas Jaeger <aj@suse.de>, 1998.
Packit 6c4009
Packit 6c4009
   The GNU C Library is free software; you can redistribute it and/or
Packit 6c4009
   modify it under the terms of the GNU Lesser General Public
Packit 6c4009
   License as published by the Free Software Foundation; either
Packit 6c4009
   version 2.1 of the License, or (at your option) any later version.
Packit 6c4009
Packit 6c4009
   The GNU C Library is distributed in the hope that it will be useful,
Packit 6c4009
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 6c4009
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit 6c4009
   Lesser General Public License for more details.
Packit 6c4009
Packit 6c4009
   You should have received a copy of the GNU Lesser General Public
Packit 6c4009
   License along with the GNU C Library; if not, see
Packit 6c4009
   <http://www.gnu.org/licenses/>.  */
Packit 6c4009
Packit 6c4009
/*
Packit 6c4009
  Testing of some network related lookup functions.
Packit 6c4009
  The system databases looked up are:
Packit 6c4009
  - /etc/services
Packit 6c4009
  - /etc/hosts
Packit 6c4009
  - /etc/networks
Packit 6c4009
  - /etc/protocols
Packit 6c4009
  The tests try to be fairly generic and simple so that they work on
Packit 6c4009
  every possible setup (and might therefore not detect some possible
Packit 6c4009
  errors).
Packit 6c4009
*/
Packit 6c4009
Packit 6c4009
#include <netdb.h>
Packit 6c4009
#include <stdio.h>
Packit 6c4009
#include <stdlib.h>
Packit 6c4009
#include <string.h>
Packit 6c4009
#include <arpa/inet.h>
Packit 6c4009
#include <netinet/in.h>
Packit 6c4009
#include <sys/param.h>
Packit 6c4009
#include <sys/socket.h>
Packit 6c4009
#include <unistd.h>
Packit 6c4009
#include <errno.h>
Packit 6c4009
#include "nss.h"
Packit 6c4009
Packit 6c4009
#include <support/support.h>
Packit 6c4009
Packit 6c4009
/*
Packit 6c4009
  The following define is necessary for glibc 2.0.6
Packit 6c4009
*/
Packit 6c4009
#ifndef INET6_ADDRSTRLEN
Packit 6c4009
# define INET6_ADDRSTRLEN 46
Packit 6c4009
#endif
Packit 6c4009
Packit 6c4009
int error_count;
Packit 6c4009
Packit 6c4009
static void
Packit 6c4009
output_servent (const char *call, struct servent *sptr)
Packit 6c4009
{
Packit 6c4009
  char **pptr;
Packit 6c4009
Packit 6c4009
  if (sptr == NULL)
Packit 6c4009
    printf ("Call: %s returned NULL\n", call);
Packit 6c4009
  else
Packit 6c4009
    {
Packit 6c4009
      printf ("Call: %s, returned: s_name: %s, s_port: %d, s_proto: %s\n",
Packit 6c4009
	      call, sptr->s_name, ntohs(sptr->s_port), sptr->s_proto);
Packit 6c4009
      for (pptr = sptr->s_aliases; *pptr != NULL; pptr++)
Packit 6c4009
	printf ("  alias: %s\n", *pptr);
Packit 6c4009
    }
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
Packit 6c4009
static void
Packit 6c4009
test_services (void)
Packit 6c4009
{
Packit 6c4009
  struct servent *sptr;
Packit 6c4009
Packit 6c4009
  sptr = getservbyname ("domain", "tcp");
Packit 6c4009
  output_servent ("getservbyname (\"domain\", \"tcp\")", sptr);
Packit 6c4009
Packit 6c4009
  sptr = getservbyname ("domain", "udp");
Packit 6c4009
  output_servent ("getservbyname (\"domain\", \"udp\")", sptr);
Packit 6c4009
Packit 6c4009
  sptr = getservbyname ("domain", NULL);
Packit 6c4009
  output_servent ("getservbyname (\"domain\", NULL)", sptr);
Packit 6c4009
Packit 6c4009
  sptr = getservbyname ("not-existant", NULL);
Packit 6c4009
  output_servent ("getservbyname (\"not-existant\", NULL)", sptr);
Packit 6c4009
Packit 6c4009
  /* This shouldn't return anything.  */
Packit 6c4009
  sptr = getservbyname ("", "");
Packit 6c4009
  output_servent ("getservbyname (\"\", \"\")", sptr);
Packit 6c4009
Packit 6c4009
  sptr = getservbyname ("", "tcp");
Packit 6c4009
  output_servent ("getservbyname (\"\", \"tcp\")", sptr);
Packit 6c4009
Packit 6c4009
  sptr = getservbyport (htons(53), "tcp");
Packit 6c4009
  output_servent ("getservbyport (htons(53), \"tcp\")", sptr);
Packit 6c4009
Packit 6c4009
  sptr = getservbyport (htons(53), NULL);
Packit 6c4009
  output_servent ("getservbyport (htons(53), NULL)", sptr);
Packit 6c4009
Packit 6c4009
  sptr = getservbyport (htons(1), "udp"); /* shouldn't exist */
Packit 6c4009
  output_servent ("getservbyport (htons(1), \"udp\")", sptr);
Packit 6c4009
Packit 6c4009
  setservent (0);
Packit 6c4009
  do
Packit 6c4009
    {
Packit 6c4009
      sptr = getservent ();
Packit 6c4009
      output_servent ("getservent ()", sptr);
Packit 6c4009
    }
Packit 6c4009
  while (sptr != NULL);
Packit 6c4009
  endservent ();
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
Packit 6c4009
static void
Packit 6c4009
output_hostent (const char *call, struct hostent *hptr)
Packit 6c4009
{
Packit 6c4009
  char **pptr;
Packit 6c4009
  char buf[INET6_ADDRSTRLEN];
Packit 6c4009
Packit 6c4009
  if (hptr == NULL)
Packit 6c4009
    printf ("Call: %s returned NULL\n", call);
Packit 6c4009
  else
Packit 6c4009
    {
Packit 6c4009
      printf ("Call: %s returned: name: %s, addr_type: %d\n",
Packit 6c4009
	      call, hptr->h_name, hptr->h_addrtype);
Packit 6c4009
      if (hptr->h_aliases)
Packit 6c4009
	for (pptr = hptr->h_aliases; *pptr != NULL; pptr++)
Packit 6c4009
	  printf ("  alias: %s\n", *pptr);
Packit 6c4009
Packit 6c4009
      for (pptr = hptr->h_addr_list; *pptr != NULL; pptr++)
Packit 6c4009
	printf ("  ip: %s\n",
Packit 6c4009
		inet_ntop (hptr->h_addrtype, *pptr, buf, sizeof (buf)));
Packit 6c4009
    }
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
static void
Packit 6c4009
test_hosts (void)
Packit 6c4009
{
Packit 6c4009
  struct hostent *hptr1, *hptr2;
Packit 6c4009
  char *name = NULL;
Packit 6c4009
  size_t namelen = 0;
Packit 6c4009
  struct in_addr ip;
Packit 6c4009
Packit 6c4009
  hptr1 = gethostbyname ("localhost");
Packit 6c4009
  hptr2 = gethostbyname ("LocalHost");
Packit 6c4009
  if (hptr1 != NULL || hptr2 != NULL)
Packit 6c4009
    {
Packit 6c4009
      if (hptr1 == NULL)
Packit 6c4009
	{
Packit 6c4009
	  printf ("localhost not found - but LocalHost found:-(\n");
Packit 6c4009
	  ++error_count;
Packit 6c4009
	}
Packit 6c4009
      else if (hptr2 == NULL)
Packit 6c4009
	{
Packit 6c4009
	  printf ("LocalHost not found - but localhost found:-(\n");
Packit 6c4009
	  ++error_count;
Packit 6c4009
	}
Packit 6c4009
      else if (strcmp (hptr1->h_name, hptr2->h_name) != 0)
Packit 6c4009
	{
Packit 6c4009
	  printf ("localhost and LocalHost have different canoncial name\n");
Packit 6c4009
	  printf ("gethostbyname (\"localhost\")->%s\n", hptr1->h_name);
Packit 6c4009
	  printf ("gethostbyname (\"LocalHost\")->%s\n", hptr2->h_name);
Packit 6c4009
	  ++error_count;
Packit 6c4009
	}
Packit 6c4009
      else
Packit 6c4009
	output_hostent ("gethostbyname(\"localhost\")", hptr1);
Packit 6c4009
    }
Packit 6c4009
Packit 6c4009
  hptr1 = gethostbyname ("127.0.0.1");
Packit 6c4009
  output_hostent ("gethostbyname (\"127.0.0.1\")", hptr1);
Packit 6c4009
Packit 6c4009
  hptr1 = gethostbyname ("10.1234");
Packit 6c4009
  output_hostent ("gethostbyname (\"10.1234\")", hptr1);
Packit 6c4009
Packit 6c4009
  hptr1 = gethostbyname2 ("localhost", AF_INET);
Packit 6c4009
  output_hostent ("gethostbyname2 (\"localhost\", AF_INET)", hptr1);
Packit 6c4009
Packit 6c4009
  while (gethostname (name, namelen) < 0 && errno == ENAMETOOLONG)
Packit 6c4009
    {
Packit 6c4009
      namelen += 2;		/* tiny increments to test a lot */
Packit 6c4009
      name = xrealloc (name, namelen);
Packit 6c4009
    }
Packit 6c4009
  if (gethostname (name, namelen) == 0)
Packit 6c4009
    {
Packit 6c4009
      printf ("Hostname: %s\n", name);
Packit 6c4009
      if (name != NULL)
Packit 6c4009
	{
Packit 6c4009
	  hptr1 = gethostbyname (name);
Packit 6c4009
	  output_hostent ("gethostbyname (gethostname(...))", hptr1);
Packit 6c4009
	}
Packit 6c4009
    }
Packit 6c4009
Packit 6c4009
  ip.s_addr = htonl (INADDR_LOOPBACK);
Packit 6c4009
  hptr1 = gethostbyaddr ((char *) &ip, sizeof(ip), AF_INET);
Packit 6c4009
  if (hptr1 != NULL)
Packit 6c4009
    {
Packit 6c4009
      printf ("official name of 127.0.0.1: %s\n", hptr1->h_name);
Packit 6c4009
    }
Packit 6c4009
Packit 6c4009
  sethostent (0);
Packit 6c4009
  do
Packit 6c4009
    {
Packit 6c4009
      hptr1 = gethostent ();
Packit 6c4009
      output_hostent ("gethostent ()", hptr1);
Packit 6c4009
    }
Packit 6c4009
  while (hptr1 != NULL);
Packit 6c4009
  endhostent ();
Packit 6c4009
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
Packit 6c4009
static void
Packit 6c4009
output_netent (const char *call, struct netent *nptr)
Packit 6c4009
{
Packit 6c4009
  char **pptr;
Packit 6c4009
Packit 6c4009
  if (nptr == NULL)
Packit 6c4009
    printf ("Call: %s returned NULL\n", call);
Packit 6c4009
  else
Packit 6c4009
    {
Packit 6c4009
      struct in_addr ip;
Packit 6c4009
Packit 6c4009
      ip.s_addr = htonl(nptr->n_net);
Packit 6c4009
      printf ("Call: %s, returned: n_name: %s, network_number: %s\n",
Packit 6c4009
	      call, nptr->n_name, inet_ntoa (ip));
Packit 6c4009
Packit 6c4009
      for (pptr = nptr->n_aliases; *pptr != NULL; pptr++)
Packit 6c4009
	printf ("  alias: %s\n", *pptr);
Packit 6c4009
    }
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
static void
Packit 6c4009
test_network (void)
Packit 6c4009
{
Packit 6c4009
  struct netent *nptr;
Packit 6c4009
  uint32_t ip;
Packit 6c4009
Packit 6c4009
  /*
Packit 6c4009
     This test needs the following line in /etc/networks:
Packit 6c4009
     loopback        127.0.0.0
Packit 6c4009
  */
Packit 6c4009
  nptr = getnetbyname ("loopback");
Packit 6c4009
  output_netent ("getnetbyname (\"loopback\")",nptr);
Packit 6c4009
Packit 6c4009
  nptr = getnetbyname ("LoopBACK");
Packit 6c4009
  output_netent ("getnetbyname (\"LoopBACK\")",nptr);
Packit 6c4009
Packit 6c4009
  ip = inet_network ("127.0.0.0");
Packit 6c4009
  nptr = getnetbyaddr (ip, AF_INET);
Packit 6c4009
  output_netent ("getnetbyaddr (inet_network (\"127.0.0.0\"), AF_INET)",nptr);
Packit 6c4009
Packit 6c4009
  setnetent (0);
Packit 6c4009
  do
Packit 6c4009
    {
Packit 6c4009
      nptr = getnetent ();
Packit 6c4009
      output_netent ("getnetent ()", nptr);
Packit 6c4009
    }
Packit 6c4009
  while (nptr != NULL);
Packit 6c4009
  endnetent ();
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
Packit 6c4009
static void
Packit 6c4009
output_protoent (const char *call, struct protoent *prptr)
Packit 6c4009
{
Packit 6c4009
  char **pptr;
Packit 6c4009
Packit 6c4009
  if (prptr == NULL)
Packit 6c4009
    printf ("Call: %s returned NULL\n", call);
Packit 6c4009
  else
Packit 6c4009
    {
Packit 6c4009
      printf ("Call: %s, returned: p_name: %s, p_proto: %d\n",
Packit 6c4009
	      call, prptr->p_name, prptr->p_proto);
Packit 6c4009
      for (pptr = prptr->p_aliases; *pptr != NULL; pptr++)
Packit 6c4009
	printf ("  alias: %s\n", *pptr);
Packit 6c4009
    }
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
Packit 6c4009
static void
Packit 6c4009
test_protocols (void)
Packit 6c4009
{
Packit 6c4009
  struct protoent *prptr;
Packit 6c4009
Packit 6c4009
  prptr = getprotobyname ("IP");
Packit 6c4009
  output_protoent ("getprotobyname (\"IP\")", prptr);
Packit 6c4009
Packit 6c4009
  prptr = getprotobynumber (1);
Packit 6c4009
  output_protoent ("getprotobynumber (1)", prptr);
Packit 6c4009
Packit 6c4009
  setprotoent (0);
Packit 6c4009
  do
Packit 6c4009
    {
Packit 6c4009
      prptr = getprotoent ();
Packit 6c4009
      output_protoent ("getprotoent ()", prptr);
Packit 6c4009
    }
Packit 6c4009
  while (prptr != NULL);
Packit 6c4009
  endprotoent ();
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
Packit 6c4009
/* Override /etc/nsswitch.conf for this program.  This is mainly
Packit 6c4009
   useful for developers. */
Packit 6c4009
static void  __attribute__ ((unused))
Packit 6c4009
setdb (const char *dbname)
Packit 6c4009
{
Packit 6c4009
  if (strcmp ("db", dbname))
Packit 6c4009
      {
Packit 6c4009
	/*
Packit 6c4009
	  db is not implemented for hosts, networks
Packit 6c4009
	*/
Packit 6c4009
	__nss_configure_lookup ("hosts", dbname);
Packit 6c4009
	__nss_configure_lookup ("networks", dbname);
Packit 6c4009
      }
Packit 6c4009
  __nss_configure_lookup ("protocols", dbname);
Packit 6c4009
  __nss_configure_lookup ("services", dbname);
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
Packit 6c4009
static int
Packit 6c4009
do_test (void)
Packit 6c4009
{
Packit 6c4009
  /*
Packit 6c4009
    setdb ("db");
Packit 6c4009
  */
Packit 6c4009
Packit 6c4009
  test_hosts ();
Packit 6c4009
  test_network ();
Packit 6c4009
  test_protocols ();
Packit 6c4009
  test_services ();
Packit 6c4009
Packit 6c4009
  if (error_count)
Packit 6c4009
    printf ("\n %d errors occurred!\n", error_count);
Packit 6c4009
  else
Packit 6c4009
    printf ("No visible errors occurred!\n");
Packit 6c4009
Packit 6c4009
  return (error_count != 0);
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
#include <support/test-driver.c>