* nss/getXXent.c (GETFUNC_NAME): Use union type to avoid strict

aliasing problem. 
* nss/getXXbyYY_r.c (INTERNAL): Likewise. 
* nss/getnssent_r.c (__nss_getent_r): Likewise. 
(__nss_setent): Likewise. 
(__nss_getent_r): Likewise. 
* inet/getnetgrent_r.c (innetgr): Likewise. 
(__internal_setnetgrent_reuse): Likewise. 
(internal_getnetgrent_r): Likewise. 
* inet/ether_hton.c (ether_hostton): Likewise. 
* inet/ether_ntoh.c (ether_ntohost): Likewise. 
* sunrpc/netname.c (netname2user): Likewise. 
* sunrpc/publickey.c (getpublickey): Likewise. 
(getsecretkey): Likewise.
This commit is contained in:
Andreas Jaeger 2002-11-10 11:06:36 +00:00
parent 55c303acb8
commit fb776f3ef3
8 changed files with 161 additions and 92 deletions

View File

@ -39,25 +39,29 @@ ether_hostton (const char *hostname, struct ether_addr *addr)
static service_user *startp; static service_user *startp;
static lookup_function start_fct; static lookup_function start_fct;
service_user *nip; service_user *nip;
lookup_function fct; union
{
lookup_function f;
void *ptr;
} fct;
int no_more; int no_more;
enum nss_status status = NSS_STATUS_UNAVAIL; enum nss_status status = NSS_STATUS_UNAVAIL;
struct etherent etherent; struct etherent etherent;
if (startp == NULL) if (startp == NULL)
{ {
no_more = __nss_ethers_lookup (&nip, "gethostton_r", (void **) &fct); no_more = __nss_ethers_lookup (&nip, "gethostton_r", &fct.ptr);
if (no_more) if (no_more)
startp = (service_user *) -1; startp = (service_user *) -1;
else else
{ {
startp = nip; startp = nip;
start_fct = fct; start_fct = fct.f;
} }
} }
else else
{ {
fct = start_fct; fct.f = start_fct;
no_more = (nip = startp) == (service_user *) -1; no_more = (nip = startp) == (service_user *) -1;
} }
@ -65,9 +69,9 @@ ether_hostton (const char *hostname, struct ether_addr *addr)
{ {
char buffer[1024]; char buffer[1024];
status = (*fct) (hostname, &etherent, buffer, sizeof buffer, &errno); status = (*fct.f) (hostname, &etherent, buffer, sizeof buffer, &errno);
no_more = __nss_next (&nip, "gethostton_r", (void **) &fct, status, 0); no_more = __nss_next (&nip, "gethostton_r", &fct.ptr, status, 0);
} }
if (status == NSS_STATUS_SUCCESS) if (status == NSS_STATUS_SUCCESS)

View File

@ -40,25 +40,29 @@ ether_ntohost (char *hostname, const struct ether_addr *addr)
static service_user *startp; static service_user *startp;
static lookup_function start_fct; static lookup_function start_fct;
service_user *nip; service_user *nip;
lookup_function fct; union
{
lookup_function f;
void *ptr;
} fct;
int no_more; int no_more;
enum nss_status status = NSS_STATUS_UNAVAIL; enum nss_status status = NSS_STATUS_UNAVAIL;
struct etherent etherent; struct etherent etherent;
if (startp == NULL) if (startp == NULL)
{ {
no_more = __nss_ethers_lookup (&nip, "getntohost_r", (void **) &fct); no_more = __nss_ethers_lookup (&nip, "getntohost_r", &fct.ptr);
if (no_more) if (no_more)
startp = (service_user *) -1; startp = (service_user *) -1;
else else
{ {
startp = nip; startp = nip;
start_fct = fct; start_fct = fct.f;
} }
} }
else else
{ {
fct = start_fct; fct.f = start_fct;
no_more = (nip = startp) == (service_user *) -1; no_more = (nip = startp) == (service_user *) -1;
} }
@ -66,9 +70,9 @@ ether_ntohost (char *hostname, const struct ether_addr *addr)
{ {
char buffer[1024]; char buffer[1024];
status = (*fct) (addr, &etherent, buffer, sizeof buffer, &errno); status = (*fct.f) (addr, &etherent, buffer, sizeof buffer, &errno);
no_more = __nss_next (&nip, "getntohost_r", (void **) &fct, status, 0); no_more = __nss_next (&nip, "getntohost_r", &fct.ptr, status, 0);
} }
if (status == NSS_STATUS_SUCCESS) if (status == NSS_STATUS_SUCCESS)

