(parse_list): Always inline.
[kopensolaris-gnu/glibc.git] / nss / getXXent_r.c
index 07e5759..5a1e3e9 100644 (file)
@@ -1,23 +1,24 @@
-/* Copyright (C) 1996 Free Software Foundation, Inc.
-This file is part of the GNU C Library.
-Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
+/* Copyright (C) 1996,97,98,99,2000,2002 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
 
-The GNU C Library is free software; you can redistribute it and/or
-modify it under the terms of the GNU Library General Public License as
-published by the Free Software Foundation; either version 2 of the
-License, or (at your option) any later version.
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
 
-The GNU C Library is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-Library General Public License for more details.
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
 
-You should have received a copy of the GNU Library General Public
-License along with the GNU C Library; see the file COPYING.LIB.  If
-not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA.  */
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
 
-#include <libc-lock.h>
+#include <errno.h>
+#include <bits/libc-lock.h>
 
 #include "nsswitch.h"
 
@@ -48,175 +49,155 @@ Boston, MA 02111-1307, USA.  */
 
 /* To make the real sources a bit prettier.  */
 #define REENTRANT_GETNAME APPEND_R (GETFUNC_NAME)
-#define APPEND_R(name) APPEND_R1 (name)
-#define APPEND_R1(name) name##_r
+#define APPEND_R(Name) CONCAT2_2 (Name, _r)
+#define INTERNAL(Name) CONCAT2_2 (__, Name)
+#define CONCAT2_1(Pre, Post) CONCAT2_2 (Pre, Post)
+#define CONCAT2_2(Pre, Post) Pre##Post
+#define NEW(name) NEW1 (name)
+#define NEW1(name) __new_##name
 
 #define SETFUNC_NAME_STRING STRINGIZE (SETFUNC_NAME)
-#define GETFUNC_NAME_STRING STRINGIZE (GETFUNC_NAME)
+#define GETFUNC_NAME_STRING STRINGIZE (REENTRANT_GETNAME)
 #define ENDFUNC_NAME_STRING STRINGIZE (ENDFUNC_NAME)
 #define DATABASE_NAME_STRING STRINGIZE (DATABASE_NAME)
-#define STRINGIZE(name) STRINGIZE1 (name)
-#define STRINGIZE1(name) #name
+#define STRINGIZE(Name) STRINGIZE1 (Name)
+#define STRINGIZE1(Name) #Name
 
-#define DB_LOOKUP_FCT CONCAT3_1 (__nss_, DATABASE_NAME, _lookup)
-#define CONCAT3_1(Pre, Name, Post) CONCAT3_2 (Pre, Name, Post)
-#define CONCAT3_2(Pre, Name, Post) Pre##Name##Post
+#ifndef DB_LOOKUP_FCT
+# define DB_LOOKUP_FCT CONCAT3_1 (__nss_, DATABASE_NAME, _lookup)
+# define CONCAT3_1(Pre, Name, Post) CONCAT3_2 (Pre, Name, Post)
+# define CONCAT3_2(Pre, Name, Post) Pre##Name##Post
+#endif
 
 /* Sometimes we need to store error codes in the `h_errno' variable.  */
 #ifdef NEED_H_ERRNO
 # define H_ERRNO_PARM , int *h_errnop
 # define H_ERRNO_VAR , &h_errno
+# define H_ERRNO_VAR_P &h_errno
 #else
 # define H_ERRNO_PARM
 # define H_ERRNO_VAR
+# define H_ERRNO_VAR_P NULL
 #endif
 
 /* Some databases take the `stayopen' flag.  */
-#ifndef STAYOPEN
-#define STAYOPEN void
-#define STAYOPEN_VAR
+#ifdef STAYOPEN
+# define STAYOPEN_TMP CONCAT2_1 (STAYOPEN, _tmp)
+# define STAYOPEN_TMPVAR &CONCAT2_1 (STAYOPEN_VAR, _tmp)
+#else
+# define STAYOPEN void
+# define STAYOPEN_VAR 0
+# define STAYOPEN_TMPVAR NULL
 #endif
 
-/* Prototype for the setXXXent functions we use here.  */
-typedef int (*set_function) (STAYOPEN);
-
-/* Prototype for the endXXXent functions we use here.  */
-typedef int (*end_function) (void);
-
-/* Prototype for the setXXXent functions we use here.  */
-typedef int (*get_function) (LOOKUP_TYPE *, char *, int H_ERRNO_PARM);
-
+#ifndef NEED__RES
+# define NEED__RES 0
+#endif
 
 /* This handle for the NSS data base is shared between all
    set/get/endXXXent functions.  */
 static service_user *nip;
+/* Remember the last service used since the last call to  `endXXent'.  */
+static service_user *last_nip;
 /* Remember the first service_entry, it's always the same.  */
 static service_user *startp;
 
+#ifdef STAYOPEN_TMP
+/* We need to remember the last `stayopen' flag given by the user
+   since the `setent' function is only called for the first available
+   service.  */
+static STAYOPEN_TMP;
+#endif
+
 /* Protect above variable against multiple uses at the same time.  */
-__libc_lock_define_initialized (static, lock);
+__libc_lock_define_initialized (static, lock)
 
 /* The lookup function for the first entry of this service.  */
-extern int DB_LOOKUP_FCT (service_user **nip, const char *name, void **fctp);
-
-
+extern int DB_LOOKUP_FCT (service_user **nip, const char *name, void **fctp)
+     internal_function;
+libc_hidden_proto (DB_LOOKUP_FCT)
+\f
 void
 SETFUNC_NAME (STAYOPEN)
 {
-  set_function fct;
-  int no_more;
-
-#ifdef NEED__RES
-  if ((_res.options & RES_INIT) == 0 && res_init () == -1)
-    {
-      h_errno = NETDB_INTERNAL;
-      return NULL;
-    }
-#endif /* need _res */
+  int save;
 
   __libc_lock_lock (lock);
+  __nss_setent (SETFUNC_NAME_STRING, DB_LOOKUP_FCT, &nip, &startp,
+               &last_nip, STAYOPEN_VAR, STAYOPEN_TMPVAR, NEED__RES);
 
-  if (startp == NULL)
-    {
-      no_more = DB_LOOKUP_FCT (&nip, SETFUNC_NAME_STRING, (void **) &fct);
-      startp = no_more == 0 ? (service_user *) -1 : nip;
-    }
-  else
-    no_more = (nip = startp) != (service_user *) -1;
-
-  /* Cycle through all the services and run their setXXent functions.  */
-  while (! no_more)
-    {
-      /* Ignore status, we force check in __NSS_NEXT.  */
-      (void) (*fct) (STAYOPEN_VAR);
-
-      no_more = __nss_next (&nip, SETFUNC_NAME_STRING, (void **) &fct, 0, 1);
-    }
-
+  save = errno;
   __libc_lock_unlock (lock);
+  __set_errno (save);
 }
 
 
 void
 ENDFUNC_NAME (void)
 {
-  end_function fct;
-  int no_more;
-
-#ifdef NEED__RES
-  if ((_res.options & RES_INIT) == 0 && res_init () == -1)
-    {
-      h_errno = NETDB_INTERNAL;
-      return NULL;
-    }
-#endif /* need _res */
-
-  __libc_lock_lock (lock);
+  int save;
 
-  if (startp == NULL)
+  /* If the service has not been used before do not do anything.  */
+  if (startp != NULL)
     {
-      no_more = DB_LOOKUP_FCT (&nip, SETFUNC_NAME_STRING, (void **) &fct);
-      startp = no_more == 0 ? (service_user *) -1 : nip;
+      __libc_lock_lock (lock);
+      __nss_endent (ENDFUNC_NAME_STRING, DB_LOOKUP_FCT, &nip, &startp,
+                   &last_nip, NEED__RES);
+      save = errno;
+      __libc_lock_unlock (lock);
+      __set_errno (save);
     }
-  else
-    no_more = (nip = startp) != (service_user *) -1;
+}
 
