Tim Waugh 6353ab
diff -upk.orig bash-3.1.orig/builtins/mkbuiltins.c bash-3.1/builtins/mkbuiltins.c
Tim Waugh 6353ab
--- bash-3.1.orig/builtins/mkbuiltins.c	2005-09-10 16:22:12 +0000
Tim Waugh 6353ab
+++ bash-3.1/builtins/mkbuiltins.c	2006-01-06 00:42:16 +0000
Tim Waugh 6353ab
@@ -60,8 +60,13 @@ extern char *strcpy ();
Tim Waugh 6353ab
 #define whitespace(c) (((c) == ' ') || ((c) == '\t'))
Tim Waugh 6353ab
 
Tim Waugh 6353ab
 /* Flag values that builtins can have. */
Tim Waugh 6353ab
+/*  These flags are for the C code generator, 
Tim Waugh 6353ab
+    the C which is produced (./builtin.c)
Tim Waugh 6353ab
+    includes the flags definitions found 
Tim Waugh 6353ab
+    in ../builtins.h */
Tim Waugh 6353ab
 #define BUILTIN_FLAG_SPECIAL	0x01
Tim Waugh 6353ab
 #define BUILTIN_FLAG_ASSIGNMENT 0x02
Tim Waugh 6353ab
+#define BUILTIN_FLAG_REQUIRES	0x04
Tim Waugh 6353ab
 
Tim Waugh 6353ab
 #define BASE_INDENT	4
Tim Waugh 6353ab
 
Tim Waugh 6353ab
@@ -145,9 +150,17 @@ char *assignment_builtins[] =
Tim Waugh 6353ab
   (char *)NULL
Tim Waugh 6353ab
 };
Tim Waugh 6353ab
 
Tim Waugh 6353ab
+/* The builtin commands that cause requirements on other files. */
Tim Waugh 6353ab
+static char *requires_builtins[] =
Tim Waugh 6353ab
+{
Tim Waugh 6353ab
+  ".", "command", "exec", "source", "inlib",
Tim Waugh 6353ab
+  (char *)NULL
Tim Waugh 6353ab
+};
Tim Waugh 6353ab
+
Tim Waugh 6353ab
 /* Forward declarations. */
Tim Waugh 6353ab
 static int is_special_builtin ();
Tim Waugh 6353ab
 static int is_assignment_builtin ();
Tim Waugh 6353ab
+static int is_requires_builtin ();
Tim Waugh 6353ab
 
Tim Waugh 6353ab
 #if !defined (HAVE_RENAME)
Tim Waugh 6353ab
 static int rename ();
Tim Waugh 6353ab
@@ -791,6 +804,8 @@ builtin_handler (self, defs, arg)
Tim Waugh 6353ab
     new->flags |= BUILTIN_FLAG_SPECIAL;
Tim Waugh 6353ab
   if (is_assignment_builtin (name))
Tim Waugh 6353ab
     new->flags |= BUILTIN_FLAG_ASSIGNMENT;
Tim Waugh 6353ab
+  if (is_requires_builtin (name))
Tim Waugh 6353ab
+    new->flags |= BUILTIN_FLAG_REQUIRES;
Tim Waugh 6353ab
 
Tim Waugh 6353ab
   array_add ((char *)new, defs->builtins);
Tim Waugh 6353ab
   building_builtin = 1;
