components/gdb/patches/gdb.fork-child.c.patch
author George Vasick <george.vasick@oracle.com>
Sat, 14 May 2011 00:21:25 +0000
changeset 243 34b34302cac9
child 1511 4d3b0b480760
permissions -rw-r--r--
7039303 Move gdb 6.8 from SFW to Userland.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
243
34b34302cac9 7039303 Move gdb 6.8 from SFW to Userland.
George Vasick <george.vasick@oracle.com>
parents:
diff changeset
     1
--- gdb-6.8.orig/gdb/fork-child.c	Tue Jan 29 13:11:24 2008
34b34302cac9 7039303 Move gdb 6.8 from SFW to Userland.
George Vasick <george.vasick@oracle.com>
parents:
diff changeset
     2
+++ gdb-6.8-64/gdb/fork-child.c	Fri Sep  3 15:08:51 2010
34b34302cac9 7039303 Move gdb 6.8 from SFW to Userland.
George Vasick <george.vasick@oracle.com>
parents:
diff changeset
     3
@@ -40,6 +40,16 @@
34b34302cac9 7039303 Move gdb 6.8 from SFW to Userland.
George Vasick <george.vasick@oracle.com>
parents:
diff changeset
     4
 
34b34302cac9 7039303 Move gdb 6.8 from SFW to Userland.
George Vasick <george.vasick@oracle.com>
parents:
diff changeset
     5
 extern char **environ;
34b34302cac9 7039303 Move gdb 6.8 from SFW to Userland.
George Vasick <george.vasick@oracle.com>
parents:
diff changeset
     6
 
34b34302cac9 7039303 Move gdb 6.8 from SFW to Userland.
George Vasick <george.vasick@oracle.com>
parents:
diff changeset
     7
+/* On Solaris, the SHELL may be a hard link to /usr/lib/isaexec.
34b34302cac9 7039303 Move gdb 6.8 from SFW to Userland.
George Vasick <george.vasick@oracle.com>
parents:
diff changeset
     8
+   If so, there will be one more exec trap to skip while starting
34b34302cac9 7039303 Move gdb 6.8 from SFW to Userland.
George Vasick <george.vasick@oracle.com>
parents:
diff changeset
     9
+   the inferior.  */
34b34302cac9 7039303 Move gdb 6.8 from SFW to Userland.
George Vasick <george.vasick@oracle.com>
parents:
diff changeset
    10
+
34b34302cac9 7039303 Move gdb 6.8 from SFW to Userland.
George Vasick <george.vasick@oracle.com>
parents:
diff changeset
    11
+#include <fcntl.h>
34b34302cac9 7039303 Move gdb 6.8 from SFW to Userland.
George Vasick <george.vasick@oracle.com>
parents:
diff changeset
    12
+#include <sys/types.h>
34b34302cac9 7039303 Move gdb 6.8 from SFW to Userland.
George Vasick <george.vasick@oracle.com>
parents:
diff changeset
    13
+#include <sys/stat.h>
34b34302cac9 7039303 Move gdb 6.8 from SFW to Userland.
George Vasick <george.vasick@oracle.com>
parents:
diff changeset
    14
+
34b34302cac9 7039303 Move gdb 6.8 from SFW to Userland.
George Vasick <george.vasick@oracle.com>
parents:
diff changeset
    15
+static int isaexec_shell;
34b34302cac9 7039303 Move gdb 6.8 from SFW to Userland.
George Vasick <george.vasick@oracle.com>
parents:
diff changeset
    16
+
34b34302cac9 7039303 Move gdb 6.8 from SFW to Userland.
George Vasick <george.vasick@oracle.com>
parents:
diff changeset
    17
 /* Break up SCRATCH into an argument vector suitable for passing to
34b34302cac9 7039303 Move gdb 6.8 from SFW to Userland.
George Vasick <george.vasick@oracle.com>
parents:
diff changeset
    18
    execvp and store it in ARGV.  E.g., on "run a b c d" this routine
34b34302cac9 7039303 Move gdb 6.8 from SFW to Userland.
George Vasick <george.vasick@oracle.com>
parents:
diff changeset
    19
    would get as input the string "a b c d", and as output it would
34b34302cac9 7039303 Move gdb 6.8 from SFW to Userland.
George Vasick <george.vasick@oracle.com>
parents:
diff changeset
    20
@@ -136,6 +146,8 @@
34b34302cac9 7039303 Move gdb 6.8 from SFW to Userland.
George Vasick <george.vasick@oracle.com>
parents:
diff changeset
    21
   static char **argv;
34b34302cac9 7039303 Move gdb 6.8 from SFW to Userland.
George Vasick <george.vasick@oracle.com>
parents:
diff changeset
    22
   const char *inferior_io_terminal = get_inferior_io_terminal ();
34b34302cac9 7039303 Move gdb 6.8 from SFW to Userland.
George Vasick <george.vasick@oracle.com>
parents:
diff changeset
    23
 
34b34302cac9 7039303 Move gdb 6.8 from SFW to Userland.
George Vasick <george.vasick@oracle.com>
parents:
diff changeset
    24
+  isaexec_shell = 0;  /* Solaris only */
34b34302cac9 7039303 Move gdb 6.8 from SFW to Userland.
George Vasick <george.vasick@oracle.com>
parents:
diff changeset
    25
