Blame nss/test-netdb.c

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