glibc/nss/getXXent_r.c
Ulrich Drepper 8a52392237 update from main archive 961126
Wed Nov 27 06:10:10 1996  Ulrich Drepper  <drepper@cygnus.com>

	* Makefile: Fix typo.

	* configure: Require autoconf-2.11.

	* elf/dl-deps.c: Terminate duplicate list.

	* libio/libio.h: Add prototypes for _IO_seekoff and _IO_seekpos.
	* libio/strfile.h: Update from current libg++.
	* libio/strops.c: Likewise.

	* login/Makefile (routines): Update after correction of reentrant
	interface.
	* login/endutent.c: Removed.
	* login/endutent_r.c: Likewise.
	* login/pututline.c: Likewise.
	* login/pututline_r.c: Likewise.
	* login/setutent.c: Likewise.
	* login/setutent_r.c: Likewise.
	* login/getutent.c: Update for new interface.
	* login/getutent_r.c: Likewise.
	* login/getutid.c: Likewise.
	* login/getutid_r.c: Likewise.
	* login/getutline.c: Likewise.
	* login/getutline_r.c: Likewise.
	* login/login.c: Likewise.
	* login/logout.c: Likewise.
	* login/logwtmp.c: Likewise.
	* login/utmp.h: Likewise.
	* sysdeps/unix/getlogin.c: Likewise.
	* sysdeps/unix/getlogin_r.c: Likewise.
	* login/utmp-private.h: New private header.
	* login/utmp_db.c: Stub DB backend for utmp handler.
	* login/utmp_file.c: File backend for utmp handler.
	* sysdeps/gnu/utmpbits.h (struct utmp): Add some more fields.
	(enum utlogin): List of record types.
	(struct exit_status): Record to align with other implementations.

	* sysdeps/generic/paths.h: Add _PATH_UTMP_DB.
	* sysdeps/unix/sysv/linux/paths.h: Likewise.

	* sysdeps/generic/pty.c: Use getgrnam_r instead of getgrnam.

	* sysdeps/stub/getlogin.c: Update copyright.
	* sysdeps/stub/getlogin_r.c: Likewise.

	* nss/getXXbyYY_r.c: Use -1l for error-pointer value instead of -1.
	* nss/getXXent_r.c: Likewise.
	* nss/nsswitch.c: Likewise.

	* posix/Makefile (headers): Add wait.h.
	* posix/wait.h: New file.

	* posix/sys/types.h: Always define intN_t types.

	* stdio-common/Makefile: Update copyright.
	Use -Wno-format flag for scanf4.c and scanf7.c.

	* stdlib/stdlib.h: Reformat.

	* time/africa: Update from ADO tzdata1996m.
	* time/antarctica: Likewise.
	* time/asia: Likewise.
	* time/australia: Likewise.
	* time/etcetera: Likewise.
	* time/europe: Likewise.
	* time/northamerica: Likewise.
	* time/southamerica: Likewise.
	* time/zone.tab: Likewise.

Fri Nov 22 19:34:12 1996  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* sysdeps/posix/getcwd.c (__getcwd): After resizing the buffer
	move the current contents to the end and relocate file name
	pointer to upper half of the buffer.

Sun Nov 24 04:56:19 1996  Ulrich Drepper  <drepper@cygnus.com>

	* time/africa: Update from ADO tzdata1996m.
	* time/antarctica: Likewise.
	* time/asia: Likewise.
	* time/australia: Likewise.
	* time/etcetera: Likewise.
	* time/europe: Likewise.
	* time/nothamerica: Likewise.
	* time/southameria: Likewise.
	* time/zone.tab: Likewise.

	* sysdeps/unix/sysv/linux/sys/serial.h: New file.
	* sysdeps/unix/sysv/linux/Makefile [$(subdir)=misc] (sysdep_headers):
	Add sys/serial.h.
	* sysdeps/unix/sysv/linux/Dist: Add sys/serial.h.

	* posix/wait.h: New file.
	* posix/Makefile (headers): Add wait.h.

Sat Nov 23 17:27:52 1996  Roland McGrath  <roland@gnu.ai.mit.edu>

	* Makeconfig ($(common-objpfx)soversions.mk): Use regular
	expression instead of shell pattern matching.
	* shlib-versions: Change to regular expressions.

