about summary refs log tree commit diff
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