1
0
mirror of https://sourceware.org/git/glibc.git synced 2025-09-02 16:01:20 +03:00

* nss/nss_files/files-network.c: Pass empty for new DB_LOOKUP args.

(DATABASE): Define this instead of DATAFILE.
	* nss/nss_files/files-hosts.c: Likewise.
	(hostbyname): Use LOOKUP_NAME macro.

	* nss/nss_db/db-XXX.c: New file.
	* nss/Makefile (services): Add db.
	(libnss_db-inhibit-o): New variable.
	(libnss_db-routines): New variable.
	(distribute): Append db-XXX.c.
	(libnss_db.so): Depend on libdb.so and libnss_files.so.
	($(libnss_db-routines:%=$(objpfx)%.c)): New static pattern rule.

	* nss/nss_files/files-XXX.c (DB_LOOKUP): Add KEYSIZE and KEYPATTERN
	args, ignored.
	(DATAFILE): New macro.
	* nss/nss_files/files-parse.c (GENERIC): If undefined, define to
	"files-XXX.c".
	* nss/nss_files/files-rpc.c: Include GENERIC instead of "files-XXX.c".
	Pass db key args to DB_LOOKUP.
	(DATAFILE): Macro removed.
	(DATABASE): New macro replaces it, lacks "/etc/" prefix.
	* nss/nss_files/files-service.c: Likewise.
	* nss/nss_files/files-pwd.c: Likewise.
	* nss/nss_files/files-proto.c: Likewise.
	* nss/nss_files/files-grp.c: Likewise.
	* nss/nss_files/files-ethers.c: Likewise.

	* elf/linux-compat.c: File removed.
	* elf/Makefile (distribute): Remove linux-compat.c.
	(ld-linux.so.1): Remove target and associated variables.

	* sunrpc/xdr.c: Remove malloc decl.
	* sunrpc/portmap.c: Likewise.

	* sunrpc/svc_tcp.c (abort): Don't declare.  Instead define as macro
	casting abort to fn returning bool_t.

	* nss/nss_files/files-parse.c [EXTERN_PARSER]: Do an extern decl of
	the parser function.
	[EXTERN_PARSER] (LINE_PARSER): Define to empty.
	* nss/nss_files/files-pwd.c (EXTERN_PARSER): Define it.
	* nss/nss_files/files-grp.c: Likewise.

	* Makeconfig (BUILD_CC): If undefined, define to $(CC).

	* sunrpc/rpc/types.h: Include stdlib.h instead of declaring malloc.

	* Makeconfig (built-program-cmd): Use $(rtld-installed-name) in place
	of ld.so so lookups for that soname find it.

	* nss/Makefile (libnss_dns.so): Depend on libresolv.so.
	(resobjdir, LDLIBS-nss_dns.so): Variables removed.
This commit is contained in:
Roland McGrath
1996-07-02 19:35:40 +00:00
parent ffee131630
commit 96bda0ea44
20 changed files with 357 additions and 123 deletions

View File

@@ -31,7 +31,7 @@ routines = nsswitch $(addsuffix -lookup,$(databases))
databases = proto service hosts network grp pwd rpc ethers
# Specify rules for the nss_* modules. We have some services.
services := files dns
services := files dns db
extra-libs = $(services:%=libnss_%)
@@ -45,12 +45,26 @@ distribute += files-XXX.c files-parse.c
libnss_dns-routines := dns-host dns-network
libnss_db-routines := $(addprefix db-,$(filter-out hosts network,\
$(databases)))
distribute += db-XXX.c
libnss_files-inhibit-o = $(filter-out .so,$(object-suffixes))
libnss_dns-inhibit-o = $(filter-out .so,$(object-suffixes))
libnss_db-inhibit-o = $(filter-out .so,$(object-suffixes))
include ../Rules
resobjdir := $(firstword $(objdir) $(patsubst ../$(subdir),.,$(..)resolv))
LDLIBS-nss_dns.so = -L$(resobjdir) -Wl,-rpath-link=$(resobjdir) -lresolv
$(objpfx)libnss_dns.so: $(firstword $(objdir) $(..)resolv)/libresolv.so
$(objpfx)libnss_db.so: $(firstword $(objdir) $(..)db)/libdb.so \
$(objpfx)libnss_files.so
$(libnss_db-routines:%=$(objpfx)%.c): $(objpfx)db-%.c: nss_files/files-%.c
@rm -f $@.new
(echo '#define EXTERN_PARSER';\
echo '#define GENERIC "../nss_db/db-XXX.c"';\
echo '#include <$<>') > $@.new
mv -f $@.new $@

203
nss/nss_db/db-XXX.c Normal file
View File