Sat Nov 23 13:24:55 1996  Ulrich Drepper  <drepper@cygnus.com>

	* io/stat.c: Add section from libgcc to copyright comment
	to allow this file to be statically linked in applications.
	* io/fstat.c: Likewise.
	* io/lstat.c: Likewise.
	* io/mknod.c: Likewise.

Fri Nov 22 15:14:23 1996  Ulrich Drepper  <drepper@cygnus.com>

	* csu/initfini.c: Add section from libgcc to copyright comment
	to allow this file to be statically linked in applications.

	* malloc/obstack.h [!_LIBC && !HAVE_STRING_H]: Define memcpy if
	not already defined.
	(obstack_grow, obstack_grow0): Correct placement of braces.

	* gnu-versions.h (_GNU_OBSTACK_INTERFACE_VERSION): Define to 2.
	* malloc/obstack.c (OBSTACK_INTERFACE_VERSION): Define to 2.

Thu Nov 21 19:54:51 1996  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* Makerules (make-link): Simplify by changing directory only if
	not using rellns-sh; check whether we really have symbolic links.

	* rellns-sh: Fix the case of $(dirname $2) being a prefix of
	$(dirname $1); use status of ln for exit code; make more robust
	against multiple slashes in a row.

Thu Nov 21 13:05:21 1996  Thomas Bushnell, n/BSG  <thomas@gnu.ai.mit.edu>

	* configure.in (after AC_CANONICAL_HOST): mutate *-*-gnu* names
	into *-*-gnu-gnu*.
	* shlib-versions (gnu versions): Recognize *-*-gnu-gnu* instead of
	the three-part name, to distinguish correctly from *-*-linux-gnu*.

	* sysdeps/mach/hurd/Makefile ($(libdir)/libc.so): Depend on
	$(rpcuserlibs).

	* sysdeps/mach/hurd/Makefile (install-others): Add
	$(libdir)/libc_p.a.
	($(libdir)/libc_p.a): New rule.
	* sysdeps/mach/hurd/libc_p-ldscript: New file.
	* sysdeps/mach/hurd/Dist: Add libc_p-ldscript.

Wed Nov 20 20:28:21 1996  Richard Henderson  <rth@tamu.edu>

	* Makerules (make-link): Use $(shell) to find rellns-sh before we cd.
	* time/Makefile: Likewise.

	* sysdeps/alpha/elf/Makefile: New file.  Build crtbegin.o & crtend.o.
	* sysdeps/alpha/elf/Dist: New file.
	* sysdeps/alpha/elf/crtbegin.S, sysdeps/alpha/elf/crtend.S: New files.
	The bits currently distributed with GCC fail in two ways -- they don't
	understand multiple .got subsections and the extents of the lists are
	dynamicly bound meaning that the application's lists get executed
	multiple times and the library's lists never get executed.

Wed Nov 20 00:42:45 1996  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* stdlib/strtod.c: Fix previous change.

Wed Nov 20 22:07:58 1996  Andreas Jaeger  <aj@arthur.pfalz.de>

	* time/Makefile ($(installed-localtime-file)): Use $(..) to find
	rellns-sh script.

Wed Nov 20 12:50:54 1996  Ulrich Drepper  <drepper@cygnus.com>

	* stdio-common/Makefile: Add CFLAGS-scanf7.c to prevent warning.
	Likesie for scanf4.c
1996-11-27 06:13:15 +00:00

