* Fix for dir.c from Andreas Schwab.
* Fix += target-specific variables: if your direct parent doesn't have a
  setting for the variable but his parent does, you'll get recursive
  expansion errors.
diff --git a/ChangeLog b/ChangeLog
index 2988bd4..3888642 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,31 @@
+2000-02-07  Paul D. Smith  <psmith@gnu.org>
+
+	For += target-specific variables we need to remember which
+	variable set we found the variable in, so we can start looking
+	there in the next iteration (otherwise we'll see it again in
+	recursively_expand and fail!).  This is getting to be a hack; if
+	it gets any worse we'll have to rethink this entire algorithm;
+	probably implementing expansion of these separately from the
+	"normal" expansion, instead of alongside.
+
+	* variable.h (recursively_expand_setlist): Rename
+	recursively_expand to add a struct variable_set_list argument, and
+	make a macro for recursively_expand.
+	(lookup_variable_setlist): Rename lookup_variable to add a struct
+	variable_set_list argument, and make a macro for lookup_variable.
+
+	* expand.c (recursively_expand_setlist): Take an extra struct
+	variable_set_list argument and pass it to
+	allocated_variable_append().
+	(reference_variable): Use lookup_variable_setlist() and pass the
+	returned variable_set_list to recursively_expand_setlist.
+	(allocated_variable_append): Take an extra setlist argument and
+	use this as the starting place when searching for the appended
+	expansion.  If it's null, use current_variable_set_list as before.
+
+	* variable.c (lookup_variable_setlist): If the LISTP argument is
+	not nil, return the list where we found the variable in it.
+
 2000-02-04  Paul D. Smith  <psmith@gnu.org>
 
 	* variable.c (print_variable): Write out filename/linenumber
@@ -130,6 +158,10 @@
 	* variable.c, vmsdir.h, vmsfunctions.c, vmsify.c, glob/glob.c:
 	* glob/glob.h: Installed patches.  See readme.vms for details.
 
+2000-01-14  Andreas Schwab  <schwab@suse.de>
+
+	* dir.c (read_dirstream): Initialize d_type if it exists.
+
 2000-01-11  Paul D. Smith  <psmith@gnu.org>
 
 	Resolve PR/xxxx: don't automatically evaluate the $(call ...)
@@ -137,7 +169,7 @@
 	protocol to always use simple nul-terminated strings, instead of
 	sometimes using offset pointers to mark the end of arguments.
 	This change also fixes PR/1517.
-	Both PR's by Damien GIBOU <damien.gibou@st.com>.
+	Reported by Damien GIBOU <damien.gibou@st.com>.
 
 	* function.c (struct function_table_entry): Remove the negative
 	required_args hack; put in explicit min and max # of arguments.
@@ -173,7 +205,7 @@
 	* implicit.c (pattern_search): Remove the extra check of the
 	implicit flag added on 8/24/1998.  This causes problems and the
 	reason for the change was better resolved by the change made to
-	check_deps() on 8/26/1998.  This fixes PR/1423.
+	check_deps() on 1998-08-26.  This fixes PR/1423.
 
 1999-12-08  Paul D. Smith  <psmith@gnu.org>
 
diff --git a/dir.c b/dir.c
index caa8042..9221c44 100644
--- a/dir.c
+++ b/dir.c
@@ -1059,6 +1059,9 @@
 #ifdef _DIRENT_HAVE_D_NAMLEN
 	      d->d_namlen = len - 1;
 #endif
+#ifdef _DIRENT_HAVE_D_TYPE
+	      d->d_type = DT_UNKNOWN;
+#endif
 	      memcpy (d->d_name, df->name, len);
 	      return d;
 	    }
@@ -1079,19 +1082,33 @@
       free(p);
 }
 
+/* On 64 bit ReliantUNIX (5.44 and above) in LFS mode, stat() is actually a
+ * macro for stat64().  If stat is a macro, make a local wrapper function to
+ * invoke it.
+ */
+#ifndef stat
+# ifndef VMS
+extern int stat ();
+# endif
+# define local_stat stat
+#else
+static int local_stat (path, buf)
+    char *path;
+    struct stat *buf;
+{
+  return stat (path, buf);
+}
+#endif
+
 void
 dir_setup_glob (gl)
      glob_t *gl;
 {
-#ifndef VMS
-  extern int stat ();
-#endif
-
   /* Bogus sunos4 compiler complains (!) about & before functions.  */
   gl->gl_opendir = open_dirstream;
   gl->gl_readdir = read_dirstream;
   gl->gl_closedir = ansi_free;
-  gl->gl_stat = stat;
+  gl->gl_stat = local_stat;
   /* We don't bother setting gl_lstat, since glob never calls it.
      The slot is only there for compatibility with 4.4 BSD.  */
 }
diff --git a/expand.c b/expand.c
index f15da02..070b893 100644
--- a/expand.c
+++ b/expand.c
@@ -91,11 +91,13 @@
 
 /* Recursively expand V.  The returned string is malloc'd.  */
 