Tim Waugh 6353ab
@@ -1208,10 +1223,11 @@ write_builtins (defs, structfile, extern
Tim Waugh 6353ab
 		  else
Tim Waugh 6353ab
 		    fprintf (structfile, "(sh_builtin_func_t *)0x0, ");
Tim Waugh 6353ab
 
Tim Waugh 6353ab
-		  fprintf (structfile, "%s%s%s, %s_doc,\n",
Tim Waugh 6353ab
+		  fprintf (structfile, "%s%s%s%s, %s_doc,\n",
Tim Waugh 6353ab
 		    "BUILTIN_ENABLED | STATIC_BUILTIN",
Tim Waugh 6353ab
 		    (builtin->flags & BUILTIN_FLAG_SPECIAL) ? " | SPECIAL_BUILTIN" : "",
Tim Waugh 6353ab
 		    (builtin->flags & BUILTIN_FLAG_ASSIGNMENT) ? " | ASSIGNMENT_BUILTIN" : "",
Tim Waugh 6353ab
+		    (builtin->flags & BUILTIN_FLAG_REQUIRES) ? " | REQUIRES_BUILTIN" : "",
Tim Waugh 6353ab
 		    document_name (builtin));
Tim Waugh 6353ab
 
Tim Waugh 6353ab
 		  fprintf
Tim Waugh 6353ab
@@ -1542,6 +1558,13 @@ is_assignment_builtin (name)
Tim Waugh 6353ab
   return (_find_in_table (name, assignment_builtins));
Tim Waugh 6353ab
 }
Tim Waugh 6353ab
 
Tim Waugh 6353ab
+static int
Tim Waugh 6353ab
+is_requires_builtin (name)
Tim Waugh 6353ab
+     char *name;
Tim Waugh 6353ab
+{
Tim Waugh 6353ab
+  return (_find_in_table (name, requires_builtins));
Tim Waugh 6353ab
+}
Tim Waugh 6353ab
+
Tim Waugh 6353ab
 #if !defined (HAVE_RENAME)
Tim Waugh 6353ab
 static int
Tim Waugh 6353ab
 rename (from, to)
Tim Waugh 6353ab
diff -upk.orig bash-3.1.orig/builtins.h bash-3.1/builtins.h
Tim Waugh 6353ab
--- bash-3.1.orig/builtins.h	2004-12-30 18:59:05 +0000
Tim Waugh 6353ab
+++ bash-3.1/builtins.h	2006-01-06 00:42:16 +0000
Tim Waugh 6353ab
@@ -40,6 +40,7 @@
Tim Waugh 6353ab
 #define STATIC_BUILTIN  0x4	/* This builtin is not dynamically loaded. */
Tim Waugh 6353ab
 #define SPECIAL_BUILTIN 0x8	/* This is a Posix `special' builtin. */
Tim Waugh 6353ab
 #define ASSIGNMENT_BUILTIN 0x10	/* This builtin takes assignment statements. */
Tim Waugh 6353ab
+#define REQUIRES_BUILTIN 0x20	/* This builtin requires other files. */
Tim Waugh 6353ab
 
Tim Waugh 6353ab
 #define BASE_INDENT	4
Tim Waugh 6353ab
 
Tim Waugh 6353ab
diff -upk.orig bash-3.1.orig/doc/bash.1 bash-3.1/doc/bash.1
Tim Waugh 6353ab
--- bash-3.1.orig/doc/bash.1	2006-01-06 00:41:57 +0000
Tim Waugh 6353ab
+++ bash-3.1/doc/bash.1	2006-01-06 00:42:16 +0000
Tim Waugh 6353ab
@@ -231,6 +231,13 @@ The shell becomes restricted (see
Tim Waugh 6353ab
 .B "RESTRICTED SHELL"
Tim Waugh 6353ab
 below).
Tim Waugh 6353ab
 .TP
Tim Waugh 6353ab
+.B \-\-rpm-requires
Tim Waugh 6353ab
+Produce the list of files that are required for the 
Tim Waugh 6353ab
+shell script to run.  This implies '-n' and is subject
Tim Waugh 6353ab
+to the same limitations as compile time error checking checking;
Tim Waugh 6353ab
+Backticks, [] tests,  and evals are not parsed so some 
Tim Waugh 6353ab
+dependencies may be missed.
Tim Waugh 6353ab
+.TP
Tim Waugh 6353ab
 .B \-\-verbose
Tim Waugh 6353ab
 Equivalent to  \fB\-v\fP.
Tim Waugh 6353ab
 .TP
Tim Waugh 6353ab
diff -upk.orig bash-3.1.orig/doc/bashref.texi bash-3.1/doc/bashref.texi
Tim Waugh 6353ab
--- bash-3.1.orig/doc/bashref.texi	2006-01-06 00:41:57 +0000
Tim Waugh 6353ab
+++ bash-3.1/doc/bashref.texi	2006-01-06 00:42:16 +0000
Tim Waugh 6353ab
@@ -4898,6 +4898,13 @@ standard.  @xref{Bash POSIX Mode}, for a
Tim Waugh 6353ab
 @item --restricted
Tim Waugh 6353ab
 Make the shell a restricted shell (@pxref{The Restricted Shell}).
Tim Waugh 6353ab
 
Tim Waugh 6353ab
+@item --rpm-requires
Tim Waugh 6353ab
+Produce the list of files that are required for the 
Tim Waugh 6353ab
+shell script to run.  This implies '-n' and is subject
Tim Waugh 6353ab
+to the same limitations as compile time error checking checking;
Tim Waugh 6353ab
+Backticks, [] tests,  and evals are not parsed so some 
Tim Waugh 6353ab
+dependencies may be missed.
Tim Waugh 6353ab
+
Tim Waugh 6353ab
 @item --verbose
Tim Waugh 6353ab
 Equivalent to @option{-v}.  Print shell input lines as they're read.
Tim Waugh 6353ab
 
Tim Waugh 6353ab
diff -upk.orig bash-3.1.orig/eval.c bash-3.1/eval.c
Tim Waugh 6353ab
--- bash-3.1.orig/eval.c	2006-01-06 00:41:57 +0000
Tim Waugh 6353ab
+++ bash-3.1/eval.c	2006-01-06 00:42:16 +0000
Tim Waugh 6353ab
@@ -53,6 +53,7 @@ extern int last_command_exit_value, stdi
Tim Waugh 6353ab
 extern int need_here_doc;
Tim Waugh 6353ab
 extern int current_command_number, current_command_line_count, line_number;
Tim Waugh 6353ab
 extern int expand_aliases;
Tim Waugh 6353ab
+extern int rpm_requires;
Tim Waugh 6353ab
 
Tim Waugh 6353ab
 static void send_pwd_to_eterm __P((void));
Tim Waugh 6353ab
 static sighandler alrm_catcher __P((int));
Tim Waugh 6353ab
@@ -131,7 +132,7 @@ reader_loop ()
Tim Waugh 6353ab
 
Tim Waugh 6353ab
       if (read_command () == 0)
Tim Waugh 6353ab
 	{
Tim Waugh 6353ab
-	  if (interactive_shell == 0 && read_but_dont_execute)
Tim Waugh 6353ab
+	  if (interactive_shell == 0 && (read_but_dont_execute && !rpm_requires))
Tim Waugh 6353ab
 	    {
Tim Waugh 6353ab
 	      last_command_exit_value = EXECUTION_SUCCESS;
Tim Waugh 6353ab
 	      dispose_command (global_command);
Tim Waugh 6353ab
diff -upk.orig bash-3.1.orig/execute_cmd.c bash-3.1/execute_cmd.c
Tim Waugh 6353ab
--- bash-3.1.orig/execute_cmd.c	2006-01-06 00:41:57 +0000
Tim Waugh 6353ab
+++ bash-3.1/execute_cmd.c	2006-01-06 00:42:16 +0000
Tim Waugh 6353ab
@@ -473,6 +473,8 @@ async_redirect_stdin ()
Tim Waugh 6353ab
 
Tim Waugh 6353ab
 #define DESCRIBE_PID(pid) do { if (interactive) describe_pid (pid); } while (0)
Tim Waugh 6353ab
 
Tim Waugh 6353ab
+extern int rpm_requires;
Tim Waugh 6353ab
+
Tim Waugh 6353ab
 /* Execute the command passed in COMMAND, perhaps doing it asynchrounously.
Tim Waugh 6353ab
    COMMAND is exactly what read_command () places into GLOBAL_COMMAND.
Tim Waugh 6353ab
    ASYNCHROUNOUS, if non-zero, says to do this command in the background.
Tim Waugh 6353ab
@@ -498,7 +500,15 @@ execute_command_internal (command, async
Tim Waugh 6353ab
   volatile int last_pid;
Tim Waugh 6353ab
   volatile int save_line_number;
Tim Waugh 6353ab
 
Tim Waugh 6353ab
-  if (command == 0 || breaking || continuing || read_but_dont_execute)
Tim Waugh 6353ab
+  if (command == 0 || breaking || continuing || (read_but_dont_execute && !rpm_requires))
Tim Waugh 6353ab
+    return (EXECUTION_SUCCESS);
Tim Waugh 6353ab
+
Tim Waugh 6353ab
+  if (rpm_requires && command->type == cm_function_def)
Tim Waugh 6353ab
+    return last_command_exit_value =
Tim Waugh 6353ab
+      execute_intern_function (command->value.Function_def->name,
Tim Waugh 6353ab
+			       command->value.Function_def->command);
Tim Waugh 6353ab
+
Tim Waugh 6353ab
+  if (read_but_dont_execute)
Tim Waugh 6353ab
     return (EXECUTION_SUCCESS);
Tim Waugh 6353ab
 
Tim Waugh 6353ab
   run_pending_traps ();
Tim Waugh 6353ab
@@ -3984,7 +3994,7 @@ execute_intern_function (name, function)
Tim Waugh 6353ab
 
Tim Waugh 6353ab
   if (check_identifier (name, posixly_correct) == 0)
Tim Waugh 6353ab
     {
Tim Waugh 6353ab
-      if (posixly_correct && interactive_shell == 0)
Tim Waugh 6353ab
+      if (posixly_correct && interactive_shell == 0 && rpm_requires == 0)
Tim Waugh 6353ab
 	{
Tim Waugh 6353ab
 	  last_command_exit_value = EX_USAGE;
Tim Waugh 6353ab
 	  jump_to_top_level (ERREXIT);
Tim Waugh 6353ab
diff -upk.orig bash-3.1.orig/execute_cmd.h bash-3.1/execute_cmd.h
Tim Waugh 6353ab
--- bash-3.1.orig/execute_cmd.h	2001-05-07 14:39:37 +0000
Tim Waugh 6353ab
+++ bash-3.1/execute_cmd.h	2003-04-20 13:20:49 +0000
Tim Waugh 6353ab
@@ -22,6 +22,8 @@
Tim Waugh 6353ab
 #define _EXECUTE_CMD_H_
Tim Waugh 6353ab
 
Tim Waugh 6353ab
 #include "stdc.h"
Tim Waugh 6353ab
+#include "variables.h"
Tim Waugh 6353ab
+#include "command.h"
Tim Waugh 6353ab
 
Tim Waugh 6353ab
 extern struct fd_bitmap *new_fd_bitmap __P((int));
Tim Waugh 6353ab
 extern void dispose_fd_bitmap __P((struct fd_bitmap *));
Tim Waugh 6353ab
diff -upk.orig bash-3.1.orig/make_cmd.c bash-3.1/make_cmd.c
Tim Waugh 6353ab
--- bash-3.1.orig/make_cmd.c	2006-01-06 00:41:57 +0000
Tim Waugh 6353ab
+++ bash-3.1/make_cmd.c	2006-01-06 00:42:16 +0000
Tim Waugh 6353ab
@@ -41,11 +41,15 @@ Foundation, 59 Temple Place, Suite 330, 
Tim Waugh 6353ab
 #include "flags.h"
Tim Waugh 6353ab
 #include "make_cmd.h"
Tim Waugh 6353ab
 #include "dispose_cmd.h"
Tim Waugh 6353ab
+#include "execute_cmd.h"
Tim Waugh 6353ab
 #include "variables.h"
Tim Waugh 6353ab
 #include "subst.h"
Tim Waugh 6353ab
 #include "input.h"
Tim Waugh 6353ab
 #include "ocache.h"
Tim Waugh 6353ab
 #include "externs.h"
Tim Waugh 6353ab
+#include "builtins.h"
Tim Waugh 6353ab
+
Tim Waugh 6353ab
+#include "builtins/common.h"
Tim Waugh 6353ab
 
Tim Waugh 6353ab
 #if defined (JOB_CONTROL)
Tim Waugh 6353ab
 #include "jobs.h"
Tim Waugh 6353ab
@@ -55,6 +59,10 @@ Foundation, 59 Temple Place, Suite 330, 
Tim Waugh 6353ab
 
Tim Waugh 6353ab
 extern int line_number, current_command_line_count;
Tim Waugh 6353ab
 extern int last_command_exit_value;
Tim Waugh 6353ab
+extern int rpm_requires;
Tim Waugh 6353ab
+
Tim Waugh 6353ab
+static char *alphabet_set = "abcdefghijklmnopqrstuvwxyz"
Tim Waugh 6353ab
+                     "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
Tim Waugh 6353ab
 
Tim Waugh 6353ab
 /* Object caching */
Tim Waugh 6353ab
 sh_obj_cache_t wdcache = {0, 0, 0};
Tim Waugh 6353ab
@@ -784,6 +792,27 @@ make_subshell_command (command)
Tim Waugh 6353ab
   return (make_command (cm_subshell, (SIMPLE_COM *)temp));
Tim Waugh 6353ab
 }
Tim Waugh 6353ab
 
Tim Waugh 6353ab
+static void
Tim Waugh 6353ab
+output_requirement (deptype, filename)
Tim Waugh 6353ab
+const char *deptype;
Tim Waugh 6353ab
+char *filename;
Tim Waugh 6353ab
+{
Tim Waugh 6353ab
+  if (strchr(filename, '$') || (filename[0] != '/' && strchr(filename, '/')))
Tim Waugh 6353ab
+    return;
Tim Waugh 6353ab
+
Tim Waugh 6353ab
+  /* 
Tim Waugh 6353ab
+      if the executable is called via variable substitution we can
Tim Waugh 6353ab
+      not dermine what it is at compile time.  
Tim Waugh 6353ab
+
Tim Waugh 6353ab
+      if the executable consists only of characters not in the
Tim Waugh 6353ab
+      alphabet we do not consider it a dependency just an artifact
Tim Waugh 6353ab
+      of shell parsing (ex "exec < ${infile}").
Tim Waugh 6353ab
+  */
Tim Waugh 6353ab
+
Tim Waugh 6353ab
+  if (strpbrk(filename, alphabet_set))
Tim Waugh 6353ab
+    printf ("%s(%s)\n", deptype, filename);
Tim Waugh 6353ab
+}
Tim Waugh 6353ab
+
Tim Waugh 6353ab
 /* Reverse the word list and redirection list in the simple command
Tim Waugh 6353ab
    has just been parsed.  It seems simpler to do this here the one
Tim Waugh 6353ab
    time then by any other method that I can think of. */
Tim Waugh 6353ab
@@ -801,6 +830,27 @@ clean_simple_command (command)
Tim Waugh 6353ab
 	REVERSE_LIST (command->value.Simple->redirects, REDIRECT *);
Tim Waugh 6353ab
     }
Tim Waugh 6353ab
 
Tim Waugh 6353ab
+  if (rpm_requires && command->value.Simple->words)
Tim Waugh 6353ab
+    {
Tim Waugh 6353ab
+      char *cmd0;
Tim Waugh 6353ab
+      char *cmd1;
Tim Waugh 6353ab
+      struct builtin *b;
Tim Waugh 6353ab
+
Tim Waugh 6353ab
+      cmd0 = command->value.Simple->words->word->word;
Tim Waugh 6353ab
+      b = builtin_address_internal (cmd0, 0);
Tim Waugh 6353ab
+      cmd1 = 0;
Tim Waugh 6353ab
+      if (command->value.Simple->words->next)
Tim Waugh 6353ab
+        cmd1 = command->value.Simple->words->next->word->word;
Tim Waugh 6353ab
+
Tim Waugh 6353ab
+      if (b) {
Tim Waugh 6353ab
+        if ( (b->flags & REQUIRES_BUILTIN) && cmd1)
Tim Waugh 6353ab
+          output_requirement ("executable", cmd1);
Tim Waugh 6353ab
+      } else {
Tim Waugh 6353ab
+        if (!assignment(cmd0, 0))
Tim Waugh 6353ab
+          output_requirement (find_function(cmd0) ? "function" : "executable", cmd0);
Tim Waugh 6353ab
+      }
Tim Waugh 6353ab
+    } /*rpm_requires*/
Tim Waugh 6353ab
+
Tim Waugh 6353ab
   return (command);
Tim Waugh 6353ab
 }
