about summary refs log tree commit diff
path: root/REORG.TODO/nss/getXXent_r.c
diff options
context:
space:
mode:
Diffstat (limited to 'REORG.TODO/nss/getXXent_r.c')
-rw-r--r--REORG.TODO/nss/getXXent_r.c212
1 files changed, 212 insertions, 0 deletions
diff --git a/REORG.TODO/nss/getXXent_r.c b/REORG.TODO/nss/getXXent_r.c
new file mode 100644
index 0000000000..2710c1cd51
--- /dev/null
+++ b/REORG.TODO/nss/getXXent_r.c
@@ -0,0 +1,212 @@
+/* Copyright (C) 1996-2017 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 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#include <errno.h>
+#include <libc-lock.h>
+
+#include "nsswitch.h"
+
+/*******************************************************************\
+|* Here we assume several symbols to be defined:		   *|
+|* 								   *|
+|* LOOKUP_TYPE   - the return type of the function		   *|
+|* 								   *|
+|* SETFUNC_NAME  - name of the non-reentrant setXXXent function	   *|
+|* 								   *|
+|* GETFUNC_NAME  - name of the non-reentrant getXXXent function	   *|
+|* 								   *|
+|* ENDFUNC_NAME  - name of the non-reentrant endXXXent function	   *|
+|* 								   *|
+|* DATABASE_NAME - name of the database the function accesses	   *|
+|*		   (e.g., host, services, ...)			   *|
+|* 								   *|
+|* Optionally the following vars can be defined:		   *|
+|* 								   *|
+|* STAYOPEN      - variable declaration for setXXXent function	   *|
+|* 								   *|
+|* STAYOPEN_VAR  - variable name for setXXXent function		   *|
+|* 								   *|
+|* NEED_H_ERRNO  - an extra parameter will be passed to point to   *|
+|*		   the global `h_errno' variable.		   *|
+|* 								   *|
+\*******************************************************************/
+
+/* To make the real sources a bit prettier.  */
+#define REENTRANT_GETNAME APPEND_R (GETFUNC_NAME)
+#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 (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
+
+#ifndef DB_LOOKUP_FCT
+# define DB_LOOKUP_FCT CONCAT3_1 (__nss_, DATABASE_NAME, _lookup2)
+# 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.  */
+#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
+
+#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)
+
+/* The lookup function for the first entry of this service.  */
+extern int DB_LOOKUP_FCT (service_user **nip, const char *name,
+			  const char *name2, void **fctp)
+     internal_function;
+libc_hidden_proto (DB_LOOKUP_FCT)
+
+void
+SETFUNC_NAME (STAYOPEN)
+{
+  int save;
+
+  __libc_lock_lock (lock);
+  __nss_setent (SETFUNC_NAME_STRING, DB_LOOKUP_FCT, &nip, &startp,
+		&last_nip, STAYOPEN_VAR, STAYOPEN_TMPVAR, NEED__RES);
+
+  save = errno;
+  __libc_lock_unlock (lock);
+  __set_errno (save);
+}
+
+
+void
+ENDFUNC_NAME (void)
+{
+  int save;
+
+  /* If the service has not been used before do not do anything.  */
+  if (startp != NULL)
+    {
+      __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);
+    }
+}
+
+
+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;
+}
+
+
+#ifdef NO_COMPAT_NEEDED
+strong_alias (INTERNAL (REENTRANT_GETNAME), REENTRANT_GETNAME);
+#else
+# 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
+
+int
+attribute_compat_text_section
+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 (ret != 0)
+    ret = -1;
+
+  return ret;
+}
+
+#  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
+
+/* 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));
+
+# 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);
+#endif
+
+nss_interface_function (SETFUNC_NAME)
+nss_interface_function (ENDFUNC_NAME)
+nss_interface_function (REENTRANT_GETNAME)