View File

@ -96,19 +96,23 @@ internal_function
__internal_setnetgrent_reuse (const char *group, struct __netgrent *datap, __internal_setnetgrent_reuse (const char *group, struct __netgrent *datap,
int *errnop) int *errnop)
{ {
enum nss_status (*fct) (const char *, struct __netgrent *); union
{
enum nss_status (*f) (const char *, struct __netgrent *);
void *ptr;
} fct;
enum nss_status status = NSS_STATUS_UNAVAIL; enum nss_status status = NSS_STATUS_UNAVAIL;
struct name_list *new_elem; struct name_list *new_elem;
int no_more; int no_more;
/* Cycle through all the services and run their setnetgrent functions. */ /* Cycle through all the services and run their setnetgrent functions. */
no_more = setup ((void **) &fct, "setnetgrent", 1); no_more = setup (&fct.ptr, "setnetgrent", 1);
while (! no_more) while (! no_more)
{ {
/* Ignore status, we force check in `__nss_next'. */ /* Ignore status, we force check in `__nss_next'. */
status = (*fct) (group, datap); status = (*fct.f) (group, datap);
no_more = __nss_next (&nip, "setnetgrent", (void **) &fct, status, 0); no_more = __nss_next (&nip, "setnetgrent", &fct.ptr, status, 0);
} }
/* Add the current group to the list of known groups. */ /* Add the current group to the list of known groups. */
@ -158,21 +162,25 @@ static void
internal_endnetgrent (struct __netgrent *datap) internal_endnetgrent (struct __netgrent *datap)
{ {
service_user *old_nip; service_user *old_nip;
enum nss_status (*fct) (struct __netgrent *); union
{
enum nss_status (*f) (struct __netgrent *);
void *ptr;
} fct;
int no_more; int no_more;
/* Remember which was the last used service. */ /* Remember which was the last used service. */
old_nip = nip; old_nip = nip;
/* Cycle through all the services and run their endnetgrent functions. */ /* Cycle through all the services and run their endnetgrent functions. */
no_more = setup ((void **) &fct, "endnetgrent", 1); no_more = setup (&fct.ptr, "endnetgrent", 1);
while (! no_more) while (! no_more)
{ {
/* Ignore status, we force check in `__nss_next'. */ /* Ignore status, we force check in `__nss_next'. */
(void) (*fct) (datap); (void) (*fct.f) (datap);
no_more = (nip == old_nip no_more = (nip == old_nip
|| __nss_next (&nip, "endnetgrent", (void **) &fct, 0, 1)); || __nss_next (&nip, "endnetgrent", &fct.ptr, 0, 1));
} }
/* Now free list of all netgroup names from last run. */ /* Now free list of all netgroup names from last run. */
@ -197,7 +205,11 @@ internal_getnetgrent_r (char **hostp, char **userp, char **domainp,
struct __netgrent *datap, struct __netgrent *datap,
char *buffer, size_t buflen, int *errnop) char *buffer, size_t buflen, int *errnop)
{ {
enum nss_status (*fct) (struct __netgrent *, char *, size_t, int *); union
{
enum nss_status (*f) (struct __netgrent *, char *, size_t, int *);
void *ptr;
} fct;
int no_more; int no_more;
/* Initialize status to return if no more functions are found. */ /* Initialize status to return if no more functions are found. */
@ -206,10 +218,10 @@ internal_getnetgrent_r (char **hostp, char **userp, char **domainp,
/* Run through available functions, starting with the same function last /* Run through available functions, starting with the same function last
run. We will repeat each function as long as it succeeds, and then go run. We will repeat each function as long as it succeeds, and then go
on to the next service action. */ on to the next service action. */
no_more = setup ((void **) &fct, "getnetgrent_r", 0); no_more = setup (&fct.ptr, "getnetgrent_r", 0);
while (! no_more) while (! no_more)
{ {
status = (*fct) (datap, buffer, buflen, &errno); status = (*fct.f) (datap, buffer, buflen, &errno);
if (status == NSS_STATUS_RETURN) if (status == NSS_STATUS_RETURN)
{ {
@ -262,7 +274,7 @@ internal_getnetgrent_r (char **hostp, char **userp, char **domainp,
} }
} }
no_more = __nss_next (&nip, "getnetgrent_r", (void **) &fct, status, 0); no_more = __nss_next (&nip, "getnetgrent_r", &fct.ptr, status, 0);
} }
if (status == NSS_STATUS_SUCCESS) if (status == NSS_STATUS_SUCCESS)
@ -299,9 +311,21 @@ int
innetgr (const char *netgroup, const char *host, const char *user, innetgr (const char *netgroup, const char *host, const char *user,
const char *domain) const char *domain)
{ {
int (*setfct) (const char *, struct __netgrent *); union
void (*endfct) (struct __netgrent *); {
int (*getfct) (struct __netgrent *, char *, size_t, int *); int (*f) (const char *, struct __netgrent *);
void *ptr;
} setfct;
union
{
void (*f) (struct __netgrent *);
void *ptr;
} endfct;
union
{
int (*f) (struct __netgrent *, char *, size_t, int *);
void *ptr;
} getfct;
struct name_list *known = NULL; struct name_list *known = NULL;
struct name_list *needed = NULL; struct name_list *needed = NULL;
int result = 0; int result = 0;
@ -315,7 +339,7 @@ innetgr (const char *netgroup, const char *host, const char *user,
the work during one walk through the service list. */ the work during one walk through the service list. */
while (1) while (1)
{ {
no_more = setup ((void **) &setfct, "setnetgrent", 1); no_more = setup (&setfct.ptr, "setnetgrent", 1);
while (! no_more) while (! no_more)
{ {
enum nss_status status; enum nss_status status;
@ -325,13 +349,13 @@ innetgr (const char *netgroup, const char *host, const char *user,
__bzero (&entry, sizeof (entry)); __bzero (&entry, sizeof (entry));
/* Open netgroup. */ /* Open netgroup. */
status = (*setfct) (current_group, &entry); status = (*setfct.f) (current_group, &entry);
if (status == NSS_STATUS_SUCCESS if (status == NSS_STATUS_SUCCESS
&& __nss_lookup (&nip, "getnetgrent_r", (void **) &getfct) == 0) && __nss_lookup (&nip, "getnetgrent_r", &getfct.ptr) == 0)
{ {
char buffer[1024]; char buffer[1024];
while ((*getfct) (&entry, buffer, sizeof buffer, &errno) while ((*getfct.f) (&entry, buffer, sizeof buffer, &errno)
== NSS_STATUS_SUCCESS) == NSS_STATUS_SUCCESS)
{ {
if (entry.type == group_val) if (entry.type == group_val)
@ -389,12 +413,12 @@ innetgr (const char *netgroup, const char *host, const char *user,
} }
/* Free all resources of the service. */ /* Free all resources of the service. */
if (__nss_lookup (&nip, "endnetgrent", (void **) &endfct) == 0) if (__nss_lookup (&nip, "endnetgrent", &endfct.ptr) == 0)
(*endfct) (&entry); (*endfct.f) (&entry);
/* Look for the next service. */ /* Look for the next service. */
no_more = __nss_next (&nip, "setnetgrent", no_more = __nss_next (&nip, "setnetgrent",
(void **) &setfct, status, 0); &setfct.ptr, status, 0);
} }
if (result == 0 && needed != NULL) if (result == 0 && needed != NULL)

View File

@ -32,30 +32,30 @@
#endif #endif
/*******************************************************************\ /*******************************************************************\
|* Here we assume several symbols to be defined: *| |* Here we assume several symbols to be defined: *|
|* *| |* *|
|* LOOKUP_TYPE - the return type of the function *| |* LOOKUP_TYPE - the return type of the function *|
|* *| |* *|
|* FUNCTION_NAME - name of the non-reentrant function *| |* FUNCTION_NAME - name of the non-reentrant function *|
|* *| |* *|
|* DATABASE_NAME - name of the database the function accesses *| |* DATABASE_NAME - name of the database the function accesses *|
|* (e.g., host, services, ...) *| |* (e.g., host, services, ...) *|
|* *| |* *|
|* ADD_PARAMS - additional parameter, can vary in number *| |* ADD_PARAMS - additional parameter, can vary in number *|
|* *| |* *|
|* ADD_VARIABLES - names of additional parameter *| |* ADD_VARIABLES - names of additional parameter *|
|* *| |* *|
|* Optionally the following vars can be defined: *| |* Optionally the following vars can be defined: *|
|* *| |* *|
|* NEED_H_ERRNO - an extra parameter will be passed to point to *| |* NEED_H_ERRNO - an extra parameter will be passed to point to *|
|* the global `h_errno' variable. *| |* the global `h_errno' variable. *|
|* *| |* *|
|* NEED__RES - the global _res variable might be used so we *| |* NEED__RES - the global _res variable might be used so we *|
|* will have to initialize it if necessary *| |* will have to initialize it if necessary *|
|* *| |* *|
|* PREPROCESS - code run before anything else *| |* PREPROCESS - code run before anything else *|
|* *| |* *|
|* POSTPROCESS - code run after the lookup *| |* POSTPROCESS - code run after the lookup *|
|* *| |* *|
\*******************************************************************/ \*******************************************************************/
/* To make the real sources a bit prettier. */ /* To make the real sources a bit prettier. */
@ -130,7 +130,12 @@ INTERNAL (REENTRANT_NAME) (ADD_PARAMS, LOOKUP_TYPE *resbuf, char *buffer,
static service_user *startp; static service_user *startp;
static lookup_function start_fct; static lookup_function start_fct;
service_user *nip; service_user *nip;
lookup_function fct; union
{
lookup_function l;
void *ptr;
} fct;
int no_more; int no_more;
enum nss_status status = NSS_STATUS_UNAVAIL; enum nss_status status = NSS_STATUS_UNAVAIL;
#ifdef USE_NSCD #ifdef USE_NSCD
@ -175,13 +180,13 @@ INTERNAL (REENTRANT_NAME) (ADD_PARAMS, LOOKUP_TYPE *resbuf, char *buffer,
if (startp == NULL) if (startp == NULL)
{ {
no_more = DB_LOOKUP_FCT (&nip, REENTRANT_NAME_STRING, (void **) &fct); no_more = DB_LOOKUP_FCT (&nip, REENTRANT_NAME_STRING, &fct.ptr);
if (no_more) if (no_more)
startp = (service_user *) -1l; startp = (service_user *) -1l;
else else
{ {
startp = nip; startp = nip;
start_fct = fct; start_fct = fct.l;
#ifdef NEED__RES #ifdef NEED__RES
/* The resolver code will really be used so we have to /* The resolver code will really be used so we have to
@ -201,7 +206,7 @@ INTERNAL (REENTRANT_NAME) (ADD_PARAMS, LOOKUP_TYPE *resbuf, char *buffer,
} }
else else
{ {
fct = start_fct; fct.l = start_fct;
no_more = (nip = startp) == (service_user *) -1l; no_more = (nip = startp) == (service_user *) -1l;
} }
@ -211,8 +216,8 @@ INTERNAL (REENTRANT_NAME) (ADD_PARAMS, LOOKUP_TYPE *resbuf, char *buffer,
any_service = true; any_service = true;
#endif #endif
status = DL_CALL_FCT (fct, (ADD_VARIABLES, resbuf, buffer, buflen, status = DL_CALL_FCT (fct.l, (ADD_VARIABLES, resbuf, buffer, buflen,
&errno H_ERRNO_VAR)); &errno H_ERRNO_VAR));
/* The status is NSS_STATUS_TRYAGAIN and errno is ERANGE the /* The status is NSS_STATUS_TRYAGAIN and errno is ERANGE the
provided buffer is too small. In this case we should give provided buffer is too small. In this case we should give
@ -227,7 +232,7 @@ INTERNAL (REENTRANT_NAME) (ADD_PARAMS, LOOKUP_TYPE *resbuf, char *buffer,
break; break;
no_more = __nss_next (&nip, REENTRANT_NAME_STRING, no_more = __nss_next (&nip, REENTRANT_NAME_STRING,
(void **) &fct, status, 0); &fct.ptr, status, 0);
} }
#ifdef HANDLE_DIGITS_DOTS #ifdef HANDLE_DIGITS_DOTS
@ -262,7 +267,7 @@ OLD (REENTRANT_NAME) (ADD_PARAMS, LOOKUP_TYPE *resbuf, char *buffer,
size_t buflen, LOOKUP_TYPE **result H_ERRNO_PARM) size_t buflen, LOOKUP_TYPE **result H_ERRNO_PARM)
{ {
int ret = INTERNAL (REENTRANT_NAME) (ADD_VARIABLES, resbuf, buffer, int ret = INTERNAL (REENTRANT_NAME) (ADD_VARIABLES, resbuf, buffer,
buflen, result H_ERRNO_VAR); buflen, result H_ERRNO_VAR);
if (ret != 0) if (ret != 0)
ret = -1; ret = -1;

View File

@ -70,7 +70,11 @@ LOOKUP_TYPE *
GETFUNC_NAME (void) GETFUNC_NAME (void)
{ {
static size_t buffer_size; static size_t buffer_size;
static LOOKUP_TYPE resbuf; static union
{
LOOKUP_TYPE l;
void *ptr;
} resbuf;
LOOKUP_TYPE *result; LOOKUP_TYPE *result;
int save; int save;
@ -79,7 +83,7 @@ GETFUNC_NAME (void)
result = (LOOKUP_TYPE *) result = (LOOKUP_TYPE *)
__nss_getent ((getent_r_function) INTERNAL (REENTRANT_GETNAME), __nss_getent ((getent_r_function) INTERNAL (REENTRANT_GETNAME),
(void **) &resbuf, &buffer, BUFLEN, &buffer_size, &resbuf.ptr, &buffer, BUFLEN, &buffer_size,
H_ERRNO_VAR); H_ERRNO_VAR);
save = errno; save = errno;

View File

@ -53,7 +53,11 @@ __nss_setent (const char *func_name, db_lookup_function lookup_fct,
service_user **last_nip, int stayopen, int *stayopen_tmp, service_user **last_nip, int stayopen, int *stayopen_tmp,
int res) int res)
{ {
setent_function fct; union
{
setent_function f;
void *ptr;
} fct;
int no_more; int no_more;
if (res && (_res.options & RES_INIT) == 0 if (res && (_res.options & RES_INIT) == 0
@ -65,7 +69,7 @@ __nss_setent (const char *func_name, db_lookup_function lookup_fct,
/* Cycle through the services and run their `setXXent' functions until /* Cycle through the services and run their `setXXent' functions until
we find an available service. */ we find an available service. */
no_more = setup (func_name, lookup_fct, (void **) &fct, nip, no_more = setup (func_name, lookup_fct, &fct.ptr, nip,
startp, 1); startp, 1);
while (! no_more) while (! no_more)
{ {
@ -73,11 +77,11 @@ __nss_setent (const char *func_name, db_lookup_function lookup_fct,
enum nss_status status; enum nss_status status;
if (stayopen_tmp) if (stayopen_tmp)
status = DL_CALL_FCT (fct, (*stayopen_tmp)); status = DL_CALL_FCT (fct.f, (*stayopen_tmp));
else else
status = DL_CALL_FCT (fct, (0)); status = DL_CALL_FCT (fct.f, (0));
no_more = __nss_next (nip, func_name, (void **) &fct, no_more = __nss_next (nip, func_name, &fct.ptr,
status, 0); status, 0);
if (is_last_nip) if (is_last_nip)
*last_nip = *nip; *last_nip = *nip;
@ -93,7 +97,11 @@ __nss_endent (const char *func_name, db_lookup_function lookup_fct,
service_user **nip, service_user **startp, service_user **nip, service_user **startp,
service_user **last_nip, int res) service_user **last_nip, int res)
{ {
endent_function fct; union
{
endent_function f;
void *ptr;
} fct;
int no_more; int no_more;
if (res && (_res.options & RES_INIT) == 0 if (res && (_res.options & RES_INIT) == 0
@ -104,17 +112,17 @@ __nss_endent (const char *func_name, db_lookup_function lookup_fct,
} }
/* Cycle through all the services and run their endXXent functions. */ /* Cycle through all the services and run their endXXent functions. */
no_more = setup (func_name, lookup_fct, (void **) &fct, nip, startp, 1); no_more = setup (func_name, lookup_fct, &fct.ptr, nip, startp, 1);
while (! no_more) while (! no_more)
{ {
/* Ignore status, we force check in __NSS_NEXT. */ /* Ignore status, we force check in __NSS_NEXT. */
DL_CALL_FCT (fct, ()); DL_CALL_FCT (fct.f, ());
if (*nip == *last_nip) if (*nip == *last_nip)
/* We have processed all services which were used. */ /* We have processed all services which were used. */
break; break;
no_more = __nss_next (nip, func_name, (void **) &fct, 0, 1); no_more = __nss_next (nip, func_name, &fct.ptr, 0, 1);
} }
*last_nip = *nip = NULL; *last_nip = *nip = NULL;
} }
@ -129,7 +137,11 @@ __nss_getent_r (const char *getent_func_name,
void *resbuf, char *buffer, size_t buflen, void *resbuf, char *buffer, size_t buflen,
void **result, int *h_errnop) void **result, int *h_errnop)
{ {
getent_function fct; union
{
getent_function f;
void *ptr;
} fct;
int no_more; int no_more;
enum nss_status status; enum nss_status status;
@ -147,14 +159,14 @@ __nss_getent_r (const char *getent_func_name,
/* Run through available functions, starting with the same function last /* Run through available functions, starting with the same function last
run. We will repeat each function as long as it succeeds, and then go run. We will repeat each function as long as it succeeds, and then go
on to the next service action. */ on to the next service action. */
no_more = setup (getent_func_name, lookup_fct, (void **) &fct, nip, no_more = setup (getent_func_name, lookup_fct, &fct.ptr, nip,
startp, 0); startp, 0);
while (! no_more) while (! no_more)
{ {
int is_last_nip = *nip == *last_nip; int is_last_nip = *nip == *last_nip;
status = DL_CALL_FCT (fct, status = DL_CALL_FCT (fct.f,
(resbuf, buffer, buflen, &errno, &h_errno)); (resbuf, buffer, buflen, &errno, &h_errno));
/* The the status is NSS_STATUS_TRYAGAIN and errno is ERANGE the /* The the status is NSS_STATUS_TRYAGAIN and errno is ERANGE the
provided buffer is too small. In this case we should give provided buffer is too small. In this case we should give
@ -168,7 +180,7 @@ __nss_getent_r (const char *getent_func_name,
do do
{ {
no_more = __nss_next (nip, getent_func_name, (void **) &fct, no_more = __nss_next (nip, getent_func_name, &fct.ptr,
status, 0); status, 0);
if (is_last_nip) if (is_last_nip)
@ -177,17 +189,21 @@ __nss_getent_r (const char *getent_func_name,
if (! no_more) if (! no_more)
{ {
/* Call the `setXXent' function. This wasn't done before. */ /* Call the `setXXent' function. This wasn't done before. */
setent_function sfct; union
{
setent_function f;
void *ptr;
} sfct;
no_more = __nss_lookup (nip, setent_func_name, no_more = __nss_lookup (nip, setent_func_name,
(void **) &sfct); &sfct.ptr);
if (! no_more) if (! no_more)
{ {
if (stayopen_tmp) if (stayopen_tmp)
status = DL_CALL_FCT (sfct, (*stayopen_tmp)); status = DL_CALL_FCT (sfct.f, (*stayopen_tmp));
else else
status = DL_CALL_FCT (sfct, (0)); status = DL_CALL_FCT (sfct.f, (0));
} }
else else
status = NSS_STATUS_NOTFOUND; status = NSS_STATUS_NOTFOUND;

View File

@ -147,32 +147,36 @@ netname2user (const char netname[MAXNETNAMELEN + 1], uid_t * uidp, gid_t * gidp,
static service_user *startp; static service_user *startp;
static netname2user_function start_fct; static netname2user_function start_fct;
service_user *nip; service_user *nip;
netname2user_function fct; union
{
netname2user_function f;
void *ptr;
} fct;
enum nss_status status = NSS_STATUS_UNAVAIL; enum nss_status status = NSS_STATUS_UNAVAIL;
int no_more; int no_more;
if (startp == NULL) if (startp == NULL)
{ {
no_more = __nss_publickey_lookup (&nip, "netname2user", (void **) &fct); no_more = __nss_publickey_lookup (&nip, "netname2user", &fct.ptr);
if (no_more) if (no_more)
startp = (service_user *) - 1; startp = (service_user *) - 1;
else else
{ {
startp = nip; startp = nip;
start_fct = fct; start_fct = fct.f;
} }
} }
else else
{ {
fct = start_fct; fct.f = start_fct;
no_more = (nip = startp) == (service_user *) - 1; no_more = (nip = startp) == (service_user *) - 1;
} }
while (!no_more) while (!no_more)
{ {
status = (*fct) (netname, uidp, gidp, gidlenp, gidlist); status = (*fct.f) (netname, uidp, gidp, gidlenp, gidlist);
no_more = __nss_next (&nip, "netname2user", (void **) &fct, status, 0); no_more = __nss_next (&nip, "netname2user", &fct.ptr, status, 0);
} }
return status == NSS_STATUS_SUCCESS; return status == NSS_STATUS_SUCCESS;

View File

@ -42,32 +42,36 @@ getpublickey (const char *name, char *key)
static service_user *startp; static service_user *startp;
static public_function start_fct; static public_function start_fct;
service_user *nip; service_user *nip;
public_function fct; union
{
public_function f;
void *ptr;
} fct;
enum nss_status status = NSS_STATUS_UNAVAIL; enum nss_status status = NSS_STATUS_UNAVAIL;
int no_more; int no_more;
if (startp == NULL) if (startp == NULL)
{ {
no_more = __nss_publickey_lookup (&nip, "getpublickey", (void **) &fct); no_more = __nss_publickey_lookup (&nip, "getpublickey", &fct.ptr);
if (no_more) if (no_more)
startp = (service_user *) -1; startp = (service_user *) -1;
else else
{ {
startp = nip; startp = nip;
start_fct = fct; start_fct = fct.f;
} }
} }
else else
{ {
fct = start_fct; fct.f = start_fct;
no_more = (nip = startp) == (service_user *) -1; no_more = (nip = startp) == (service_user *) -1;
} }
while (! no_more) while (! no_more)
{ {
status = (*fct) (name, key, &errno); status = (*fct.f) (name, key, &errno);
no_more = __nss_next (&nip, "getpublickey", (void **) &fct, status, 0); no_more = __nss_next (&nip, "getpublickey", &fct.ptr, status, 0);
} }
return status == NSS_STATUS_SUCCESS; return status == NSS_STATUS_SUCCESS;
@ -81,32 +85,36 @@ getsecretkey (const char *name, char *key, const char *passwd)
static service_user *startp; static service_user *startp;
static secret_function start_fct; static secret_function start_fct;
service_user *nip; service_user *nip;
secret_function fct; union
{
secret_function f;
void *ptr;
} fct;
enum nss_status status = NSS_STATUS_UNAVAIL; enum nss_status status = NSS_STATUS_UNAVAIL;
int no_more; int no_more;
if (startp == NULL) if (startp == NULL)
{ {
no_more = __nss_publickey_lookup (&nip, "getsecretkey", (void **) &fct); no_more = __nss_publickey_lookup (&nip, "getsecretkey", &fct.ptr);
if (no_more) if (no_more)
startp = (service_user *) -1; startp = (service_user *) -1;
else else
{ {
startp = nip; startp = nip;
start_fct = fct; start_fct = fct.f;
} }
} }
else else
{ {
fct = start_fct; fct.f = start_fct;
no_more = (nip = startp) == (service_user *) -1; no_more = (nip = startp) == (service_user *) -1;
} }
while (! no_more) while (! no_more)
{ {
status = (*fct) (name, key, passwd, &errno); status = (*fct.f) (name, key, passwd, &errno);
no_more = __nss_next (&nip, "getsecretkey", (void **) &fct, status, 0); no_more = __nss_next (&nip, "getsecretkey", &fct.ptr, status, 0);
} }
return status == NSS_STATUS_SUCCESS; return status == NSS_STATUS_SUCCESS;