Update.
1998-08-21 Thorsten Kukuk <kukuk@vt.uni-paderborn.de> * nis/nss_compat/compat-initgroups.c: Optimize NIS query.
This commit is contained in:
parent
5148d49f37
commit
e36b0b570c
|
@ -1,3 +1,7 @@
|
||||||
|
1998-08-21 Thorsten Kukuk <kukuk@vt.uni-paderborn.de>
|
||||||
|
|
||||||
|
* nis/nss_compat/compat-initgroups.c: Optimize NIS query.
|
||||||
|
|
||||||
1998-08-21 17:21 Ulrich Drepper <drepper@cygnus.com>
|
1998-08-21 17:21 Ulrich Drepper <drepper@cygnus.com>
|
||||||
|
|
||||||
* sysdeps/unix/sysv/linux/glob64.c: Define __stat using __xstat64.
|
* sysdeps/unix/sysv/linux/glob64.c: Define __stat using __xstat64.
|
||||||
|
|
|
@ -29,6 +29,7 @@
|
||||||
#include <rpcsvc/nis.h>
|
#include <rpcsvc/nis.h>
|
||||||
#include <nsswitch.h>
|
#include <nsswitch.h>
|
||||||
|
|
||||||
|
#include "nss-nis.h"
|
||||||
#include "nss-nisplus.h"
|
#include "nss-nisplus.h"
|
||||||
#include "nisplus-parser.h"
|
#include "nisplus-parser.h"
|
||||||
|
|
||||||
|
@ -53,6 +54,12 @@ struct blacklist_t
|
||||||
int size;
|
int size;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct response_t
|
||||||
|
{
|
||||||
|
char *val;
|
||||||
|
struct response_t *next;
|
||||||
|
};
|
||||||
|
|
||||||
struct ent_t
|
struct ent_t
|
||||||
{
|
{
|
||||||
bool_t nis;
|
bool_t nis;
|
||||||
|
@ -62,6 +69,8 @@ struct ent_t
|
||||||
nis_result *result;
|
nis_result *result;
|
||||||
FILE *stream;
|
FILE *stream;
|
||||||
struct blacklist_t blacklist;
|
struct blacklist_t blacklist;
|
||||||
|
struct response_t *start;
|
||||||
|
struct response_t *next;
|
||||||
};
|
};
|
||||||
typedef struct ent_t ent_t;
|
typedef struct ent_t ent_t;
|
||||||
|
|
||||||
|
@ -70,6 +79,36 @@ typedef struct ent_t ent_t;
|
||||||
static void blacklist_store_name (const char *, ent_t *);
|
static void blacklist_store_name (const char *, ent_t *);
|
||||||
static int in_blacklist (const char *, int, ent_t *);
|
static int in_blacklist (const char *, int, ent_t *);
|
||||||
|
|
||||||
|
static int
|
||||||
|
saveit (int instatus, char *inkey, int inkeylen, char *inval,
|
||||||
|
int invallen, char *indata)
|
||||||
|
{
|
||||||
|
ent_t *intern = (ent_t *) indata;
|
||||||
|
|
||||||
|
if (instatus != YP_TRUE)
|
||||||
|
return instatus;
|
||||||
|
|
||||||
|
if (inkey && inkeylen > 0 && inval && invallen > 0)
|
||||||
|
{
|
||||||
|
if (intern->start == NULL)
|
||||||
|
{
|
||||||
|
intern->start = malloc (sizeof (struct response_t));
|
||||||
|
intern->next = intern->start;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
intern->next->next = malloc (sizeof (struct response_t));
|
||||||
|
intern->next = intern->next->next;
|
||||||
|
}
|
||||||
|
intern->next->next = NULL;
|
||||||
|
intern->next->val = malloc (invallen + 1);
|
||||||
|
strncpy (intern->next->val, inval, invallen);
|
||||||
|
intern->next->val[invallen] = '\0';
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static enum nss_status
|
static enum nss_status
|
||||||
_nss_first_init (void)
|
_nss_first_init (void)
|
||||||
{
|
{
|
||||||
|
@ -105,6 +144,9 @@ internal_setgrent (ent_t *ent)
|
||||||
|
|
||||||
ent->nis = ent->nis_first = 0;
|
ent->nis = ent->nis_first = 0;
|
||||||
|
|
||||||
|
ent->start = NULL;
|
||||||
|
ent->next = NULL;
|
||||||
|
|
||||||
if (_nss_first_init () != NSS_STATUS_SUCCESS)
|
if (_nss_first_init () != NSS_STATUS_SUCCESS)
|
||||||
return NSS_STATUS_UNAVAIL;
|
return NSS_STATUS_UNAVAIL;
|
||||||
|
|
||||||
|
@ -197,6 +239,16 @@ internal_endgrent (ent_t *ent)
|
||||||
else
|
else
|
||||||
ent->blacklist.current = 0;
|
ent->blacklist.current = 0;
|
||||||
|
|
||||||
|
while (ent->start != NULL)
|
||||||
|
{
|
||||||
|
if (ent->start->val != NULL)
|
||||||
|
free (ent->start->val);
|
||||||
|
ent->next = ent->start;
|
||||||
|
ent->start = ent->start->next;
|
||||||
|
free (ent->next);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
return NSS_STATUS_SUCCESS;
|
return NSS_STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -205,10 +257,8 @@ getgrent_next_nis (struct group *result, ent_t *ent, char *buffer,
|
||||||
size_t buflen, int *errnop)
|
size_t buflen, int *errnop)
|
||||||
{
|
{
|
||||||
struct parser_data *data = (void *) buffer;
|
struct parser_data *data = (void *) buffer;
|
||||||
char *domain;
|
char *domain, *p;
|
||||||
char *outkey, *outval;
|
int parse_res;
|
||||||
int outkeylen, outvallen, parse_res;
|
|
||||||
char *p;
|
|
||||||
|
|
||||||
if (yp_get_default_domain (&domain) != YPERR_SUCCESS)
|
if (yp_get_default_domain (&domain) != YPERR_SUCCESS)
|
||||||
{
|
{
|
||||||
|
@ -216,85 +266,47 @@ getgrent_next_nis (struct group *result, ent_t *ent, char *buffer,
|
||||||
return NSS_STATUS_NOTFOUND;
|
return NSS_STATUS_NOTFOUND;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (ent->start == NULL)
|
||||||
|
{
|
||||||
|
struct ypall_callback ypcb;
|
||||||
|
enum nss_status status;
|
||||||
|
|
||||||
|
ypcb.foreach = saveit;
|
||||||
|
ypcb.data = (char *) ent;
|
||||||
|
status = yperr2nss (yp_all (domain, "group.byname", &ypcb));
|
||||||
|
ent->next = ent->start;
|
||||||
|
|
||||||
|
if (ent->start == NULL || status != NSS_STATUS_SUCCESS)
|
||||||
|
{
|
||||||
|
ent->nis = 0;
|
||||||
|
*errnop = ENOENT;
|
||||||
|
return NSS_STATUS_UNAVAIL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
char *save_oldkey;
|
if (ent->next == NULL)
|
||||||
int save_oldlen;
|
{
|
||||||
bool_t save_nis_first;
|
*errnop = ENOENT;
|
||||||
|
ent->nis = 0;
|
||||||
if (ent->nis_first)
|
return NSS_STATUS_NOTFOUND;
|
||||||
{
|
}
|
||||||
if (yp_first (domain, "group.byname", &outkey, &outkeylen,
|
|
||||||
&outval, &outvallen) != YPERR_SUCCESS)
|
|
||||||
{
|
|
||||||
ent->nis = 0;
|
|
||||||
*errnop = ENOENT;
|
|
||||||
return NSS_STATUS_UNAVAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( buflen < ((size_t) outvallen + 1))
|
|
||||||
{
|
|
||||||
free (outval);
|
|
||||||
*errnop = ERANGE;
|
|
||||||
return NSS_STATUS_TRYAGAIN;
|
|
||||||
}
|
|
||||||
|
|
||||||
save_oldkey = ent->oldkey;
|
|
||||||
save_oldlen = ent->oldkeylen;
|
|
||||||
save_nis_first = TRUE;
|
|
||||||
ent->oldkey = outkey;
|
|
||||||
ent->oldkeylen = outkeylen;
|
|
||||||
ent->nis_first = FALSE;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (yp_next (domain, "group.byname", ent->oldkey, ent->oldkeylen,
|
|
||||||
&outkey, &outkeylen, &outval, &outvallen)
|
|
||||||
!= YPERR_SUCCESS)
|
|
||||||
{
|
|
||||||
ent->nis = 0;
|
|
||||||
*errnop = ENOENT;
|
|
||||||
return NSS_STATUS_NOTFOUND;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( buflen < ((size_t) outvallen + 1))
|
|
||||||
{
|
|
||||||
free (outval);
|
|
||||||
*errnop = ERANGE;
|
|
||||||
return NSS_STATUS_TRYAGAIN;
|
|
||||||
}
|
|
||||||
|
|
||||||
save_oldkey = ent->oldkey;
|
|
||||||
save_oldlen = ent->oldkeylen;
|
|
||||||
save_nis_first = FALSE;
|
|
||||||
ent->oldkey = outkey;
|
|
||||||
ent->oldkeylen = outkeylen;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Copy the found data to our buffer... */
|
/* Copy the found data to our buffer... */
|
||||||
p = strncpy (buffer, outval, buflen);
|
p = strncpy (buffer, ent->next->val, buflen);
|
||||||
|
|
||||||
/* ...and free the data. */
|
|
||||||
free (outval);
|
|
||||||
|
|
||||||
while (isspace (*p))
|
while (isspace (*p))
|
||||||
++p;
|
++p;
|
||||||
|
|
||||||
parse_res = _nss_files_parse_grent (p, result, data, buflen, errnop);
|
parse_res = _nss_files_parse_grent (p, result, data, buflen, errnop);
|
||||||
if (parse_res == -1)
|
if (parse_res == -1)
|
||||||
{
|
{
|
||||||
free (ent->oldkey);
|
|
||||||
ent->oldkey = save_oldkey;
|
|
||||||
ent->oldkeylen = save_oldlen;
|
|
||||||
ent->nis_first = save_nis_first;
|
|
||||||
*errnop = ERANGE;
|
*errnop = ERANGE;
|
||||||
return NSS_STATUS_TRYAGAIN;
|
return NSS_STATUS_TRYAGAIN;
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
ent->next = ent->next->next;
|
||||||
if (!save_nis_first)
|
|
||||||
free (save_oldkey);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (parse_res &&
|
if (parse_res &&
|
||||||
in_blacklist (result->gr_name, strlen (result->gr_name), ent))
|
in_blacklist (result->gr_name, strlen (result->gr_name), ent))
|
||||||
|
|
Loading…
Reference in New Issue