+
34b34302cac9 7039303 Move gdb 6.8 from SFW to Userland.
George Vasick <george.vasick@oracle.com>
parents:
diff changeset
    26
   /* If no exec file handed to us, get it from the exec-file command
34b34302cac9 7039303 Move gdb 6.8 from SFW to Userland.
George Vasick <george.vasick@oracle.com>
parents:
diff changeset
    27
      -- with a good, common error message if none is specified.  */
34b34302cac9 7039303 Move gdb 6.8 from SFW to Userland.
George Vasick <george.vasick@oracle.com>
parents:
diff changeset
    28
   exec_file = exec_file_arg;
34b34302cac9 7039303 Move gdb 6.8 from SFW to Userland.
George Vasick <george.vasick@oracle.com>
parents:
diff changeset
    29
@@ -148,6 +160,9 @@
34b34302cac9 7039303 Move gdb 6.8 from SFW to Userland.
George Vasick <george.vasick@oracle.com>
parents:
diff changeset
    30
   shell_file = shell_file_arg;
34b34302cac9 7039303 Move gdb 6.8 from SFW to Userland.
George Vasick <george.vasick@oracle.com>
parents:
diff changeset
    31
   if (STARTUP_WITH_SHELL)
34b34302cac9 7039303 Move gdb 6.8 from SFW to Userland.
George Vasick <george.vasick@oracle.com>
parents:
diff changeset
    32
     {
34b34302cac9 7039303 Move gdb 6.8 from SFW to Userland.
George Vasick <george.vasick@oracle.com>
parents:
diff changeset
    33
+      /* Solaris only, is the shell a hard link to isaexec?  */
34b34302cac9 7039303 Move gdb 6.8 from SFW to Userland.
George Vasick <george.vasick@oracle.com>
parents:
diff changeset
    34
+      struct stat buf1, buf2;
34b34302cac9 7039303 Move gdb 6.8 from SFW to Userland.
George Vasick <george.vasick@oracle.com>
parents:
diff changeset
    35
+
34b34302cac9 7039303 Move gdb 6.8 from SFW to Userland.
George Vasick <george.vasick@oracle.com>
parents:
diff changeset
    36
       /* Figure out what shell to start up the user program under.  */
34b34302cac9 7039303 Move gdb 6.8 from SFW to Userland.
George Vasick <george.vasick@oracle.com>
parents:
diff changeset
    37
       if (shell_file == NULL)
34b34302cac9 7039303 Move gdb 6.8 from SFW to Userland.
George Vasick <george.vasick@oracle.com>
parents:
diff changeset
    38
 	shell_file = getenv ("SHELL");
34b34302cac9 7039303 Move gdb 6.8 from SFW to Userland.
George Vasick <george.vasick@oracle.com>
parents:
diff changeset
    39
@@ -154,6 +169,25 @@
34b34302cac9 7039303 Move gdb 6.8 from SFW to Userland.
George Vasick <george.vasick@oracle.com>
parents:
diff changeset
    40
       if (shell_file == NULL)
34b34302cac9 7039303 Move gdb 6.8 from SFW to Userland.
George Vasick <george.vasick@oracle.com>
parents:
diff changeset
    41
 	shell_file = default_shell_file;
34b34302cac9 7039303 Move gdb 6.8 from SFW to Userland.
George Vasick <george.vasick@oracle.com>
parents:
diff changeset
    42
       shell = 1;
34b34302cac9 7039303 Move gdb 6.8 from SFW to Userland.
George Vasick <george.vasick@oracle.com>
parents:
diff changeset
    43
+
34b34302cac9 7039303 Move gdb 6.8 from SFW to Userland.
George Vasick <george.vasick@oracle.com>
parents:
diff changeset
    44
+      /* Solaris only, is the shell a hard link to isaexec?
34b34302cac9 7039303 Move gdb 6.8 from SFW to Userland.
George Vasick <george.vasick@oracle.com>
parents:
diff changeset
    45
+	 If either stat call fails or the user's shell is
34b34302cac9 7039303 Move gdb 6.8 from SFW to Userland.
George Vasick <george.vasick@oracle.com>
parents:
diff changeset
    46
+	 not linked to isaexec, proceed with gdb's normal
34b34302cac9 7039303 Move gdb 6.8 from SFW to Userland.
George Vasick <george.vasick@oracle.com>
parents:
diff changeset
    47
+	 behavior, i.e. do not skip an extra exec.
34b34302cac9 7039303 Move gdb 6.8 from SFW to Userland.
George Vasick <george.vasick@oracle.com>
parents:
diff changeset
    48
+
34b34302cac9 7039303 Move gdb 6.8 from SFW to Userland.
George Vasick <george.vasick@oracle.com>
parents:
diff changeset
    49
+	 Assume that two files are the same if their inode
34b34302cac9 7039303 Move gdb 6.8 from SFW to Userland.
George Vasick <george.vasick@oracle.com>
parents:
diff changeset
    50
+	 numbers, device numbers, and number of links match.
34b34302cac9 7039303 Move gdb 6.8 from SFW to Userland.
George Vasick <george.vasick@oracle.com>
parents:
diff changeset
    51
+	 Is it possible to get a false positive if the shell
34b34302cac9 7039303 Move gdb 6.8 from SFW to Userland.
George Vasick <george.vasick@oracle.com>
parents:
diff changeset
    52
+	 and isaexec are located on different file systems?  */
34b34302cac9 7039303 Move gdb 6.8 from SFW to Userland.
George Vasick <george.vasick@oracle.com>
parents:
diff changeset
    53
+      if (
34b34302cac9 7039303 Move gdb 6.8 from SFW to Userland.
George Vasick <george.vasick@oracle.com>
parents:
diff changeset
    54
+	stat ("/usr/lib/isaexec", &buf1) == 0 &&
34b34302cac9 7039303 Move gdb 6.8 from SFW to Userland.
George Vasick <george.vasick@oracle.com>
parents:
diff changeset
    55
+	stat (shell_file, &buf2) == 0 &&
34b34302cac9 7039303 Move gdb 6.8 from SFW to Userland.
George Vasick <george.vasick@oracle.com>
parents:
diff changeset
    56
+	buf1.st_ino == buf2.st_ino &&
34b34302cac9 7039303 Move gdb 6.8 from SFW to Userland.
George Vasick <george.vasick@oracle.com>
parents:
diff changeset
    57
+	buf1.st_dev == buf2.st_dev &&
34b34302cac9 7039303 Move gdb 6.8 from SFW to Userland.
George Vasick <george.vasick@oracle.com>
parents:
diff changeset
    58
+	buf1.st_nlink == buf2.st_nlink
34b34302cac9 7039303 Move gdb 6.8 from SFW to Userland.
George Vasick <george.vasick@oracle.com>
parents:
diff changeset
    59
+      ) {
34b34302cac9 7039303 Move gdb 6.8 from SFW to Userland.
George Vasick <george.vasick@oracle.com>
parents:
diff changeset
    60
+	isaexec_shell = 1;
34b34302cac9 7039303 Move gdb 6.8 from SFW to Userland.
George Vasick <george.vasick@oracle.com>
parents:
diff changeset
    61
+      }
34b34302cac9 7039303 Move gdb 6.8 from SFW to Userland.
George Vasick <george.vasick@oracle.com>
parents:
diff changeset
    62
     }
