aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog6
-rw-r--r--FAQ.in17
-rw-r--r--hesiod/nss_hesiod/hesiod-grp.c117
-rw-r--r--sysdeps/unix/sysv/linux/configure2
4 files changed, 137 insertions, 5 deletions
diff --git a/ChangeLog b/ChangeLog
index 7e3d6fe841..c1181c7924 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+1999-07-09 Ulrich Drepper <drepper@cygnus.com>
+
+ * hesiod/Versions [GLIBC_2.2]: Add _nss_hesiod_initgroups.
+ * hesiod/hesiod-grp.c: Add initgroups support.
+ Patch by Nalin Dahyabhai <nsdahya1@pobox.com>.
+
1999-07-08 Andreas Schwab <schwab@suse.de>
* 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 <kettenis@phys.uva.nl>, 1997.
@@ -17,14 +17,15 @@
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
-#include <bits/libc-lock.h>
+#include <ctype.h>
#include <errno.h>
-#include <hesiod.h>
-#include <nss.h>
#include <grp.h>
+#include <hesiod.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#include <nss.h>
+#include <bits/libc-lock.h>
/* 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 <<EOF