Mark compat code with attribute_compat_text_section.
[kopensolaris-gnu/glibc.git] / nss / getent.c
index a9cba96..f43bc63 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 1998,1999,2000,2001,2002,2003 Free Software Foundation, Inc.
+/* Copyright (c) 1998-2003, 2004 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Thorsten Kukuk <kukuk@suse.de>, 1998.
 
@@ -75,7 +75,7 @@ print_version (FILE *stream, struct argp_state *state)
 Copyright (C) %s Free Software Foundation, Inc.\n\
 This is free software; see the source for copying conditions.  There is NO\n\
 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\
-"), "2003");
+"), "2004");
   fprintf (stream, gettext ("Written by %s.\n"), "Thorsten Kukuk");
 }
 
@@ -229,7 +229,7 @@ group_keys (int number, char *key[])
 }
 
 /* This is for hosts */
-static inline void
+static void
 print_hosts (struct hostent *host)
 {
   unsigned int cnt;
@@ -296,6 +296,73 @@ hosts_keys (int number, char *key[])
   return result;
 }
 
+/* This is for hosts, but using getaddrinfo */
+static int
+ahosts_keys (int number, char *key[])
+{
+  int result = 0;
+  int i;
+  struct hostent *host;
+
+  if (number == 0)
+    {
+      sethostent (0);
+      while ((host = gethostent ()) != NULL)
+       print_hosts (host);
+      endhostent ();
+      return result;
+    }
+
+  struct addrinfo hint;
+  memset (&hint, '\0', sizeof (hint));
+  hint.ai_flags = AI_V4MAPPED | AI_ADDRCONFIG | AI_CANONNAME;
+  hint.ai_family = AF_UNSPEC;
+
+  for (i = 0; i < number; ++i)
+    {
+      struct addrinfo *res;
+
+      if (getaddrinfo (key[i], NULL, &hint, &res) != 0)
+       result = 2;
+      else
+       {
+         struct addrinfo *runp = res;
+
+         while (runp != NULL)
+           {
+             char sockbuf[20];
+             const char *sockstr;
+             if (runp->ai_socktype == SOCK_STREAM)
+               sockstr = "STREAM";
+             else if (runp->ai_socktype == SOCK_DGRAM)
+               sockstr = "DGRAM";
+             else if (runp->ai_socktype == SOCK_RAW)
+               sockstr = "RAW";
+             else
+               {
+                 snprintf (sockbuf, sizeof (sockbuf), "%d",
+                           runp->ai_socktype);
+                 sockstr = sockbuf;
+               }
+
+             char buf[INET6_ADDRSTRLEN];
+             printf ("%-15s %-6s %s\n",
+                     inet_ntop (runp->ai_family,
+                                &((struct sockaddr_in *) runp->ai_addr)->sin_addr,
+                                buf, sizeof (buf)),
+                     sockstr,
+                     runp->ai_canonname);
+
+             runp = runp->ai_next;
+           }
+
+         freeaddrinfo (res);
+       }
+    }
+
+  return result;
+}
+
 /* This is for netgroup */
 static int
 netgroup_keys (int number, char *key[])
@@ -329,7 +396,7 @@ netgroup_keys (int number, char *key[])
 }
 
 /* This is for networks */
-static inline void
+static void
 print_networks (struct netent *net)
 {
   unsigned int i;
@@ -624,7 +691,7 @@ services_keys (int number, char *key[])
 }
 
 /* This is for shadow */
-static inline void
+static void
 print_shadow (struct spwd *sp)
 {
   printf ("%s:%s:",
@@ -688,6 +755,7 @@ struct
   } databases[] =
   {
 #define D(name) { #name, name ## _keys },
+D(ahosts)
 D(aliases)
 D(ethers)
 D(group)
@@ -723,7 +791,7 @@ parse_option (int key, char *arg, struct argp_state *state)
 }
 
 /* build doc */
-static inline void
+static void
 build_doc (void)
 {
   int i, j, len;