Imported from ../bash-2.05a.tar.gz.
[platform/upstream/bash.git] / builtins / command.def
index 3a14dc6..28515be 100644 (file)
@@ -7,7 +7,7 @@ This file is part of GNU Bash, the Bourne Again SHell.
 
 Bash is free software; you can redistribute it and/or modify it under
 the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 1, or (at your option) any later
+Software Foundation; either version 2, or (at your option) any later
 version.
 
 Bash is distributed in the hope that it will be useful, but WITHOUT ANY
@@ -17,7 +17,7 @@ for more details.
 
 You should have received a copy of the GNU General Public License along
 with Bash; see the file COPYING.  If not, write to the Free Software
-Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA.
 
 $PRODUCES command.c
 
@@ -35,6 +35,9 @@ $END
 #include <config.h>
 
 #if defined (HAVE_UNISTD_H)
+#  ifdef _MINIX
+#    include <sys/types.h>
+#  endif
 #  include <unistd.h>
 #endif
 
@@ -46,10 +49,14 @@ $END
 #include "bashgetopt.h"
 #include "common.h"
 
+#if defined (_CS_PATH) && defined (HAVE_CONFSTR) && !HAVE_DECL_CONFSTR
+extern size_t confstr __P((int, char *, size_t));
+#endif
+
 extern int subshell_environment;
 
-static void restore_path ();
-static char *get_standard_path ();
+static void restore_path __P((char *));
+static char *get_standard_path __P((void));
 
 /* Run the commands mentioned in LIST without paying attention to shell
    functions. */
@@ -117,13 +124,10 @@ command_builtin (list)
   if (use_standard_path)
     {      
       old_path = get_string_value ("PATH");
+      /* If old_path is NULL, $PATH is unset.  If so, we want to make sure
+        it's unset after this command completes. */
       if (old_path)
        old_path = savestring (old_path);
-      else
-       {
-         old_path = xmalloc (1);
-         old_path[0] = '\0';
-       }
       add_unwind_protect ((Function *)restore_path, old_path);
 
       standard_path = get_standard_path ();
@@ -131,11 +135,13 @@ command_builtin (list)
       FREE (standard_path);
     }
 
+#define COMMAND_BUILTIN_FLAGS (CMD_NO_FUNCTIONS | CMD_INHIBIT_EXPANSION | CMD_COMMAND_BUILTIN)
+
   command = make_bare_simple_command ();
   command->value.Simple->words = (WORD_LIST *)copy_word_list (list);
   command->value.Simple->redirects = (REDIRECT *)NULL;
-  command->flags |= (CMD_NO_FUNCTIONS | CMD_INHIBIT_EXPANSION);
-  command->value.Simple->flags |= (CMD_NO_FUNCTIONS | CMD_INHIBIT_EXPANSION);
+  command->flags |= COMMAND_BUILTIN_FLAGS;
+  command->value.Simple->flags |= COMMAND_BUILTIN_FLAGS;
 #if 0
   /* This breaks for things like ( cd /tmp ; command z ababa ; echo next )
      or $(command echo a ; command echo b;) or even
@@ -162,8 +168,13 @@ static void
 restore_path (var)
      char *var;
 {
-  bind_variable ("PATH", var);
-  free (var);
+  if (var)
+    {
+      bind_variable ("PATH", var);
+      free (var);
+    }
+  else
+    unbind_variable ("PATH");
 }
 
 /* Return a value for PATH that is guaranteed to find all of the standard
@@ -177,11 +188,16 @@ get_standard_path ()
   size_t len;
 
   len = (size_t)confstr (_CS_PATH, (char *)NULL, (size_t)0);
-  p = xmalloc ((int)len + 2);
-  *p = '\0';
-  confstr (_CS_PATH, p, len);
-  return (p);
-#else /* !_CSPATH || !HAVE_CONFSTR  */
+  if (len > 0)
+    {
+      p = (char *)xmalloc (len + 2);
+      *p = '\0';
+      confstr (_CS_PATH, p, len);
+      return (p);
+    }
+  else
+    return (savestring (STANDARD_UTILS_PATH));
+#else /* !_CS_PATH || !HAVE_CONFSTR  */
 #  if defined (CS_PATH)
   return (savestring (CS_PATH));
 #  else