@@ -0,0 +1,203 @@
/* Common code for DB-based databases in nss_db module.
Copyright (C) 1996 Free Software Foundation, Inc.
This file is part of the GNU C Library.
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., 675 Mass Ave,
Cambridge, MA 02139, USA. */
#include <db.h>
#include <fcntl.h>
#include <libc-lock.h>
#include "nsswitch.h"
/* These symbols are defined by the including source file:
ENTNAME -- database name of the structure and functions (hostent, pwent).
STRUCTURE -- struct name, define only if not ENTNAME (passwd, group).
DATABASE -- database file name, ("hosts", "passwd")
NEED_H_ERRNO - defined iff an arg `int *herrnop' is used.
*/
#define ENTNAME_r CONCAT(ENTNAME,_r)
#include <paths.h>
#define DBFILE _PATH_VARDB DATABASE
#ifdef NEED_H_ERRNO
#define H_ERRNO_PROTO , int *herrnop
#define H_ERRNO_ARG , herrnop
#define H_ERRNO_SET(val) (*herrnop = (val))
#else
#define H_ERRNO_PROTO
#define H_ERRNO_ARG
#define H_ERRNO_SET(val) ((void) 0)
#endif
/* Locks the static variables in this file. */
__libc_lock_define_initialized (static, lock);
/* Maintenance of the shared handle open on the database. */
static DB *db;
static int keep_db;
static unsigned int entidx; /* Index for `getENTNAME'. */
/* Open database file if not already opened. */
static int
internal_setent (int stayopen)
{
int status = NSS_STATUS_SUCCESS;
if (db == NULL)
{
db = dbopen (DBFILE, O_RDONLY, 0, DB_BTREE, NULL);
if (db == NULL)
status = NSS_STATUS_UNAVAIL;
}
/* Remember STAYOPEN flag. */
if (db != NULL)
keep_db |= stayopen;
return status;
}
/* Thread-safe, exported version of that. */
int
CONCAT(_nss_files_set,ENTNAME) (int stayopen)
{
int status;
__libc_lock_lock (lock);
status = internal_setent (stayopen);
/* Reset the sequential index. */
entidx = 0;
__libc_lock_unlock (lock);
return status;
}
/* Close the database file. */
static void
internal_endent (void)
{
if (db != NULL)
{
(*db->close) (db);
db = NULL;
}
}
/* Thread-safe, exported version of that. */
int
CONCAT(_nss_files_end,ENTNAME) (void)
{
__libc_lock_lock (lock);
internal_endent ();
/* Reset STAYOPEN flag. */
keep_db = 0;
__libc_lock_unlock (lock);
return NSS_STATUS_SUCCESS;
}
/* Do a database lookup for KEY. */
static enum nss_status
lookup (const DBT *key, struct STRUCTURE *result,
void *buffer, int buflen H_ERRNO_PROTO)
{
enum nss_status status;
DBT value;
/* Open the database. */
internal_setent (keep_db);
/* Succeed iff it matches a value that parses correctly. */
status = (((*db->get) (db, key, &value, 0) == 0 &&
parse_line (value.data, result, buffer, buflen) == 0)
? NSS_STATUS_SUCCESS : NSS_STATUS_NOTFOUND);
if (! keep_db)
internal_endent ();
return status;
}
/* Macro for defining lookup functions for this DB-based database.
NAME is the name of the lookup; e.g. `pwnam'.
KEYPATTERN gives `printf' args to construct a key string;
e.g. `(".%s", name)'.
KEYSIZE gives the allocation size of a buffer to construct it in;
e.g. `1 + strlen (name)'.
PROTO describes the arguments for the lookup key;
e.g. `const char *name'.
BREAK_IF_MATCH is ignored, but used by ../nss_files/files-XXX.c. */
#define DB_LOOKUP(name, keysize, keypattern, break_if_match, proto...) \
enum nss_status \
_nss_files_get##name##_r (proto, \
struct STRUCTURE *result, \
char *buffer, int buflen H_ERRNO_PROTO) \
{ \
DBT key; \
enum nss_status status; \
const size_t size = (keysize); \
key.data = __alloca (size); \
key.size = KEYPRINTF keypattern; \
__libc_lock_lock (lock); \
status = lookup (&key, result, buffer, buflen H_ERRNO_ARG); \
__libc_lock_unlock (lock); \
return status; \
}
#define KEYPRINTF(pattern, args...) snprintf (key.data, size, pattern ,##args)
/* Return the next entry from the database file, doing locking. */
enum nss_status
CONCAT(_nss_files_get,ENTNAME_r) (struct STRUCTURE *result,
char *buffer, int buflen H_ERRNO_PROTO)
{
/* Return next entry in host file. */
enum nss_status status;
char buf[20];
DBT key;
__libc_lock_lock (lock);
key.size = 1 + snprintf (key.data = buf, sizeof buf, "0%u", entidx++);
status = lookup (&key, result, buffer, buflen H_ERRNO_ARG);
__libc_lock_unlock (lock);
return status;
}

