mirror of
git://sourceware.org/git/glibc.git
synced 2026-09-09 05:59:27 +08:00
Compare commits
8
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
319a7e32fc | ||
|
|
bf0041b252 | ||
|
|
9d45607d86 | ||
|
|
977f5ffca9 | ||
|
|
36b6bee240 | ||
|
|
d8af48b1d7 | ||
|
|
a4f0631ace | ||
|
|
8b6e0566f5 |
@@ -26,6 +26,8 @@
|
||||
#include <string.h>
|
||||
#include <sys/param.h>
|
||||
|
||||
NSS_DECLARE_MODULE_FUNCTIONS (hesiod)
|
||||
|
||||
/* Get the declaration of the parser function. */
|
||||
#define ENTNAME grent
|
||||
#define STRUCTURE group
|
||||
|
||||
@@ -25,6 +25,8 @@
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
NSS_DECLARE_MODULE_FUNCTIONS (hesiod)
|
||||
|
||||
/* Declare a parser for Hesiod protocol entries. Although the format
|
||||
of the entries is identical to those in /etc/protocols, here is no
|
||||
predefined parser for us to use. */
|
||||
|
||||
@@ -24,6 +24,8 @@
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
NSS_DECLARE_MODULE_FUNCTIONS (hesiod)
|
||||
|
||||
/* Get the declaration of the parser function. */
|
||||
#define ENTNAME pwent
|
||||
#define STRUCTURE passwd
|
||||
|
||||
@@ -25,6 +25,8 @@
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
NSS_DECLARE_MODULE_FUNCTIONS (hesiod)
|
||||
|
||||
/* Hesiod uses a format for service entries that differs from the
|
||||
traditional format. We therefore declare our own parser. */
|
||||
|
||||
|
||||
@@ -23,6 +23,7 @@
|
||||
|
||||
#include "nsswitch.h"
|
||||
|
||||
NSS_DECLARE_MODULE_FUNCTIONS (nisplus)
|
||||
|
||||
/* Convert NIS+ error number to NSS error number. */
|
||||
extern const enum nss_status __niserr2nss_tab[] attribute_hidden;
|
||||
|
||||
+5
-18
@@ -33,19 +33,6 @@
|
||||
#include "nscd.h"
|
||||
|
||||
|
||||
typedef enum nss_status (*nss_gethostbyname4_r)
|
||||
(const char *name, struct gaih_addrtuple **pat,
|
||||
char *buffer, size_t buflen, int *errnop,
|
||||
int *h_errnop, int32_t *ttlp);
|
||||
typedef enum nss_status (*nss_gethostbyname3_r)
|
||||
(const char *name, int af, struct hostent *host,
|
||||
char *buffer, size_t buflen, int *errnop,
|
||||
int *h_errnop, int32_t *, char **);
|
||||
typedef enum nss_status (*nss_getcanonname_r)
|
||||
(const char *name, char *buffer, size_t buflen, char **result,
|
||||
int *errnop, int *h_errnop);
|
||||
|
||||
|
||||
static const ai_response_header notfound =
|
||||
{
|
||||
.version = NSCD_VERSION,
|
||||
@@ -127,8 +114,8 @@ addhstaiX (struct database_dyn *db, int fd, request_header *req,
|
||||
char *canon = NULL;
|
||||
size_t canonlen;
|
||||
|
||||
nss_gethostbyname4_r fct4 = __nss_lookup_function (nip,
|
||||
"gethostbyname4_r");
|
||||
nss_gethostbyname4_r *fct4 = __nss_lookup_function (nip,
|
||||
"gethostbyname4_r");
|
||||
if (fct4 != NULL)
|
||||
{
|
||||
struct gaih_addrtuple atmem;
|
||||
@@ -212,8 +199,8 @@ addhstaiX (struct database_dyn *db, int fd, request_header *req,
|
||||
{
|
||||
/* Prefer the function which also returns the TTL and
|
||||
canonical name. */
|
||||
nss_gethostbyname3_r fct = __nss_lookup_function (nip,
|
||||
"gethostbyname3_r");
|
||||
nss_gethostbyname3_r *fct
|
||||
= __nss_lookup_function (nip, "gethostbyname3_r");
|
||||
if (fct == NULL)
|
||||
fct = __nss_lookup_function (nip, "gethostbyname2_r");
|
||||
|
||||
@@ -279,7 +266,7 @@ addhstaiX (struct database_dyn *db, int fd, request_header *req,
|
||||
if (canon == NULL)
|
||||
{
|
||||
/* Determine the canonical name. */
|
||||
nss_getcanonname_r cfct;
|
||||
nss_getcanonname_r *cfct;
|
||||
cfct = __nss_lookup_function (nip, "getcanonname_r");
|
||||
if (cfct != NULL)
|
||||
{
|
||||
|
||||
@@ -19,10 +19,12 @@
|
||||
and for implementors of new services. */
|
||||
|
||||
#ifndef _NSS_H
|
||||
#define _NSS_H 1
|
||||
#define _NSS_H 1
|
||||
|
||||
#include <features.h>
|
||||
#include <stddef.h>
|
||||
#include <stdint.h>
|
||||
#include <sys/types.h>
|
||||
|
||||
|
||||
__BEGIN_DECLS
|
||||
@@ -56,7 +58,204 @@ struct gaih_addrtuple
|
||||
Attention: Using this function repeatedly will slowly eat up the
|
||||
whole memory since previous selection data cannot be freed. */
|
||||
extern int __nss_configure_lookup (const char *__dbname,
|
||||
const char *__string) __THROW;
|
||||
const char *__string) __THROW;
|
||||
|
||||
/* NSS-related types. */
|
||||
struct __netgrent;
|
||||
struct aliasent;
|
||||
struct ether_addr;
|
||||
struct etherent;
|
||||
struct group;
|
||||
struct hostent;
|
||||
struct netent;
|
||||
struct passwd;
|
||||
struct protoent;
|
||||
struct rpcent;
|
||||
struct servent;
|
||||
struct sgrp;
|
||||
struct spwd;
|
||||
struct traced_file;
|
||||
|
||||
/* Types of functions exported from NSS service modules. */
|
||||
typedef enum nss_status nss_endaliasent (void);
|
||||
typedef enum nss_status nss_endetherent (void);
|
||||
typedef enum nss_status nss_endgrent (void);
|
||||
typedef enum nss_status nss_endhostent (void);
|
||||
typedef enum nss_status nss_endnetent (void);
|
||||
typedef enum nss_status nss_endnetgrent (struct __netgrent *);
|
||||
typedef enum nss_status nss_endprotoent (void);
|
||||
typedef enum nss_status nss_endpwent (void);
|
||||
typedef enum nss_status nss_endrpcent (void);
|
||||
typedef enum nss_status nss_endservent (void);
|
||||
typedef enum nss_status nss_endsgent (void);
|
||||
typedef enum nss_status nss_endspent (void);
|
||||
typedef enum nss_status nss_getaliasbyname_r (const char *, struct aliasent *,
|
||||
char *, size_t, int *);
|
||||
typedef enum nss_status nss_getaliasent_r (struct aliasent *,
|
||||
char *, size_t, int *);
|
||||
typedef enum nss_status nss_getcanonname_r (const char *, char *, size_t,
|
||||
char **, int *, int *);
|
||||
typedef enum nss_status nss_getetherent_r (struct etherent *,
|
||||
char *, size_t, int *);
|
||||
typedef enum nss_status nss_getgrent_r (struct group *, char *, size_t, int *);
|
||||
typedef enum nss_status nss_getgrgid_r (__gid_t, struct group *,
|
||||
char *, size_t, int *);
|
||||
typedef enum nss_status nss_getgrnam_r (const char *, struct group *,
|
||||
char *, size_t, int *);
|
||||
typedef enum nss_status nss_gethostbyaddr2_r (const void *, __socklen_t, int,
|
||||
struct hostent *, char *, size_t,
|
||||
int *, int *, int32_t *);
|
||||
typedef enum nss_status nss_gethostbyaddr_r (const void *, __socklen_t, int,
|
||||
struct hostent *, char *, size_t,
|
||||
int *, int *);
|
||||
typedef enum nss_status nss_gethostbyname2_r (const char *, int,
|
||||
struct hostent *, char *, size_t,
|
||||
int *, int *);
|
||||
typedef enum nss_status nss_gethostbyname3_r (const char *, int,
|
||||
struct hostent *, char *, size_t,
|
||||
int *, int *, int32_t *,
|
||||
char **);
|
||||
typedef enum nss_status nss_gethostbyname4_r (const char *,
|
||||
struct gaih_addrtuple **,
|
||||
char *, size_t,
|
||||
int *, int *, int32_t *);
|
||||
typedef enum nss_status nss_gethostbyname_r (const char *, struct hostent *,
|
||||
char *, size_t, int *, int *);
|
||||
typedef enum nss_status nss_gethostent_r (struct hostent *, char *, size_t,
|
||||
int *, int *);
|
||||
typedef enum nss_status nss_gethostton_r (const char *, struct etherent *,
|
||||
char *, size_t, int *);
|
||||
typedef enum nss_status nss_getnetbyaddr_r (uint32_t, int, struct netent *,
|
||||
char *, size_t, int *, int *);
|
||||
typedef enum nss_status nss_getnetbyname_r (const char *, struct netent *,
|
||||
char *, size_t, int *, int *);
|
||||
typedef enum nss_status nss_getnetent_r (struct netent *,
|
||||
char *, size_t, int *, int *);
|
||||
typedef enum nss_status nss_getnetgrent_r (struct __netgrent *,
|
||||
char *, size_t, int *);
|
||||
typedef enum nss_status nss_getntohost_r (const struct ether_addr *,
|
||||
struct etherent *, char *, size_t,
|
||||
int *);
|
||||
typedef enum nss_status nss_getprotobyname_r (const char *, struct protoent *,
|
||||
char *, size_t, int *);
|
||||
typedef enum nss_status nss_getprotobynumber_r (int, struct protoent *,
|
||||
char *, size_t, int *);
|
||||
typedef enum nss_status nss_getprotoent_r (struct protoent *,
|
||||
char *, size_t, int *);
|
||||
typedef enum nss_status nss_getpublickey (const char *, char *, int *);
|
||||
typedef enum nss_status nss_getpwent_r (struct passwd *,
|
||||
char *, size_t, int *);
|
||||
typedef enum nss_status nss_getpwnam_r (const char *, struct passwd *,
|
||||
char *, size_t, int *);
|
||||
typedef enum nss_status nss_getpwuid_r (__uid_t, struct passwd *,
|
||||
char *, size_t, int *);
|
||||
typedef enum nss_status nss_getrpcbyname_r (const char *, struct rpcent *,
|
||||
char *, size_t, int *);
|
||||
typedef enum nss_status nss_getrpcbynumber_r (int, struct rpcent *,
|
||||
char *, size_t, int *);
|
||||
typedef enum nss_status nss_getrpcent_r (struct rpcent *,
|
||||
char *, size_t, int *);
|
||||
typedef enum nss_status nss_getsecretkey (const char *, char *, char *, int *);
|
||||
typedef enum nss_status nss_getservbyname_r (const char *, const char *,
|
||||
struct servent *, char *, size_t,
|
||||
int *);
|
||||
typedef enum nss_status nss_getservbyport_r (int, const char *,
|
||||
struct servent *, char *, size_t,
|
||||
int *);
|
||||
typedef enum nss_status nss_getservent_r (struct servent *, char *, size_t,
|
||||
int *);
|
||||
typedef enum nss_status nss_getsgent_r (struct sgrp *, char *, size_t, int *);
|
||||
typedef enum nss_status nss_getsgnam_r (const char *, struct sgrp *,
|
||||
char *, size_t, int *);
|
||||
typedef enum nss_status nss_getspent_r (struct spwd *, char *, size_t, int *);
|
||||
typedef enum nss_status nss_getspnam_r (const char *, struct spwd *,
|
||||
char *, size_t, int *);
|
||||
typedef void nss_init (void (*) (size_t, struct traced_file *));
|
||||
typedef enum nss_status nss_initgroups_dyn (const char *, __gid_t, long int *,
|
||||
long int *, __gid_t **, long int,
|
||||
int *);
|
||||
typedef enum nss_status nss_netname2user (char [], __uid_t *, __gid_t *,
|
||||
int *, __gid_t *, int *);
|
||||
typedef enum nss_status nss_setaliasent (void);
|
||||
typedef enum nss_status nss_setetherent (int);
|
||||
typedef enum nss_status nss_setgrent (int);
|
||||
typedef enum nss_status nss_sethostent (int);
|
||||
typedef enum nss_status nss_setnetent (int);
|
||||
typedef enum nss_status nss_setnetgrent (const char *, struct __netgrent *);
|
||||
typedef enum nss_status nss_setprotoent (int);
|
||||
typedef enum nss_status nss_setpwent (int);
|
||||
typedef enum nss_status nss_setrpcent (int);
|
||||
typedef enum nss_status nss_setservent (int);
|
||||
typedef enum nss_status nss_setsgent (int);
|
||||
typedef enum nss_status nss_setspent (int);
|
||||
|
||||
/* Declare all NSS functions for MODULE. */
|
||||
#define NSS_DECLARE_MODULE_FUNCTIONS(module) \
|
||||
extern nss_endaliasent _nss_##module##_endaliasent; \
|
||||
extern nss_endetherent _nss_##module##_endetherent; \
|
||||
extern nss_endgrent _nss_##module##_endgrent; \
|
||||
extern nss_endhostent _nss_##module##_endhostent; \
|
||||
extern nss_endnetent _nss_##module##_endnetent; \
|
||||
extern nss_endnetgrent _nss_##module##__endnetgrent; \
|
||||
extern nss_endprotoent _nss_##module##_endprotoent; \
|
||||
extern nss_endpwent _nss_##module##_endpwent; \
|
||||
extern nss_endrpcent _nss_##module##_endrpcent; \
|
||||
extern nss_endservent _nss_##module##_endservent; \
|
||||
extern nss_endsgent _nss_##module##_endsgent; \
|
||||
extern nss_endspent _nss_##module##_endspent; \
|
||||
extern nss_getaliasbyname_r _nss_##module##_getaliasbyname_r; \
|
||||
extern nss_getaliasent_r _nss_##module##_getaliasent_r; \
|
||||
extern nss_getcanonname_r _nss_##module##_getcanonname_r; \
|
||||
extern nss_getetherent_r _nss_##module##_getetherent_r; \
|
||||
extern nss_getgrent_r _nss_##module##_getgrent_r; \
|
||||
extern nss_getgrgid_r _nss_##module##_getgrgid_r; \
|
||||
extern nss_getgrnam_r _nss_##module##_getgrnam_r; \
|
||||
extern nss_gethostbyaddr2_r _nss_##module##_gethostbyaddr2_r; \
|
||||
extern nss_gethostbyaddr_r _nss_##module##_gethostbyaddr_r; \
|
||||
extern nss_gethostbyname2_r _nss_##module##_gethostbyname2_r; \
|
||||
extern nss_gethostbyname3_r _nss_##module##_gethostbyname3_r; \
|
||||
extern nss_gethostbyname4_r _nss_##module##_gethostbyname4_r; \
|
||||
extern nss_gethostbyname_r _nss_##module##_gethostbyname_r; \
|
||||
extern nss_gethostent_r _nss_##module##_gethostent_r; \
|
||||
extern nss_gethostton_r _nss_##module##_gethostton_r; \
|
||||
extern nss_getnetbyaddr_r _nss_##module##_getnetbyaddr_r; \
|
||||
extern nss_getnetbyname_r _nss_##module##_getnetbyname_r; \
|
||||
extern nss_getnetent_r _nss_##module##_getnetent_r; \
|
||||
extern nss_getnetgrent_r _nss_##module##_getnetgrent_r; \
|
||||
extern nss_getntohost_r _nss_##module##_getntohost_r; \
|
||||
extern nss_getprotobyname_r _nss_##module##_getprotobyname_r; \
|
||||
extern nss_getprotobynumber_r _nss_##module##_getprotobynumber_r; \
|
||||
extern nss_getprotoent_r _nss_##module##_getprotoent_r; \
|
||||
extern nss_getpublickey _nss_##module##_getpublickey; \
|
||||
extern nss_getpwent_r _nss_##module##_getpwent_r; \
|
||||
extern nss_getpwnam_r _nss_##module##_getpwnam_r; \
|
||||
extern nss_getpwuid_r _nss_##module##_getpwuid_r; \
|
||||
extern nss_getrpcbyname_r _nss_##module##_getrpcbyname_r; \
|
||||
extern nss_getrpcbynumber_r _nss_##module##_getrpcbynumber_r; \
|
||||
extern nss_getrpcent_r _nss_##module##_getrpcent_r; \
|
||||
extern nss_getsecretkey _nss_##module##_getsecretkey; \
|
||||
extern nss_getservbyname_r _nss_##module##_getservbyname_r; \
|
||||
extern nss_getservbyport_r _nss_##module##_getservbyport_r; \
|
||||
extern nss_getservent_r _nss_##module##_getservent_r; \
|
||||
extern nss_getsgent_r _nss_##module##_getsgent_r; \
|
||||
extern nss_getsgnam_r _nss_##module##_getsgnam_r; \
|
||||
extern nss_getspent_r _nss_##module##_getspent_r; \
|
||||
extern nss_getspnam_r _nss_##module##_getspnam_r; \
|
||||
extern nss_init _nss_##module##_init; \
|
||||
extern nss_initgroups_dyn _nss_##module##_initgroups_dyn; \
|
||||
extern nss_netname2user _nss_##module##_netname2user; \
|
||||
extern nss_setaliasent _nss_##module##_setaliasent; \
|
||||
extern nss_setetherent _nss_##module##_setetherent; \
|
||||
extern nss_setgrent _nss_##module##_setgrent; \
|
||||
extern nss_sethostent _nss_##module##_sethostent; \
|
||||
extern nss_setnetent _nss_##module##_setnetent; \
|
||||
extern nss_setnetgrent _nss_##module##_setnetgrent; \
|
||||
extern nss_setprotoent _nss_##module##_setprotoent; \
|
||||
extern nss_setpwent _nss_##module##_setpwent; \
|
||||
extern nss_setrpcent _nss_##module##_setrpcent; \
|
||||
extern nss_setservent _nss_##module##_setservent; \
|
||||
extern nss_setsgent _nss_##module##_setsgent; \
|
||||
extern nss_setspent _nss_##module##_setspent; \
|
||||
|
||||
__END_DECLS
|
||||
|
||||
|
||||
+29
-27
@@ -27,17 +27,19 @@
|
||||
#include <libc-lock.h>
|
||||
#include <kernel-features.h>
|
||||
|
||||
NSS_DECLARE_MODULE_FUNCTIONS (compat)
|
||||
|
||||
static service_user *ni;
|
||||
static enum nss_status (*nss_setgrent) (int stayopen);
|
||||
static enum nss_status (*nss_getgrnam_r) (const char *name,
|
||||
struct group * grp, char *buffer,
|
||||
size_t buflen, int *errnop);
|
||||
static enum nss_status (*nss_getgrgid_r) (gid_t gid, struct group * grp,
|
||||
char *buffer, size_t buflen,
|
||||
int *errnop);
|
||||
static enum nss_status (*nss_getgrent_r) (struct group * grp, char *buffer,
|
||||
size_t buflen, int *errnop);
|
||||
static enum nss_status (*nss_endgrent) (void);
|
||||
static enum nss_status (*setgrent_impl) (int stayopen);
|
||||
static enum nss_status (*getgrnam_r_impl) (const char *name,
|
||||
struct group * grp, char *buffer,
|
||||
size_t buflen, int *errnop);
|
||||
static enum nss_status (*getgrgid_r_impl) (gid_t gid, struct group * grp,
|
||||
char *buffer, size_t buflen,
|
||||
int *errnop);
|
||||
static enum nss_status (*getgrent_r_impl) (struct group * grp, char *buffer,
|
||||
size_t buflen, int *errnop);
|
||||
static enum nss_status (*endgrent_impl) (void);
|
||||
|
||||
/* Get the declaration of the parser function. */
|
||||
#define ENTNAME grent
|
||||
@@ -80,11 +82,11 @@ init_nss_interface (void)
|
||||
{
|
||||
if (__nss_database_lookup2 ("group_compat", NULL, "nis", &ni) >= 0)
|
||||
{
|
||||
nss_setgrent = __nss_lookup_function (ni, "setgrent");
|
||||
nss_getgrnam_r = __nss_lookup_function (ni, "getgrnam_r");
|
||||
nss_getgrgid_r = __nss_lookup_function (ni, "getgrgid_r");
|
||||
nss_getgrent_r = __nss_lookup_function (ni, "getgrent_r");
|
||||
nss_endgrent = __nss_lookup_function (ni, "endgrent");
|
||||
setgrent_impl = __nss_lookup_function (ni, "setgrent");
|
||||
getgrnam_r_impl = __nss_lookup_function (ni, "getgrnam_r");
|
||||
getgrgid_r_impl = __nss_lookup_function (ni, "getgrgid_r");
|
||||
getgrent_r_impl = __nss_lookup_function (ni, "getgrent_r");
|
||||
endgrent_impl = __nss_lookup_function (ni, "endgrent");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -117,8 +119,8 @@ internal_setgrent (ent_t *ent, int stayopen, int needent)
|
||||
else
|
||||
rewind (ent->stream);
|
||||
|
||||
if (needent && status == NSS_STATUS_SUCCESS && nss_setgrent)
|
||||
ent->setent_status = nss_setgrent (stayopen);
|
||||
if (needent && status == NSS_STATUS_SUCCESS && setgrent_impl)
|
||||
ent->setent_status = setgrent_impl (stayopen);
|
||||
|
||||
return status;
|
||||
}
|
||||
@@ -170,8 +172,8 @@ _nss_compat_endgrent (void)
|
||||
|
||||
__libc_lock_lock (lock);
|
||||
|
||||
if (nss_endgrent)
|
||||
nss_endgrent ();
|
||||
if (endgrent_impl)
|
||||
endgrent_impl ();
|
||||
|
||||
result = internal_endgrent (&ext_ent);
|
||||
|
||||
@@ -185,7 +187,7 @@ static enum nss_status
|
||||
getgrent_next_nss (struct group *result, ent_t *ent, char *buffer,
|
||||
size_t buflen, int *errnop)
|
||||
{
|
||||
if (!nss_getgrent_r)
|
||||
if (!getgrent_r_impl)
|
||||
return NSS_STATUS_UNAVAIL;
|
||||
|
||||
/* If the setgrent call failed, say so. */
|
||||
@@ -196,7 +198,7 @@ getgrent_next_nss (struct group *result, ent_t *ent, char *buffer,
|
||||
{
|
||||
enum nss_status status;
|
||||
|
||||
if ((status = nss_getgrent_r (result, buffer, buflen, errnop))
|
||||
if ((status = getgrent_r_impl (result, buffer, buflen, errnop))
|
||||
!= NSS_STATUS_SUCCESS)
|
||||
return status;
|
||||
}
|
||||
@@ -210,11 +212,11 @@ static enum nss_status
|
||||
getgrnam_plusgroup (const char *name, struct group *result, ent_t *ent,
|
||||
char *buffer, size_t buflen, int *errnop)
|
||||
{
|
||||
if (!nss_getgrnam_r)
|
||||
if (!getgrnam_r_impl)
|
||||
return NSS_STATUS_UNAVAIL;
|
||||
|
||||
enum nss_status status = nss_getgrnam_r (name, result, buffer, buflen,
|
||||
errnop);
|
||||
enum nss_status status = getgrnam_r_impl (name, result, buffer, buflen,
|
||||
errnop);
|
||||
if (status != NSS_STATUS_SUCCESS)
|
||||
return status;
|
||||
|
||||
@@ -578,11 +580,11 @@ internal_getgrgid_r (gid_t gid, struct group *result, ent_t *ent,
|
||||
/* +:... */
|
||||
if (result->gr_name[0] == '+' && result->gr_name[1] == '\0')
|
||||
{
|
||||
if (!nss_getgrgid_r)
|
||||
if (!getgrgid_r_impl)
|
||||
return NSS_STATUS_UNAVAIL;
|
||||
|
||||
enum nss_status status = nss_getgrgid_r (gid, result, buffer, buflen,
|
||||
errnop);
|
||||
enum nss_status status = getgrgid_r_impl (gid, result,
|
||||
buffer, buflen, errnop);
|
||||
if (status == NSS_STATUS_RETURN) /* We couldn't parse the entry */
|
||||
return NSS_STATUS_NOTFOUND;
|
||||
else
|
||||
|
||||
@@ -30,21 +30,22 @@
|
||||
#include <kernel-features.h>
|
||||
#include <scratch_buffer.h>
|
||||
|
||||
NSS_DECLARE_MODULE_FUNCTIONS (compat)
|
||||
|
||||
static service_user *ni;
|
||||
/* Type of the lookup function. */
|
||||
static enum nss_status (*nss_initgroups_dyn) (const char *, gid_t,
|
||||
long int *, long int *,
|
||||
gid_t **, long int, int *);
|
||||
static enum nss_status (*nss_getgrnam_r) (const char *name,
|
||||
struct group * grp, char *buffer,
|
||||
size_t buflen, int *errnop);
|
||||
static enum nss_status (*nss_getgrgid_r) (gid_t gid, struct group * grp,
|
||||
char *buffer, size_t buflen,
|
||||
int *errnop);
|
||||
static enum nss_status (*nss_setgrent) (int stayopen);
|
||||
static enum nss_status (*nss_getgrent_r) (struct group * grp, char *buffer,
|
||||
size_t buflen, int *errnop);
|
||||
static enum nss_status (*nss_endgrent) (void);
|
||||
static enum nss_status (*initgroups_dyn_impl) (const char *, gid_t,
|
||||
long int *, long int *,
|
||||
gid_t **, long int, int *);
|
||||
static enum nss_status (*getgrnam_r_impl) (const char *name,
|
||||
struct group * grp, char *buffer,
|
||||
size_t buflen, int *errnop);
|
||||
static enum nss_status (*getgrgid_r_impl) (gid_t gid, struct group * grp,
|
||||
char *buffer, size_t buflen,
|
||||
int *errnop);
|
||||
static enum nss_status (*setgrent_impl) (int stayopen);
|
||||
static enum nss_status (*getgrent_r_impl) (struct group * grp, char *buffer,
|
||||
size_t buflen, int *errnop);
|
||||
static enum nss_status (*endgrent_impl) (void);
|
||||
|
||||
/* Protect global state against multiple changers. */
|
||||
__libc_lock_define_initialized (static, lock)
|
||||
@@ -91,12 +92,12 @@ init_nss_interface (void)
|
||||
if (ni == NULL
|
||||
&& __nss_database_lookup2 ("group_compat", NULL, "nis", &ni) >= 0)
|
||||
{
|
||||
nss_initgroups_dyn = __nss_lookup_function (ni, "initgroups_dyn");
|
||||
nss_getgrnam_r = __nss_lookup_function (ni, "getgrnam_r");
|
||||
nss_getgrgid_r = __nss_lookup_function (ni, "getgrgid_r");
|
||||
nss_setgrent = __nss_lookup_function (ni, "setgrent");
|
||||
nss_getgrent_r = __nss_lookup_function (ni, "getgrent_r");
|
||||
nss_endgrent = __nss_lookup_function (ni, "endgrent");
|
||||
initgroups_dyn_impl = __nss_lookup_function (ni, "initgroups_dyn");
|
||||
getgrnam_r_impl = __nss_lookup_function (ni, "getgrnam_r");
|
||||
getgrgid_r_impl = __nss_lookup_function (ni, "getgrgid_r");
|
||||
setgrent_impl = __nss_lookup_function (ni, "setgrent");
|
||||
getgrent_r_impl = __nss_lookup_function (ni, "getgrent_r");
|
||||
endgrent_impl = __nss_lookup_function (ni, "endgrent");
|
||||
}
|
||||
|
||||
__libc_lock_unlock (lock);
|
||||
@@ -151,8 +152,8 @@ internal_endgrent (ent_t *ent)
|
||||
else
|
||||
ent->blacklist.current = 0;
|
||||
|
||||
if (ent->need_endgrent && nss_endgrent != NULL)
|
||||
nss_endgrent ();
|
||||
if (ent->need_endgrent && endgrent_impl != NULL)
|
||||
endgrent_impl ();
|
||||
|
||||
return NSS_STATUS_SUCCESS;
|
||||
}
|
||||
@@ -244,8 +245,8 @@ getgrent_next_nss (ent_t *ent, char *buffer, size_t buflen, const char *user,
|
||||
getgrent_r through the whole group database. But for large
|
||||
group databases this is faster, since the user can only be
|
||||
in a limited number of groups. */
|
||||
if (nss_initgroups_dyn (user, group, &mystart, &mysize, &mygroups,
|
||||
limit, errnop) == NSS_STATUS_SUCCESS)
|
||||
if (initgroups_dyn_impl (user, group, &mystart, &mysize, &mygroups,
|
||||
limit, errnop) == NSS_STATUS_SUCCESS)
|
||||
{
|
||||
status = NSS_STATUS_NOTFOUND;
|
||||
|
||||
@@ -264,8 +265,8 @@ getgrent_next_nss (ent_t *ent, char *buffer, size_t buflen, const char *user,
|
||||
|
||||
for (int i = 0; i < mystart; i++)
|
||||
{
|
||||
while ((status = nss_getgrgid_r (mygroups[i], &grpbuf,
|
||||
tmpbuf, tmplen, errnop))
|
||||
while ((status = getgrgid_r_impl (mygroups[i], &grpbuf,
|
||||
tmpbuf, tmplen, errnop))
|
||||
== NSS_STATUS_TRYAGAIN
|
||||
&& *errnop == ERANGE)
|
||||
{
|
||||
@@ -301,9 +302,9 @@ getgrent_next_nss (ent_t *ent, char *buffer, size_t buflen, const char *user,
|
||||
&& check_and_add_group (user, group, start, size,
|
||||
groupsp, limit, &grpbuf))
|
||||
{
|
||||
if (nss_setgrent != NULL)
|
||||
if (setgrent_impl != NULL)
|
||||
{
|
||||
nss_setgrent (1);
|
||||
setgrent_impl (1);
|
||||
ent->need_endgrent = true;
|
||||
}
|
||||
ent->skip_initgroups_dyn = true;
|
||||
@@ -334,7 +335,7 @@ getgrent_next_nss (ent_t *ent, char *buffer, size_t buflen, const char *user,
|
||||
iter:
|
||||
do
|
||||
{
|
||||
if ((status = nss_getgrent_r (&grpbuf, buffer, buflen, errnop))
|
||||
if ((status = getgrent_r_impl (&grpbuf, buffer, buflen, errnop))
|
||||
!= NSS_STATUS_SUCCESS)
|
||||
break;
|
||||
}
|
||||
@@ -426,10 +427,10 @@ internal_getgrent_r (ent_t *ent, char *buffer, size_t buflen, const char *user,
|
||||
/* Store the group in the blacklist for the "+" at the end of
|
||||
/etc/group */
|
||||
blacklist_store_name (&grpbuf.gr_name[1], ent);
|
||||
if (nss_getgrnam_r == NULL)
|
||||
if (getgrnam_r_impl == NULL)
|
||||
return NSS_STATUS_UNAVAIL;
|
||||
else if (nss_getgrnam_r (&grpbuf.gr_name[1], &grpbuf, buffer,
|
||||
buflen, errnop) != NSS_STATUS_SUCCESS)
|
||||
else if (getgrnam_r_impl (&grpbuf.gr_name[1], &grpbuf, buffer,
|
||||
buflen, errnop) != NSS_STATUS_SUCCESS)
|
||||
continue;
|
||||
|
||||
check_and_add_group (user, group, start, size, groupsp,
|
||||
@@ -444,16 +445,16 @@ internal_getgrent_r (ent_t *ent, char *buffer, size_t buflen, const char *user,
|
||||
/* If the selected module does not support getgrent_r or
|
||||
initgroups_dyn, abort. We cannot find the needed group
|
||||
entries. */
|
||||
if (nss_initgroups_dyn == NULL || nss_getgrgid_r == NULL)
|
||||
if (initgroups_dyn_impl == NULL || getgrgid_r_impl == NULL)
|
||||
{
|
||||
if (nss_setgrent != NULL)
|
||||
if (setgrent_impl != NULL)
|
||||
{
|
||||
nss_setgrent (1);
|
||||
setgrent_impl (1);
|
||||
ent->need_endgrent = true;
|
||||
}
|
||||
ent->skip_initgroups_dyn = true;
|
||||
|
||||
if (nss_getgrent_r == NULL)
|
||||
if (getgrent_r_impl == NULL)
|
||||
return NSS_STATUS_UNAVAIL;
|
||||
}
|
||||
|
||||
|
||||
+30
-28
@@ -31,17 +31,19 @@
|
||||
#include "netgroup.h"
|
||||
#include "nisdomain.h"
|
||||
|
||||
NSS_DECLARE_MODULE_FUNCTIONS (compat)
|
||||
|
||||
static service_user *ni;
|
||||
static enum nss_status (*nss_setpwent) (int stayopen);
|
||||
static enum nss_status (*nss_getpwnam_r) (const char *name,
|
||||
struct passwd * pwd, char *buffer,
|
||||
size_t buflen, int *errnop);
|
||||
static enum nss_status (*nss_getpwuid_r) (uid_t uid, struct passwd * pwd,
|
||||
char *buffer, size_t buflen,
|
||||
int *errnop);
|
||||
static enum nss_status (*nss_getpwent_r) (struct passwd * pwd, char *buffer,
|
||||
size_t buflen, int *errnop);
|
||||
static enum nss_status (*nss_endpwent) (void);
|
||||
static enum nss_status (*setpwent_impl) (int stayopen);
|
||||
static enum nss_status (*getpwnam_r_impl) (const char *name,
|
||||
struct passwd * pwd, char *buffer,
|
||||
size_t buflen, int *errnop);
|
||||
static enum nss_status (*getpwuid_r_impl) (uid_t uid, struct passwd * pwd,
|
||||
char *buffer, size_t buflen,
|
||||
int *errnop);
|
||||
static enum nss_status (*getpwent_r_impl) (struct passwd * pwd, char *buffer,
|
||||
size_t buflen, int *errnop);
|
||||
static enum nss_status (*endpwent_impl) (void);
|
||||
|
||||
/* Get the declaration of the parser function. */
|
||||
#define ENTNAME pwent
|
||||
@@ -90,11 +92,11 @@ init_nss_interface (void)
|
||||
{
|
||||
if (__nss_database_lookup2 ("passwd_compat", NULL, "nis", &ni) >= 0)
|
||||
{
|
||||
nss_setpwent = __nss_lookup_function (ni, "setpwent");
|
||||
nss_getpwnam_r = __nss_lookup_function (ni, "getpwnam_r");
|
||||
nss_getpwuid_r = __nss_lookup_function (ni, "getpwuid_r");
|
||||
nss_getpwent_r = __nss_lookup_function (ni, "getpwent_r");
|
||||
nss_endpwent = __nss_lookup_function (ni, "endpwent");
|
||||
setpwent_impl = __nss_lookup_function (ni, "setpwent");
|
||||
getpwnam_r_impl = __nss_lookup_function (ni, "getpwnam_r");
|
||||
getpwuid_r_impl = __nss_lookup_function (ni, "getpwuid_r");
|
||||
getpwent_r_impl = __nss_lookup_function (ni, "getpwent_r");
|
||||
endpwent_impl = __nss_lookup_function (ni, "endpwent");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -234,8 +236,8 @@ internal_setpwent (ent_t *ent, int stayopen, int needent)
|
||||
|
||||
give_pwd_free (&ent->pwd);
|
||||
|
||||
if (needent && status == NSS_STATUS_SUCCESS && nss_setpwent)
|
||||
ent->setent_status = nss_setpwent (stayopen);
|
||||
if (needent && status == NSS_STATUS_SUCCESS && setpwent_impl)
|
||||
ent->setent_status = setpwent_impl (stayopen);
|
||||
|
||||
return status;
|
||||
}
|
||||
@@ -294,8 +296,8 @@ _nss_compat_endpwent (void)
|
||||
|
||||
__libc_lock_lock (lock);
|
||||
|
||||
if (nss_endpwent)
|
||||
nss_endpwent ();
|
||||
if (endpwent_impl)
|
||||
endpwent_impl ();
|
||||
|
||||
result = internal_endpwent (&ext_ent);
|
||||
|
||||
@@ -316,7 +318,7 @@ getpwent_next_nss_netgr (const char *name, struct passwd *result, ent_t *ent,
|
||||
|
||||
/* Leave function if NSS module does not support getpwnam_r,
|
||||
we need this function here. */
|
||||
if (!nss_getpwnam_r)
|
||||
if (!getpwnam_r_impl)
|
||||
return NSS_STATUS_UNAVAIL;
|
||||
|
||||
if (ent->first)
|
||||
@@ -370,7 +372,7 @@ getpwent_next_nss_netgr (const char *name, struct passwd *result, ent_t *ent,
|
||||
p2 = buffer + (buflen - p2len);
|
||||
buflen -= p2len;
|
||||
|
||||
if (nss_getpwnam_r (user, result, buffer, buflen, errnop)
|
||||
if (getpwnam_r_impl (user, result, buffer, buflen, errnop)
|
||||
!= NSS_STATUS_SUCCESS)
|
||||
continue;
|
||||
|
||||
@@ -397,7 +399,7 @@ getpwent_next_nss (struct passwd *result, ent_t *ent, char *buffer,
|
||||
size_t p2len;
|
||||
|
||||
/* Return if NSS module does not support getpwent_r. */
|
||||
if (!nss_getpwent_r)
|
||||
if (!getpwent_r_impl)
|
||||
return NSS_STATUS_UNAVAIL;
|
||||
|
||||
/* If the setpwent call failed, say so. */
|
||||
@@ -418,7 +420,7 @@ getpwent_next_nss (struct passwd *result, ent_t *ent, char *buffer,
|
||||
|
||||
do
|
||||
{
|
||||
if ((status = nss_getpwent_r (result, buffer, buflen, errnop))
|
||||
if ((status = getpwent_r_impl (result, buffer, buflen, errnop))
|
||||
!= NSS_STATUS_SUCCESS)
|
||||
return status;
|
||||
}
|
||||
@@ -434,7 +436,7 @@ static enum nss_status
|
||||
getpwnam_plususer (const char *name, struct passwd *result, ent_t *ent,
|
||||
char *buffer, size_t buflen, int *errnop)
|
||||
{
|
||||
if (!nss_getpwnam_r)
|
||||
if (!getpwnam_r_impl)
|
||||
return NSS_STATUS_UNAVAIL;
|
||||
|
||||
struct passwd pwd;
|
||||
@@ -451,8 +453,8 @@ getpwnam_plususer (const char *name, struct passwd *result, ent_t *ent,
|
||||
char *p = buffer + (buflen - plen);
|
||||
buflen -= plen;
|
||||
|
||||
enum nss_status status = nss_getpwnam_r (name, result, buffer, buflen,
|
||||
errnop);
|
||||
enum nss_status status = getpwnam_r_impl (name, result, buffer, buflen,
|
||||
errnop);
|
||||
if (status != NSS_STATUS_SUCCESS)
|
||||
return status;
|
||||
|
||||
@@ -836,7 +838,7 @@ getpwuid_plususer (uid_t uid, struct passwd *result, char *buffer,
|
||||
char *p;
|
||||
size_t plen;
|
||||
|
||||
if (!nss_getpwuid_r)
|
||||
if (!getpwuid_r_impl)
|
||||
return NSS_STATUS_UNAVAIL;
|
||||
|
||||
memset (&pwd, '\0', sizeof (struct passwd));
|
||||
@@ -852,7 +854,7 @@ getpwuid_plususer (uid_t uid, struct passwd *result, char *buffer,
|
||||
p = buffer + (buflen - plen);
|
||||
buflen -= plen;
|
||||
|
||||
if (nss_getpwuid_r (uid, result, buffer, buflen, errnop) ==
|
||||
if (getpwuid_r_impl (uid, result, buffer, buflen, errnop) ==
|
||||
NSS_STATUS_SUCCESS)
|
||||
{
|
||||
copy_pwd_changes (result, &pwd, p, plen);
|
||||
|
||||
@@ -31,14 +31,16 @@
|
||||
#include "netgroup.h"
|
||||
#include "nisdomain.h"
|
||||
|
||||
NSS_DECLARE_MODULE_FUNCTIONS (compat)
|
||||
|
||||
static service_user *ni;
|
||||
static enum nss_status (*nss_setspent) (int stayopen);
|
||||
static enum nss_status (*nss_getspnam_r) (const char *name, struct spwd * sp,
|
||||
char *buffer, size_t buflen,
|
||||
int *errnop);
|
||||
static enum nss_status (*nss_getspent_r) (struct spwd * sp, char *buffer,
|
||||
size_t buflen, int *errnop);
|
||||
static enum nss_status (*nss_endspent) (void);
|
||||
static enum nss_status (*setspent_impl) (int stayopen);
|
||||
static enum nss_status (*getspnam_r_impl) (const char *name, struct spwd * sp,
|
||||
char *buffer, size_t buflen,
|
||||
int *errnop);
|
||||
static enum nss_status (*getspent_r_impl) (struct spwd * sp, char *buffer,
|
||||
size_t buflen, int *errnop);
|
||||
static enum nss_status (*endspent_impl) (void);
|
||||
|
||||
/* Get the declaration of the parser function. */
|
||||
#define ENTNAME spent
|
||||
@@ -88,10 +90,10 @@ init_nss_interface (void)
|
||||
if (__nss_database_lookup2 ("shadow_compat", "passwd_compat",
|
||||
"nis", &ni) >= 0)
|
||||
{
|
||||
nss_setspent = __nss_lookup_function (ni, "setspent");
|
||||
nss_getspnam_r = __nss_lookup_function (ni, "getspnam_r");
|
||||
nss_getspent_r = __nss_lookup_function (ni, "getspent_r");
|
||||
nss_endspent = __nss_lookup_function (ni, "endspent");
|
||||
setspent_impl = __nss_lookup_function (ni, "setspent");
|
||||
getspnam_r_impl = __nss_lookup_function (ni, "getspnam_r");
|
||||
getspent_r_impl = __nss_lookup_function (ni, "getspent_r");
|
||||
endspent_impl = __nss_lookup_function (ni, "endspent");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -190,8 +192,8 @@ internal_setspent (ent_t *ent, int stayopen, int needent)
|
||||
|
||||
give_spwd_free (&ent->pwd);
|
||||
|
||||
if (needent && status == NSS_STATUS_SUCCESS && nss_setspent)
|
||||
ent->setent_status = nss_setspent (stayopen);
|
||||
if (needent && status == NSS_STATUS_SUCCESS && setspent_impl)
|
||||
ent->setent_status = setspent_impl (stayopen);
|
||||
|
||||
return status;
|
||||
}
|
||||
@@ -251,8 +253,8 @@ _nss_compat_endspent (void)
|
||||
|
||||
__libc_lock_lock (lock);
|
||||
|
||||
if (nss_endspent)
|
||||
nss_endspent ();
|
||||
if (endspent_impl)
|
||||
endspent_impl ();
|
||||
|
||||
result = internal_endspent (&ext_ent);
|
||||
|
||||
@@ -270,7 +272,7 @@ getspent_next_nss_netgr (const char *name, struct spwd *result, ent_t *ent,
|
||||
char *curdomain = NULL, *host, *user, *domain, *p2;
|
||||
size_t p2len;
|
||||
|
||||
if (!nss_getspnam_r)
|
||||
if (!getspnam_r_impl)
|
||||
return NSS_STATUS_UNAVAIL;
|
||||
|
||||
/* If the setpwent call failed, say so. */
|
||||
@@ -330,7 +332,7 @@ getspent_next_nss_netgr (const char *name, struct spwd *result, ent_t *ent,
|
||||
p2 = buffer + (buflen - p2len);
|
||||
buflen -= p2len;
|
||||
|
||||
if (nss_getspnam_r (user, result, buffer, buflen, errnop)
|
||||
if (getspnam_r_impl (user, result, buffer, buflen, errnop)
|
||||
!= NSS_STATUS_SUCCESS)
|
||||
continue;
|
||||
|
||||
@@ -356,7 +358,7 @@ getspent_next_nss (struct spwd *result, ent_t *ent,
|
||||
char *p2;
|
||||
size_t p2len;
|
||||
|
||||
if (!nss_getspent_r)
|
||||
if (!getspent_r_impl)
|
||||
return NSS_STATUS_UNAVAIL;
|
||||
|
||||
p2len = spwd_need_buflen (&ent->pwd);
|
||||
@@ -369,7 +371,7 @@ getspent_next_nss (struct spwd *result, ent_t *ent,
|
||||
buflen -= p2len;
|
||||
do
|
||||
{
|
||||
if ((status = nss_getspent_r (result, buffer, buflen, errnop))
|
||||
if ((status = getspent_r_impl (result, buffer, buflen, errnop))
|
||||
!= NSS_STATUS_SUCCESS)
|
||||
return status;
|
||||
}
|
||||
@@ -386,7 +388,7 @@ static enum nss_status
|
||||
getspnam_plususer (const char *name, struct spwd *result, ent_t *ent,
|
||||
char *buffer, size_t buflen, int *errnop)
|
||||
{
|
||||
if (!nss_getspnam_r)
|
||||
if (!getspnam_r_impl)
|
||||
return NSS_STATUS_UNAVAIL;
|
||||
|
||||
struct spwd pwd;
|
||||
@@ -407,8 +409,8 @@ getspnam_plususer (const char *name, struct spwd *result, ent_t *ent,
|
||||
char *p = buffer + (buflen - plen);
|
||||
buflen -= plen;
|
||||
|
||||
enum nss_status status = nss_getspnam_r (name, result, buffer, buflen,
|
||||
errnop);
|
||||
enum nss_status status = getspnam_r_impl (name, result, buffer, buflen,
|
||||
errnop);
|
||||
if (status != NSS_STATUS_SUCCESS)
|
||||
return status;
|
||||
|
||||
|
||||
@@ -22,6 +22,8 @@
|
||||
#include <nscd/nscd.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "nss_db.h"
|
||||
|
||||
#define PWD_FILENAME (_PATH_VARDB "passwd.db")
|
||||
define_traced_file (pwd, PWD_FILENAME);
|
||||
|
||||
|
||||
@@ -32,7 +32,6 @@
|
||||
/* The hashing function we use. */
|
||||
#include "../intl/hash-string.h"
|
||||
|
||||
|
||||
enum nss_status
|
||||
_nss_db_initgroups_dyn (const char *user, gid_t group, long int *start,
|
||||
long int *size, gid_t **groupsp, long int limit,
|
||||
|
||||
@@ -23,6 +23,7 @@
|
||||
#include <stdint.h>
|
||||
#include <libc-lock.h>
|
||||
|
||||
NSS_DECLARE_MODULE_FUNCTIONS (db)
|
||||
|
||||
/* String table index type. */
|
||||
typedef uint32_t stridx_t;
|
||||
|
||||
@@ -30,6 +30,8 @@
|
||||
|
||||
#include "nsswitch.h"
|
||||
|
||||
NSS_DECLARE_MODULE_FUNCTIONS (files)
|
||||
|
||||
/* Locks the static variables in this file. */
|
||||
__libc_lock_define_initialized (static, lock)
|
||||
|
||||
|
||||
@@ -18,6 +18,9 @@
|
||||
#include <string.h>
|
||||
#include <netinet/ether.h>
|
||||
#include <netinet/if_ether.h>
|
||||
#include <nss.h>
|
||||
|
||||
NSS_DECLARE_MODULE_FUNCTIONS (files)
|
||||
|
||||
struct etherent_data {};
|
||||
|
||||
|
||||
@@ -17,6 +17,9 @@
|
||||
<https://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <grp.h>
|
||||
#include <nss.h>
|
||||
|
||||
NSS_DECLARE_MODULE_FUNCTIONS (files)
|
||||
|
||||
#define STRUCTURE group
|
||||
#define ENTNAME grent
|
||||
|
||||
@@ -24,7 +24,9 @@
|
||||
#include <resolv/resolv-internal.h>
|
||||
#include <scratch_buffer.h>
|
||||
#include <alloc_buffer.h>
|
||||
#include <nss.h>
|
||||
|
||||
NSS_DECLARE_MODULE_FUNCTIONS (files)
|
||||
|
||||
/* Get implementation for some internal functions. */
|
||||
#include "../resolv/res_hconf.h"
|
||||
|
||||
@@ -20,6 +20,9 @@
|
||||
|
||||
#include <string.h>
|
||||
#include <nscd/nscd.h>
|
||||
#include <nss.h>
|
||||
|
||||
NSS_DECLARE_MODULE_FUNCTIONS (files)
|
||||
|
||||
#define PWD_FILENAME "/etc/passwd"
|
||||
define_traced_file (pwd, PWD_FILENAME);
|
||||
|
||||
@@ -25,6 +25,9 @@
|
||||
#include <stdbool.h>
|
||||
#include <stdlib.h>
|
||||
#include <scratch_buffer.h>
|
||||
#include <nss.h>
|
||||
|
||||
NSS_DECLARE_MODULE_FUNCTIONS (files)
|
||||
|
||||
enum nss_status
|
||||
_nss_files_initgroups_dyn (const char *user, gid_t group, long int *start,
|
||||
|
||||
@@ -24,6 +24,8 @@
|
||||
#include <rpc/des_crypt.h>
|
||||
#include "nsswitch.h"
|
||||
|
||||
NSS_DECLARE_MODULE_FUNCTIONS (files)
|
||||
|
||||
#define DATAFILE "/etc/publickey"
|
||||
|
||||
|
||||
|
||||
@@ -27,6 +27,8 @@
|
||||
#include "nsswitch.h"
|
||||
#include "netgroup.h"
|
||||
|
||||
NSS_DECLARE_MODULE_FUNCTIONS (files)
|
||||
|
||||
#define DATAFILE "/etc/netgroup"
|
||||
|
||||
libnss_files_hidden_proto (_nss_files_endnetgrent)
|
||||
|
||||
@@ -20,6 +20,9 @@
|
||||
#include <arpa/inet.h>
|
||||
#include <netdb.h>
|
||||
#include <stdint.h>
|
||||
#include <nss.h>
|
||||
|
||||
NSS_DECLARE_MODULE_FUNCTIONS (files)
|
||||
|
||||
#define ENTNAME netent
|
||||
#define DATABASE "networks"
|
||||
|
||||
@@ -17,7 +17,9 @@
|
||||
<https://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <netdb.h>
|
||||
#include <nss.h>
|
||||
|
||||
NSS_DECLARE_MODULE_FUNCTIONS (files)
|
||||
|
||||
#define ENTNAME protoent
|
||||
#define DATABASE "protocols"
|
||||
|
||||
@@ -17,6 +17,9 @@
|
||||
<https://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <pwd.h>
|
||||
#include <nss.h>
|
||||
|
||||
NSS_DECLARE_MODULE_FUNCTIONS (files)
|
||||
|
||||
#define STRUCTURE passwd
|
||||
#define ENTNAME pwent
|
||||
|
||||
@@ -17,7 +17,9 @@
|
||||
<https://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <rpc/netdb.h>
|
||||
#include <nss.h>
|
||||
|
||||
NSS_DECLARE_MODULE_FUNCTIONS (files)
|
||||
|
||||
#define ENTNAME rpcent
|
||||
#define DATABASE "rpc"
|
||||
|
||||
@@ -18,7 +18,9 @@
|
||||
|
||||
#include <netinet/in.h>
|
||||
#include <netdb.h>
|
||||
#include <nss.h>
|
||||
|
||||
NSS_DECLARE_MODULE_FUNCTIONS (files)
|
||||
|
||||
#define ENTNAME servent
|
||||
#define DATABASE "services"
|
||||
|
||||
@@ -17,6 +17,9 @@
|
||||
<https://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <gshadow.h>
|
||||
#include <nss.h>
|
||||
|
||||
NSS_DECLARE_MODULE_FUNCTIONS (files)
|
||||
|
||||
#define STRUCTURE sgrp
|
||||
#define ENTNAME sgent
|
||||
|
||||
@@ -17,6 +17,9 @@
|
||||
<https://www.gnu.org/licenses/>. */
|
||||
|
||||
#include <shadow.h>
|
||||
#include <nss.h>
|
||||
|
||||
NSS_DECLARE_MODULE_FUNCTIONS (files)
|
||||
|
||||
#define STRUCTURE spwd
|
||||
#define ENTNAME spent
|
||||
|
||||
@@ -26,6 +26,8 @@
|
||||
#include <resolv/resolv_context.h>
|
||||
#include <resolv/resolv-internal.h>
|
||||
|
||||
NSS_DECLARE_MODULE_FUNCTIONS (dns)
|
||||
|
||||
#if PACKETSZ > 65536
|
||||
# define MAXPACKET PACKETSZ
|
||||
#else
|
||||
|
||||
@@ -90,6 +90,8 @@
|
||||
#include <resolv/mapv4v6addr.h>
|
||||
#include <resolv/mapv4v6hostent.h>
|
||||
|
||||
NSS_DECLARE_MODULE_FUNCTIONS (dns)
|
||||
|
||||
#define RESOLVSORT
|
||||
|
||||
#if PACKETSZ > 65536
|
||||
|
||||
@@ -70,6 +70,8 @@
|
||||
#include <resolv/resolv-internal.h>
|
||||
#include <resolv/resolv_context.h>
|
||||
|
||||
NSS_DECLARE_MODULE_FUNCTIONS (dns)
|
||||
|
||||
/* Maximum number of aliases we allow. */
|
||||
#define MAX_NR_ALIASES 48
|
||||
|
||||
|
||||
@@ -300,18 +300,6 @@ convert_hostent_to_gaih_addrtuple (const struct addrinfo *req,
|
||||
}
|
||||
|
||||
|
||||
typedef enum nss_status (*nss_gethostbyname4_r)
|
||||
(const char *name, struct gaih_addrtuple **pat,
|
||||
char *buffer, size_t buflen, int *errnop,
|
||||
int *h_errnop, int32_t *ttlp);
|
||||
typedef enum nss_status (*nss_gethostbyname3_r)
|
||||
(const char *name, int af, struct hostent *host,
|
||||
char *buffer, size_t buflen, int *errnop,
|
||||
int *h_errnop, int32_t *ttlp, char **canonp);
|
||||
typedef enum nss_status (*nss_getcanonname_r)
|
||||
(const char *name, char *buffer, size_t buflen, char **result,
|
||||
int *errnop, int *h_errnop);
|
||||
|
||||
/* This function is called if a canonical name is requested, but if
|
||||
the service function did not provide it. It tries to obtain the
|
||||
name using getcanonname_r from the same service NIP. If the name
|
||||
@@ -321,7 +309,7 @@ typedef enum nss_status (*nss_getcanonname_r)
|
||||
static char *
|
||||
getcanonname (service_user *nip, struct gaih_addrtuple *at, const char *name)
|
||||
{
|
||||
nss_getcanonname_r cfct = __nss_lookup_function (nip, "getcanonname_r");
|
||||
nss_getcanonname_r *cfct = __nss_lookup_function (nip, "getcanonname_r");
|
||||
char *s = (char *) name;
|
||||
if (cfct != NULL)
|
||||
{
|
||||
@@ -751,7 +739,7 @@ gaih_inet (const char *name, const struct gaih_service *service,
|
||||
while (!no_more)
|
||||
{
|
||||
no_data = 0;
|
||||
nss_gethostbyname4_r fct4 = NULL;
|
||||
nss_gethostbyname4_r *fct4 = NULL;
|
||||
|
||||
/* gethostbyname4_r sends out parallel A and AAAA queries and
|
||||
is thus only suitable for PF_UNSPEC. */
|
||||
@@ -827,7 +815,7 @@ gaih_inet (const char *name, const struct gaih_service *service,
|
||||
}
|
||||
else
|
||||
{
|
||||
nss_gethostbyname3_r fct = NULL;
|
||||
nss_gethostbyname3_r *fct = NULL;
|
||||
if (req->ai_flags & AI_CANONNAME)
|
||||
/* No need to use this function if we do not look for
|
||||
the canonical name. The function does not exist in
|
||||
|
||||
Reference in New Issue
Block a user