glibc/nss/getXXbyYY_r.c
Roland McGrath adc6ff7f81 Thu Jul 11 20:09:55 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu>
* nss/nss_files/files-service.c (getservbyname): Take second arg PROTO
	and check it.

	* nss/nss_files/files-XXX.c: Comment fix.

Fri Jul 12 01:28:35 1996  Ulrich Drepper  <drepper@cygnus.com>

	* nss/getXXent_r.c (GETFUNC_NAME_STRING): Define with name
	of reentrant function.
	(setup): Pass additional argument with function name we are
	looking for.
	(SETFUNC_NAME, ENDFUNC_NAME, GETFUNC_NAME): Call setup with
	new argument {SET,END,GET}FUNC_NAME_STRING.

	* nss/getXXent.c (GETFUNC_NAME): RESULT must be static because
	we return a pointer.

Thu Jul 11 18:20:44 1996  Roland McGrath  <roland@delasyd.gnu.ai.mit.edu>

	* nss/nss_files/files-parse.c: Add comment about things to #define.

	* nss/nss_files/files-hosts.c (NEED_H_ERRNO): Define it.

	* nss/nss_files/files-parse.c (STRING_FIELD): Don't flag NUL before
	terminator char as an error.

	* nss/getXXbyYY_r.c (REENTRANT_NAME): Set *H_ERRNOP, not h_errno.

Thu Jul 11 03:21:10 1996  Ulrich Drepper  <drepper@cygnus.com>

	* catgets/gencat.c (write_out): Move code to determine new
	best size out of inner loop.

Wed Jul 10 05:24:40 1996  David Mosberger-Tang  <davidm@azstarnet.com>

	* misc/mntent.c: Include <sys/types.h>.
	(endmntent): Return 1 one success, 0 on failure.
	(getmntent): Chop newline and ignore empty lines.

Mon Jul  8 21:18:40 1996  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* sysdeps/m68k/dl-machine.h (RESOLVE): New macro, defined
	differently based on [RTLD_BOOTSTRAP].
	(elf_machine_rela): Use it instead of the fn ptr arg directly.
1996-07-12 00:20:03 +00:00

131 lines
4.1 KiB
C

/* 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 "nsswitch.h"
/*******************************************************************\
|* Here we assume several symbols to be defined: *|
|* *|
|* LOOKUP_TYPE - the return type of the function *|
|* *|
|* FUNCTION_NAME - name of the non-reentrant function *|
|* *|
|* DATABASE_NAME - name of the database the function accesses *|
|* (e.g., host, services, ...) *|
|* *|
|* ADD_PARAMS - additional parameter, can vary in number *|
|* *|
|* ADD_VARIABLES - names of additional parameter *|
|* *|
|* Optionally the following vars can be defined: *|
|* *|
|* NEED_H_ERRNO - an extra parameter will be passed to point to *|
|* the global `h_errno' variable. *|
|* *|
|* NEED__RES - the global _res variable might be used so we *|
|* will have to initialize it if necessary *|
|* *|
\*******************************************************************/
/* To make the real sources a bit prettier. */
#define REENTRANT_NAME APPEND_R (FUNCTION_NAME)
#define APPEND_R(name) APPEND_R1 (name)
#define APPEND_R1(name) name##_r
#define FUNCTION_NAME_STRING STRINGIZE (FUNCTION_NAME)
#define REENTRANT_NAME_STRING STRINGIZE (REENTRANT_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_errnop
#else
# define H_ERRNO_PARM
# define H_ERRNO_VAR
#endif
/* Type of the lookup function we need here. */
typedef int (*lookup_function) (ADD_PARAMS, LOOKUP_TYPE *, char *, int
H_ERRNO_PARM);
/* Some usages of this file might use this variable. */
extern struct __res_state _res;
/* The lookup function for the first entry of this service. */
extern int DB_LOOKUP_FCT (service_user **nip, const char *name, void **fctp);
LOOKUP_TYPE *
REENTRANT_NAME (ADD_PARAMS, LOOKUP_TYPE *result, char *buffer, int buflen
H_ERRNO_PARM)
{
static service_user *startp = NULL;
static lookup_function start_fct;
service_user *nip;
lookup_function fct;
int no_more;
enum nss_status status = NSS_STATUS_UNAVAIL;
if (startp == NULL)
{
no_more = DB_LOOKUP_FCT (&nip, REENTRANT_NAME_STRING, (void **) &fct);
if (no_more)
startp = (service_user *) -1;
else
{
startp = nip;
start_fct = fct;
#ifdef NEED__RES
/* The resolver code will really be used so we have to
initialize it. */
if ((_res.options & RES_INIT) == 0 && res_init () == -1)
{
*h_errnop = NETDB_INTERNAL;
return NULL;
}
#endif /* need _res */
}
}
else
{
fct = start_fct;
no_more = (nip = startp) == (service_user *) -1;
}
while (no_more == 0)
{
status = (*fct) (ADD_VARIABLES, result, buffer, buflen H_ERRNO_VAR);
no_more = __nss_next (&nip, REENTRANT_NAME_STRING,
(void **) &fct, status, 0);
}
return status == NSS_STATUS_SUCCESS ? result : NULL;
}