View File

@@ -27,13 +27,15 @@ Cambridge, MA 02139, USA. */
ENTNAME -- database name of the structure and functions (hostent, pwent).
STRUCTURE -- struct name, define only if not ENTNAME (passwd, group).
DATAFILE -- string of the database file's name.
DATABASE -- string of the database file's name ("hosts", "passwd").
NEED_H_ERRNO - defined iff an arg `int *herrnop' is used.
MIDLINE_COMMENTS - defined iff # before \n terminates a database line.
*/
#define ENTNAME_r CONCAT(ENTNAME,_r)
#define ENTNAME_r CONCAT(ENTNAME,_r)
#define DATAFILE "/etc/" DATABASE
#ifdef NEED_H_ERRNO
#define H_ERRNO_PROTO , int *herrnop
@@ -194,13 +196,15 @@ CONCAT(_nss_files_get,ENTNAME_r) (struct STRUCTURE *result,
NAME is the name of the lookup; e.g. `hostbyname'.
KEYSIZE and KEYPATTERN are ignored here but used by ../nss_db/db-XXX.c.
PROTO describes the arguments for the lookup key;
e.g. `const char *hostname'.
BREAK_IF_MATCH is a block of code which compares `struct STRUCTURE *result'
to the lookup key arguments and does `break;' if they match. */
#define DB_LOOKUP(name, break_if_match, proto...) \
#define DB_LOOKUP(name, keysize, keypattern, break_if_match, proto...) \
enum nss_status \
_nss_files_get##name##_r (proto, \
struct STRUCTURE *result, \

View File

@@ -30,7 +30,7 @@ struct etherent
struct etherent_data {};
#define ENTNAME etherent
#define DATAFILE "/etc/ethers"
#define DATABASE "ethers"
#include "files-parse.c"
LINE_PARSER
("#",
@@ -56,15 +56,16 @@ LINE_PARSER
)
#include "files-XXX.c"
#include GENERIC
DB_LOOKUP (hostton,
DB_LOOKUP (hostton, 1 + strlen (name), (".%s", name),
{
if (strcmp (result->e_name, name) == 0)
break;
}, const char *name)
DB_LOOKUP (ntohost,
DB_LOOKUP (ntohost, 7, ("=%c%c%c%c%c%c",
addr[0], addr[1], addr[2], addr[3], addr[4], addr[5]),
{
if (memcmp (&result->e_addr, addr,
sizeof (struct ether_addr)) == 0)

View File

@@ -21,26 +21,22 @@ Cambridge, MA 02139, USA. */
#define STRUCTURE group
#define ENTNAME grent
#define DATAFILE "/etc/group"
#define DATABASE "group"
struct grent_data {};
#define TRAILING_LIST_MEMBER gr_mem
#define TRAILING_LIST_SEPARATOR_P(c) ((c) == ',')
#include "files-parse.c"
/* Our parser function is already defined in fgetgrent.c, so use that.
to parse lines from the database file. */
extern int parse_line (char *line, struct STRUCTURE *result,
void *buffer, int buflen);
#define EXTERN_PARSER
#include "files-parse.c"
#include GENERIC
#include "files-XXX.c"
DB_LOOKUP (grnam,
DB_LOOKUP (grnam, 1 + strlen (name), (".%s", name),
{
if (! strcmp (name, result->gr_name))
break;
}, const char *name)
DB_LOOKUP (grgid,
DB_LOOKUP (grgid, 20, ("=%lu", (unsigned long int) gid),
{
if (result->gr_gid == gid)
break;

View File

@@ -30,7 +30,7 @@ Cambridge, MA 02139, USA. */
#define ENTNAME hostent
#define DATAFILE _PATH_HOSTS
#define DATABASE "hosts"
#define ENTDATA hostent_data
struct hostent_data
@@ -93,19 +93,11 @@ LINE_PARSER
#include "files-XXX.c"
DB_LOOKUP (hostbyname,
{
char **ap;
if (! strcmp (name, result->h_name))
break;
for (ap = result->h_aliases; *ap; ++ap)
if (! strcmp (name, *ap))
break;
if (*ap)
break;
}, const char *name)
DB_LOOKUP (hostbyname, ,,
LOOKUP_NAME (h_name, h_aliases),
const char *name)
DB_LOOKUP (hostbyaddr,
DB_LOOKUP (hostbyaddr, ,,
{
if (result->h_addrtype == type && result->h_length == len &&
! memcmp (addr, result->h_addr_list[0], len))

View File

@@ -22,7 +22,7 @@ Cambridge, MA 02139, USA. */
#include <netdb.h>
#define ENTNAME netent
#define DATAFILE _PATH_NETWORKS
#define DATABASE "networks"
struct netent_data {};
@@ -43,11 +43,11 @@ LINE_PARSER
#include "files-XXX.c"
DB_LOOKUP (netbyname,
DB_LOOKUP (netbyname, ,,
LOOKUP_NAME (n_name, n_aliases),
const char *name)
DB_LOOKUP (netbyaddr,
DB_LOOKUP (netbyaddr, ,,
{
if (result->n_addrtype == type && result->n_net == net)
/* Bingo! */

View File

@@ -52,6 +52,19 @@ struct parser_data
#define parse_line CONCAT(_nss_files_parse_,ENTNAME)
#endif
#ifdef EXTERN_PARSER
/* The parser is defined in a different module. */
extern int parse_line (char *line, struct STRUCTURE *result,
struct parser_data *data, int datalen);
#define LINE_PARSER(EOLSET, BODY) /* Do nothing */
#else
/* Define a line parsing function. */
#define LINE_PARSER(EOLSET, BODY) \
parser_stclass int \
parse_line (char *line, struct STRUCTURE *result, \
@@ -167,6 +180,9 @@ parse_list (char *line, struct parser_data *data, int datalen)
return list;
}
#endif /* EXTERN_PARSER */
#define LOOKUP_NAME(nameelt, aliaselt) \
{ \
char **ap; \
@@ -180,3 +196,8 @@ parse_list (char *line, struct parser_data *data, int datalen)
}
#endif
/* This is defined by db-*.c to include "../nss_db/db-XXX.c" instead. */
#ifndef GENERIC
#define GENERIC "files-XXX.c"
#endif

View File

@@ -21,7 +21,7 @@ Cambridge, MA 02139, USA. */
#define ENTNAME protoent
#define DATAFILE _PATH_PROTOCOLS
#define DATABASE "protocols"
struct protoent_data {};
@@ -34,13 +34,13 @@ LINE_PARSER
INT_FIELD (result->p_proto, isspace, 1, 10,);
)
#include "files-XXX.c"
#include GENERIC
DB_LOOKUP (protobyname,
DB_LOOKUP (protobyname, 1 + strlen (name), (".%s", name),
LOOKUP_NAME (p_name, p_aliases),
const char *name)
DB_LOOKUP (protobynumber,
DB_LOOKUP (protobynumber, 20, ("=%d", proto),
{
if (result->p_proto == proto)
break;

View File

@@ -21,24 +21,22 @@ Cambridge, MA 02139, USA. */
#define STRUCTURE passwd
#define ENTNAME pwent
#define DATAFILE "/etc/passwd"
#define DATABASE "passwd"
struct pwent_data {};
#include "files-parse.c"
/* Our parser function is already defined in fgetpwent.c, so use that.
/* Our parser function is already defined in fgetpwent.c, so use that
to parse lines from the database file. */
extern int parse_line (char *line, struct STRUCTURE *result,
void *buffer, int buflen);
#define EXTERN_PARSER
#include "files-parse.c"
#include GENERIC
#include "files-XXX.c"
DB_LOOKUP (pwnam,
DB_LOOKUP (pwnam, 1 + strlen (name), (".%s", name),
{
if (! strcmp (name, result->pw_name))
break;
}, const char *name)
DB_LOOKUP (pwuid,
DB_LOOKUP (pwuid, 20, ("=%lu", (unsigned long int) uid),
{
if (result->pw_uid == uid)
break;

View File

@@ -21,7 +21,7 @@ Cambridge, MA 02139, USA. */
#define ENTNAME rpcent
#define DATAFILE "/etc/rpc"
#define DATABASE "rpc"
struct rpcent_data {};
@@ -34,13 +34,13 @@ LINE_PARSER
INT_FIELD (result->r_number, isspace, 1, 10,);
)
#include "files-XXX.c"
#include GENERIC
DB_LOOKUP (rpcbyname,
DB_LOOKUP (rpcbyname, 1 + strlen (name), (".%s", name),
LOOKUP_NAME (r_name, r_aliases),
const char *name)
DB_LOOKUP (rpcbynumber,
DB_LOOKUP (rpcbynumber, 20, ("=%d", number),
{
if (result->r_number == number)
break;

View File

@@ -22,7 +22,7 @@ Cambridge, MA 02139, USA. */
#define ENTNAME servent
#define DATAFILE _PATH_SERVICES
#define DATABASE "services"
struct servent_data {};
@@ -37,13 +37,13 @@ LINE_PARSER
STRING_FIELD (result->s_proto, isspace, 1);
)
#include "files-XXX.c"
#include GENERIC
DB_LOOKUP (servbyname,
DB_LOOKUP (servbyname, 1 + strlen (name), (".%s", name),
LOOKUP_NAME (s_name, s_aliases),
const char *name)
DB_LOOKUP (servbyport,
DB_LOOKUP (servbyport, 20, ("=%d", port),
{
if (result->s_port == port)
break;