34b34302cac9 7039303 Move gdb 6.8 from SFW to Userland.
George Vasick <george.vasick@oracle.com>
parents:
diff changeset
    63
 
34b34302cac9 7039303 Move gdb 6.8 from SFW to Userland.
George Vasick <george.vasick@oracle.com>
parents:
diff changeset
    64
   /* Multiplying the length of exec_file by 4 is to account for the
34b34302cac9 7039303 Move gdb 6.8 from SFW to Userland.
George Vasick <george.vasick@oracle.com>
parents:
diff changeset
    65
@@ -395,6 +429,9 @@
34b34302cac9 7039303 Move gdb 6.8 from SFW to Userland.
George Vasick <george.vasick@oracle.com>
parents:
diff changeset
    66
   int pending_execs = ntraps;
34b34302cac9 7039303 Move gdb 6.8 from SFW to Userland.
George Vasick <george.vasick@oracle.com>
parents:
diff changeset
    67
   int terminal_initted = 0;
34b34302cac9 7039303 Move gdb 6.8 from SFW to Userland.
George Vasick <george.vasick@oracle.com>
parents:
diff changeset
    68
 
34b34302cac9 7039303 Move gdb 6.8 from SFW to Userland.
George Vasick <george.vasick@oracle.com>
parents:
diff changeset
    69
+  /* Solaris only, increment ntraps if shell is isaexec'ed.  */
34b34302cac9 7039303 Move gdb 6.8 from SFW to Userland.
George Vasick <george.vasick@oracle.com>
parents:
diff changeset
    70
+  pending_execs += isaexec_shell;
34b34302cac9 7039303 Move gdb 6.8 from SFW to Userland.
George Vasick <george.vasick@oracle.com>
parents:
diff changeset
    71
+
34b34302cac9 7039303 Move gdb 6.8 from SFW to Userland.
George Vasick <george.vasick@oracle.com>
parents:
diff changeset
    72
   /* The process was started by the fork that created it, but it will
34b34302cac9 7039303 Move gdb 6.8 from SFW to Userland.
George Vasick <george.vasick@oracle.com>
parents:
diff changeset
    73
      have stopped one instruction after execing the shell.  Here we
34b34302cac9 7039303 Move gdb 6.8 from SFW to Userland.
George Vasick <george.vasick@oracle.com>
parents:
diff changeset
    74
      must get it up to actual execution of the real program.  */