diff --git a/ChangeLog b/ChangeLog index 7e3d6fe841..c1181c7924 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +1999-07-09 Ulrich Drepper + + * hesiod/Versions [GLIBC_2.2]: Add _nss_hesiod_initgroups. + * hesiod/hesiod-grp.c: Add initgroups support. + Patch by Nalin Dahyabhai . + 1999-07-08 Andreas Schwab * libio/iofopncook.c (fopencookie): Set _fileno to -2. diff --git a/FAQ.in b/FAQ.in index 72b3ad38c2..b368744f1f 100644 --- a/FAQ.in +++ b/FAQ.in @@ -342,6 +342,23 @@ against the previous version of the GNU libc (version 2.0) but also against all future versions. +?? How can I compile on my fast ix86 machine a working libc for my slow + i386? After installing libc, programs abort with "Illegal + Instruction". + +{AJ} glibc and gcc might generate some instructions on your machine that +aren't available on i386. You've got to tell glibc that you're configuring +for i386 with adding i386 as your machine, for example: + + ../configure --prefix=/usr i386-pc-linux-gnu + +And you need to tell gcc to only generate i386 code, just add `-mcpu=i386' +(just -m386 doesn't work) to your CFLAGS. + +{UD} This applies not only to the i386. Compiling on a i686 for any older +model will also fail if the above methods are not used. + + ? Installation and configuration issues ?? Can I replace the libc on my Linux system with GNU libc? diff --git a/hesiod/nss_hesiod/hesiod-grp.c b/hesiod/nss_hesiod/hesiod-grp.c index e08b9dca8c..c0b56ac214 100644 --- a/hesiod/nss_hesiod/hesiod-grp.c +++ b/hesiod/nss_hesiod/hesiod-grp.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1997 Free Software Foundation, Inc. +/* Copyright (C) 1997, 1999 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Mark Kettenis , 1997. @@ -17,14 +17,15 @@ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#include +#include #include -#include -#include #include +#include #include #include #include +#include +#include /* Get the declaration of the parser function. */ #define ENTNAME grent @@ -150,3 +151,111 @@ _nss_hesiod_getgrgid_r (gid_t gid, struct group *grp, return status; } + +static int +internal_gid_in_list (const gid_t *list, const gid_t g, long int len) +{ + while (len > 0) + { + if (*list == g) + return 1; + --len; + ++list; + } + return 0; +} + +static enum nss_status +internal_gid_from_group (void *context, const char *groupname, gid_t *group) +{ + char **grp_res; + enum nss_status status = NSS_STATUS_NOTFOUND; + + grp_res = hesiod_resolve (context, groupname, "group"); + if (grp_res != NULL && *grp_res != NULL) + { + char *p = *grp_res; + + while (*p != '\0' && *p != ':') + ++p; + while (*p != '\0' && *p == ':') + ++p; + while (*p != '\0' && *p != ':') + ++p; + while (*p != '\0' && *p == ':') + ++p; + if (*p == ':') + { + char *endp; + char *q = ++p; + + q = p; + while (*q != '\0' && *q != ':') + ++q; + + *group = strtol (p, &endp, 10); + if (endp == q && endp != p) + status = NSS_STATUS_SUCCESS; + } + hesiod_free_list (context, grp_res); + } + return status; +} + +enum nss_status +_nss_hesiod_initgroups (const char *user, gid_t group, long int *start, + long int *size, gid_t *groups, long int limit, + int *errnop) +{ + enum nss_status status = NSS_STATUS_SUCCESS; + char **list = NULL; + char *p; + void *context; + + if (hesiod_init (&context) == -1) + return NSS_STATUS_UNAVAIL; + + list = hesiod_resolve (context, user, "grplist"); + + if (list == NULL) + { + hesiod_end(context); + return errno == ENOENT ? NSS_STATUS_NOTFOUND : NSS_STATUS_UNAVAIL; + } + + if (!internal_gid_in_list (groups, group, *start) && *start < limit) + groups[(*start)++] = group; + + p = *list; + while (*p != '\0' && *start < limit) + { + char *endp; + char *q; + + status = NSS_STATUS_NOTFOUND; + + q = p; + while (*q != '\0' && *q != ':') + ++q; + + if (*q != '\0') + *q++ = '\0'; + + group = strtol (p, &endp, 10); + if (*endp == '\0' && endp != p) + status = NSS_STATUS_SUCCESS; + else + status = internal_gid_from_group (context, p, &group); + + if (status == NSS_STATUS_SUCCESS + && !internal_gid_in_list (groups, group, *start)) + groups[(*start)++] = group; + + p = q; + } + + hesiod_free_list (context, list); + hesiod_end(context); + + return NSS_STATUS_SUCCESS; +} diff --git a/sysdeps/unix/sysv/linux/configure b/sysdeps/unix/sysv/linux/configure index 64f2ce0638..2e3ba901e1 100644 --- a/sysdeps/unix/sysv/linux/configure +++ b/sysdeps/unix/sysv/linux/configure @@ -13,7 +13,7 @@ if test -n "$sysheaders"; then fi echo $ac_n "checking installed Linux kernel header files""... $ac_c" 1>&6 echo "configure:16: checking installed Linux kernel header files" >&5 -if eval "test \"\${libc_cv_linux2010+set}\" = set"; then +if eval "test \"`echo '$''{'libc_cv_linux2010'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <