Compare commits

...
Author SHA1 Message Date
Florian Weimer 319a7e32fc nss_nisplus: Use NSS_DECLARE_MODULE_FUNCTIONS 2020-02-12 15:36:03 +01:00
Florian Weimer bf0041b252 nss_dns: Use NSS_DECLARE_MODULE_FUNCTIONS 2020-02-12 15:27:42 +01:00
Florian Weimer 9d45607d86 nss_files: Use NSS_DECLARE_MODULE_FUNCTIONS 2020-02-12 15:27:42 +01:00
Florian Weimer 977f5ffca9 nss_db: Use NSS_DECLARE_MODULE_FUNCTIONS 2020-02-12 15:27:42 +01:00
Florian Weimer 36b6bee240 nss_compat: Use NSS_DECLARE_MODULE_FUNCTIONS 2020-02-12 15:27:42 +01:00
Florian Weimer d8af48b1d7 nss_hesiod: Use NSS_DECLARE_MODULE_FUNCTIONS 2020-02-12 15:27:42 +01:00
Florian Weimer a4f0631ace nss: Add function types and NSS_DECLARE_MODULE_FUNCTIONS macro to <nss.h>
This macro allows to add type safety to the implementation of NSS
service modules.
2020-02-12 15:27:37 +01:00
Florian Weimer 8b6e0566f5 nss_compat: Do not use nss_* names for function pointers
A future commit will use these names for types of functions
in NSS service modules.
2020-02-12 14:27:32 +01:00
33 changed files with 385 additions and 149 deletions
+2
View File
@@ -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
+2
View File
@@ -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. */
+2
View File
@@ -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
+2
View File
@@ -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. */
+1
View File
@@ -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
View File
@@ -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)
{
+201 -2
View File
@@ -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
View File
@@ -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
+37 -36
View File
@@ -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
View File
@@ -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);
+24 -22
View File
@@ -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;
+2
View File
@@ -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);
-1
View File
@@ -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,
+1
View File
@@ -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;
+2
View File
@@ -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)
+3
View File
@@ -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 {};
+3
View File
@@ -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
+2
View File
@@ -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"
+3
View File
@@ -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);
+3
View File
@@ -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,
+2
View File
@@ -24,6 +24,8 @@
#include <rpc/des_crypt.h>
#include "nsswitch.h"
NSS_DECLARE_MODULE_FUNCTIONS (files)
#define DATAFILE "/etc/publickey"
+2
View File
@@ -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)
+3
View File
@@ -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"
+2
View File
@@ -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"
+3
View File
@@ -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
+2
View File
@@ -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"
+2
View File
@@ -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"
+3
View File
@@ -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
+3
View File
@@ -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
+2
View File
@@ -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
+2
View File
@@ -90,6 +90,8 @@
#include <resolv/mapv4v6addr.h>
#include <resolv/mapv4v6hostent.h>
NSS_DECLARE_MODULE_FUNCTIONS (dns)
#define RESOLVSORT
#if PACKETSZ > 65536
+2
View File
@@ -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
+3 -15
View File
@@ -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