Tim Waugh 6353ab
 
Tim Waugh 6353ab
diff -upk.orig bash-3.1.orig/shell.c bash-3.1/shell.c
Tim Waugh 6353ab
--- bash-3.1.orig/shell.c	2006-01-06 00:41:57 +0000
Tim Waugh 6353ab
+++ bash-3.1/shell.c	2006-01-06 00:42:16 +0000
Tim Waugh 6353ab
@@ -175,6 +175,9 @@ int running_under_emacs;
Tim Waugh 6353ab
 /* The name of the .(shell)rc file. */
Tim Waugh 6353ab
 static char *bashrc_file = "~/.bashrc";
Tim Waugh 6353ab
 
Tim Waugh 6353ab
+/* Non-zero if we are finding the scripts requirements. */
Tim Waugh 6353ab
+int rpm_requires;
Tim Waugh 6353ab
+
Tim Waugh 6353ab
 /* Non-zero means to act more like the Bourne shell on startup. */
Tim Waugh 6353ab
 static int act_like_sh;
Tim Waugh 6353ab
 
Tim Waugh 6353ab
@@ -233,6 +236,7 @@ struct {
Tim Waugh 6353ab
   { "posix", Int, &posixly_correct, (char **)0x0 },
Tim Waugh 6353ab
   { "protected", Int, &protected_mode, (char **)0x0 },
Tim Waugh 6353ab
   { "rcfile", Charp, (int *)0x0, &bashrc_file },
Tim Waugh 6353ab
+  { "rpm-requires", Int, &rpm_requires, (char **)0x0 },
Tim Waugh 6353ab
 #if defined (RESTRICTED_SHELL)
Tim Waugh 6353ab
   { "restricted", Int, &restricted, (char **)0x0 },
Tim Waugh 6353ab
 #endif
Tim Waugh 6353ab
@@ -460,6 +464,12 @@ main (argc, argv, env)
Tim Waugh 6353ab
   if (dump_translatable_strings)
Tim Waugh 6353ab
     read_but_dont_execute = 1;
Tim Waugh 6353ab
 
Tim Waugh 6353ab
+  if (rpm_requires)
Tim Waugh 6353ab
+    {
Tim Waugh 6353ab
+      read_but_dont_execute = 1;
Tim Waugh 6353ab
+      initialize_shell_builtins ();
Tim Waugh 6353ab
+    }
Tim Waugh 6353ab
+
Tim Waugh 6353ab
   if (running_setuid && privileged_mode == 0)
Tim Waugh 6353ab
     disable_priv_mode ();
Tim Waugh 6353ab