-  /* Cycle through all the services and run their endXXent functions.  */
-  while (no_more == 0)
-    {
-      /* Ignore status, we force check in __NSS_NEXT.  */
-      (void) (*fct) ();
 
-      no_more = __nss_next (&nip, ENDFUNC_NAME_STRING, (void **) &fct, 0, 1);
-    }
+int
+INTERNAL (REENTRANT_GETNAME) (LOOKUP_TYPE *resbuf, char *buffer, size_t buflen,
+                             LOOKUP_TYPE **result H_ERRNO_PARM)
+{
+  int status;
+  int save;
 
+  __libc_lock_lock (lock);
+  status = __nss_getent_r (GETFUNC_NAME_STRING, SETFUNC_NAME_STRING,
+                          DB_LOOKUP_FCT, &nip, &startp, &last_nip,
+                          STAYOPEN_TMPVAR, NEED__RES, resbuf, buffer,
+                          buflen, (void **) result, H_ERRNO_VAR_P);
+  save = errno;
   __libc_lock_unlock (lock);
+  __set_errno (save);
+  return status;
 }
 
 
-LOOKUP_TYPE *
-REENTRANT_GETNAME (LOOKUP_TYPE *result, char *buffer, int buflen H_ERRNO_PARM)
-{
-  get_function fct;
-  int no_more;
-  enum nss_status status = NSS_STATUS_NOTFOUND;
-
-#ifdef NEED__RES
-  if ((_res.options & RES_INIT) == 0 && res_init () == -1)
-    {
-      h_errno = NETDB_INTERNAL;
-      return NULL;
-    }
-#endif /* need _res */
+#include <shlib-compat.h>
+#if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_1_2)
+#define OLD(name) OLD1 (name)
+#define OLD1(name) __old_##name
 
-  __libc_lock_lock (lock);
+int
+OLD (REENTRANT_GETNAME) (LOOKUP_TYPE *resbuf, char *buffer, size_t buflen,
+                        LOOKUP_TYPE **result H_ERRNO_PARM)
+{
+  int ret = INTERNAL (REENTRANT_GETNAME) (resbuf, buffer, buflen,
+                                         result H_ERRNO_VAR);
 
-  if (nip)
-    /* Continuing a walk-through started before.  */
-    no_more = 0;
-  else
-    {
-      if (startp == NULL)
-       {
-         no_more = DB_LOOKUP_FCT (&nip, SETFUNC_NAME_STRING, (void **) &fct);
-         startp = no_more == 0 ? (service_user *) -1 : nip;
-       }
-      else
-       no_more = (nip = startp) != (service_user *) -1;
-
-      if (no_more != 0)
-       status = NSS_STATUS_UNAVAIL;
-    }
+  if (ret != 0)
+    ret = -1;
 
-  while (no_more == 0)
-    {
-      status = (*fct) (result, buffer, buflen H_ERRNO_VAR);
+  return ret;
+}
 
-      no_more = __nss_next (&nip, GETFUNC_NAME_STRING, (void **) &fct,
-                           status, 0);
-    }
+#define do_symbol_version(real, name, version) \
+  compat_symbol (libc, real, name, version)
+do_symbol_version (OLD (REENTRANT_GETNAME), REENTRANT_GETNAME, GLIBC_2_0);
+#endif
 
-  __libc_lock_unlock (lock);
+/* As INTERNAL (REENTRANT_GETNAME) may be hidden, we need an alias
+   in between so that the REENTRANT_GETNAME@@GLIBC_2.1.2 is not
+   hidden too.  */
+strong_alias (INTERNAL (REENTRANT_GETNAME), NEW (REENTRANT_GETNAME));
 
-  return status == NSS_STATUS_SUCCESS ? result : NULL;
-}
+#define do_default_symbol_version(real, name, version) \
+  versioned_symbol (libc, real, name, version)
+do_default_symbol_version (NEW (REENTRANT_GETNAME),
+                          REENTRANT_GETNAME, GLIBC_2_1_2);