-static char *allocated_variable_append PARAMS ((struct variable *v));
+static char *allocated_variable_append PARAMS ((struct variable *v,
+                                                struct variable_set_list *l));
 
 char *
-recursively_expand (v)
+recursively_expand_setlist (v, list)
      register struct variable *v;
+     struct variable_set_list *list;
 {
   char *value;
 
@@ -107,7 +109,7 @@
 
   v->expanding = 1;
   if (v->append)
-    value = allocated_variable_append (v);
+    value = allocated_variable_append (v, list);
   else
     value = allocated_variable_expand (v->value);
   v->expanding = 0;
@@ -141,16 +143,19 @@
      char *name;
      unsigned int length;
 {
-  register struct variable *v = lookup_variable (name, length);
+  register struct variable *v;
+  struct variable_set_list *setlist;
   char *value;
 
+  v = lookup_variable_setlist (name, length, &setlist);
+
   if (v == 0)
     warn_undefined (name, length);
 
   if (v == 0 || *v->value == '\0')
     return o;
 
-  value = (v->recursive ? recursively_expand (v) : v->value);
+  value = (v->recursive ? recursively_expand_setlist (v, setlist) : v->value);
 
   o = variable_buffer_output (o, value, strlen (value));
 
@@ -467,8 +472,9 @@
     context of the next variable set, then we append the expanded value.  */
 
 static char *
-allocated_variable_append (v)
+allocated_variable_append (v, list)
      struct variable *v;
+     struct variable_set_list *list;
 {
   struct variable_set_list *save;
   int len = strlen (v->name);
@@ -480,9 +486,12 @@
 
   variable_buffer = 0;
 
-  assert(current_variable_set_list->next != 0);
+  if (!list)
+    list = current_variable_set_list;
+
+  assert(list->next != 0);
   save = current_variable_set_list;
-  current_variable_set_list = current_variable_set_list->next;
+  current_variable_set_list = list->next;
 
   var[0] = '$';
   var[1] = '(';
diff --git a/variable.c b/variable.c
index 58af121..5089657 100644
--- a/variable.c
+++ b/variable.c
@@ -134,12 +134,17 @@
 /* Lookup a variable whose name is a string starting at NAME
    and with LENGTH chars.  NAME need not be null-terminated.
    Returns address of the `struct variable' containing all info
-   on the variable, or nil if no such variable is defined.  */
+   on the variable, or nil if no such variable is defined.
+
+   If LISTP is not nil, return a pointer to the setlist where
+   the variable was found.  If the variable wasn't found, the
+   value of LISTP is unchanged.  */
 
 struct variable *
-lookup_variable (name, length)
+lookup_variable_setlist (name, length, listp)
      char *name;
      unsigned int length;
+     struct variable_set_list **listp;
 {
   register struct variable_set_list *setlist;
 
@@ -160,7 +165,11 @@
 	if (*v->name == *name
 	    && strneq (v->name + 1, name + 1, length - 1)
 	    && v->name[length] == 0)
-	  return v;
+          {
+            if (listp)
+              *listp = setlist;
+            return v;
+          }
     }
 
 #ifdef VMS
@@ -181,6 +190,9 @@
 	  sptr = value;
 	  scnt = 0;
 
+          if (listp)
+            *listp = current_variable_set_list;
+
 	  while ((sptr = strchr (sptr, '$')))
 	    {
 	      scnt++;
diff --git a/variable.h b/variable.h
index d449ef8..4c707dc 100644
--- a/variable.h
+++ b/variable.h
@@ -95,7 +95,10 @@
 		char *pattern_percent, char *replace_percent));
 
 /* expand.c */
-extern char *recursively_expand PARAMS ((struct variable *v));
+extern char *recursively_expand_setlist PARAMS ((struct variable *v,
+                                                 struct variable_set_list *l));
+
+#define recursively_expand(v) recursively_expand_setlist((v),(struct variable_set_list *)0)
 
 /* variable.c */
 extern struct variable_set_list *create_new_variable_set PARAMS ((void));
@@ -108,7 +111,12 @@
 extern void merge_variable_set_lists PARAMS ((struct variable_set_list **setlist0, struct variable_set_list *setlist1));
 extern struct variable *try_variable_definition PARAMS ((const struct floc *flocp, char *line, enum variable_origin origin, int target_var));
 
-extern struct variable *lookup_variable PARAMS ((char *name, unsigned int length));
+extern struct variable *lookup_variable_setlist
+    PARAMS ((char *name, unsigned int length,
+             struct variable_set_list **lisp));
+
+#define lookup_variable(n,l) lookup_variable_setlist((n),(l),\
+                                                (struct variable_set_list **)0)
 
 extern struct variable *define_variable_in_set
     PARAMS ((char *name, unsigned int length, char *value,