279 lines
8.1 KiB
C
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/* Copyright (C) 1996 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 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.
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. */
#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 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
#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
/* 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
#else
# define H_ERRNO_PARM
# define H_ERRNO_VAR
#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
# define STAYOPEN_TMPVAR
#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 *, size_t H_ERRNO_PARM);
/* 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, void **fctp);
/* Set up NIP to run through the services. If ALL is zero, use NIP's
current location if it's not nil. Return nonzero if there are no
services (left). */
static enum nss_status
setup (void **fctp, const char *func_name, int all)
{
int no_more;
if (startp == NULL)
{
no_more = DB_LOOKUP_FCT (&nip, func_name, fctp);
startp = no_more ? (service_user *) -1l : nip;
}
else if (startp == (service_user *) -1l)
/* No services at all. */
return 1;
else
{
if (all || !nip)
/* Reset to the beginning of the service list. */
nip = startp;
/* Look up the first function. */
no_more = __nss_lookup (&nip, func_name, fctp);
}
return no_more;
}
void
SETFUNC_NAME (STAYOPEN)
{
set_function fct;
int no_more;
#ifdef NEED__RES
if ((_res.options & RES_INIT) == 0 && res_init () == -1)
{
__set_h_errno (NETDB_INTERNAL);
return;
}
#endif /* need _res */
__libc_lock_lock (lock);
/* Cycle through the services and run their `setXXent' functions until
we find an available service. */
no_more = setup ((void **) &fct, SETFUNC_NAME_STRING, 1);
while (! no_more)
{
int is_last_nip = nip == last_nip;
enum nss_status status = (*fct) (STAYOPEN_VAR);
no_more = __nss_next (&nip, SETFUNC_NAME_STRING, (void **) &fct,
status, 0);
if (is_last_nip)
last_nip = nip;
}
#ifdef STAYOPEN_TMP
STAYOPEN_TMPVAR = STAYOPEN_VAR;
#endif
__libc_lock_unlock (lock);
}
void
ENDFUNC_NAME (void)
{
end_function fct;
int no_more;
#ifdef NEED__RES
if ((_res.options & RES_INIT) == 0 && res_init () == -1)
{
__set_h_errno (NETDB_INTERNAL);
return;
}
#endif /* need _res */
__libc_lock_lock (lock);
/* Cycle through all the services and run their endXXent functions. */
no_more = setup ((void **) &fct, ENDFUNC_NAME_STRING, 1);
while (! no_more)
{
/* Ignore status, we force check in __NSS_NEXT. */
(void) (*fct) ();
if (nip == last_nip)
/* We have processed all services which were used. */
break;
no_more = __nss_next (&nip, ENDFUNC_NAME_STRING, (void **) &fct, 0, 1);
}
last_nip = nip = NULL;
__libc_lock_unlock (lock);
}
int
INTERNAL (REENTRANT_GETNAME) (LOOKUP_TYPE *resbuf, char *buffer, size_t buflen,
LOOKUP_TYPE **result H_ERRNO_PARM)
{
get_function fct;
int no_more;
enum nss_status status;
#ifdef NEED__RES
if ((_res.options & RES_INIT) == 0 && res_init () == -1)
{
__set_h_errno (NETDB_INTERNAL);
*result = NULL;
return -1;
}
#endif /* need _res */
/* Initialize status to return if no more functions are found. */
status = NSS_STATUS_NOTFOUND;
__libc_lock_lock (lock);
/* Run through available functions, starting with the same function last
run. We will repeat each function as long as it succeeds, and then go
on to the next service action. */
no_more = setup ((void **) &fct, GETFUNC_NAME_STRING, 0);
while (! no_more)
{
int is_last_nip = nip == last_nip;
service_user *current_nip = nip;
status = (*fct) (resbuf, buffer, buflen H_ERRNO_VAR);
no_more = __nss_next (&nip, GETFUNC_NAME_STRING, (void **) &fct,
status, 0);
if (is_last_nip)
last_nip = nip;
if (! no_more && current_nip != nip)
/* Call the `setXXent' function. This wasn't done before. */
do
{
set_function sfct;
no_more = __nss_lookup (&nip, SETFUNC_NAME_STRING,
(void **) &sfct);
if (! no_more)
status = (*sfct) (STAYOPEN_TMPVAR);
else
status = NSS_STATUS_NOTFOUND;
}
while (! no_more && status != NSS_STATUS_SUCCESS);
}
__libc_lock_unlock (lock);
*result = status == NSS_STATUS_SUCCESS ? resbuf : NULL;
return status == NSS_STATUS_SUCCESS ? 0 : -1;
}
#define do_weak_alias(n1, n2) weak_alias (n1, n2)
do_weak_alias (INTERNAL (REENTRANT_GETNAME), REENTRANT_GETNAME)