OSDN Git Service

Updated copyright notices for most files.
[pf3gnuchains/pf3gnuchains3x.git] / gdb / fork-child.c
1 /* Fork a Unix child process, and set up to debug it, for GDB.
2
3    Copyright (C) 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000,
4    2001, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
5
6    Contributed by Cygnus Support.
7
8    This file is part of GDB.
9
10    This program is free software; you can redistribute it and/or modify
11    it under the terms of the GNU General Public License as published by
12    the Free Software Foundation; either version 3 of the License, or
13    (at your option) any later version.
14
15    This program is distributed in the hope that it will be useful,
16    but WITHOUT ANY WARRANTY; without even the implied warranty of
17    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18    GNU General Public License for more details.
19
20    You should have received a copy of the GNU General Public License
21    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
22
23 #include "defs.h"
24 #include "gdb_string.h"
25 #include "frame.h"              /* required by inferior.h */
26 #include "inferior.h"
27 #include "target.h"
28 #include "gdb_wait.h"
29 #include "gdb_vfork.h"
30 #include "gdbcore.h"
31 #include "terminal.h"
32 #include "gdbthread.h"
33 #include "command.h" /* for dont_repeat () */
34 #include "solib.h"
35
36 #include <signal.h>
37
38 /* This just gets used as a default if we can't find SHELL.  */
39 #ifndef SHELL_FILE
40 #define SHELL_FILE "/bin/sh"
41 #endif
42
43 extern char **environ;
44
45 /* Break up SCRATCH into an argument vector suitable for passing to
46    execvp and store it in ARGV.  E.g., on "run a b c d" this routine
47    would get as input the string "a b c d", and as output it would
48    fill in ARGV with the four arguments "a", "b", "c", "d".  */
49
50 static void
51 breakup_args (char *scratch, char **argv)
52 {
53   char *cp = scratch;
54
55   for (;;)
56     {
57       /* Scan past leading separators */
58       while (*cp == ' ' || *cp == '\t' || *cp == '\n')
59         cp++;
60
61       /* Break if at end of string.  */
62       if (*cp == '\0')
63         break;
64
65       /* Take an arg.  */
66       *argv++ = cp;
67
68       /* Scan for next arg separator.  */
69       cp = strchr (cp, ' ');
70       if (cp == NULL)
71         cp = strchr (cp, '\t');
72       if (cp == NULL)
73         cp = strchr (cp, '\n');
74
75       /* No separators => end of string => break.  */
76       if (cp == NULL)
77         break;
78
79       /* Replace the separator with a terminator.  */
80       *cp++ = '\0';
81     }
82
83   /* Null-terminate the vector.  */
84   *argv = NULL;
85 }
86
87 /* When executing a command under the given shell, return non-zero if
88    the '!' character should be escaped when embedded in a quoted
89    command-line argument.  */
90
91 static int
92 escape_bang_in_quoted_argument (const char *shell_file)
93 {
94   const int shell_file_len = strlen (shell_file);
95
96   /* Bang should be escaped only in C Shells.  For now, simply check
97      that the shell name ends with 'csh', which covers at least csh
98      and tcsh.  This should be good enough for now.  */
99
100   if (shell_file_len < 3)
101     return 0;
102
103   if (shell_file[shell_file_len - 3] == 'c'
104       && shell_file[shell_file_len - 2] == 's'
105       && shell_file[shell_file_len - 1] == 'h')
106     return 1;
107
108   return 0;
109 }
110
111 /* Start an inferior Unix child process and sets inferior_ptid to its
112    pid.  EXEC_FILE is the file to run.  ALLARGS is a string containing
113    the arguments to the program.  ENV is the environment vector to
114    pass.  SHELL_FILE is the shell file, or NULL if we should pick
115    one.  */
116
117 /* This function is NOT reentrant.  Some of the variables have been
118    made static to ensure that they survive the vfork call.  */
119
120 void
121 fork_inferior (char *exec_file_arg, char *allargs, char **env,
122                void (*traceme_fun) (void), void (*init_trace_fun) (int),
123                void (*pre_trace_fun) (void), char *shell_file_arg)
124 {
125   int pid;
126   char *shell_command;
127   static char default_shell_file[] = SHELL_FILE;
128   int len;
129   /* Set debug_fork then attach to the child while it sleeps, to debug. */
130   static int debug_fork = 0;
131   /* This is set to the result of setpgrp, which if vforked, will be visible
132      to you in the parent process.  It's only used by humans for debugging.  */
133   static int debug_setpgrp = 657473;
134   static char *shell_file;
135   static char *exec_file;
136   char **save_our_env;
137   int shell = 0;
138   static char **argv;
139   const char *inferior_io_terminal = get_inferior_io_terminal ();
140
141   /* If no exec file handed to us, get it from the exec-file command
142      -- with a good, common error message if none is specified.  */
143   exec_file = exec_file_arg;
144   if (exec_file == 0)
145     exec_file = get_exec_file (1);
146
147   /* STARTUP_WITH_SHELL is defined in inferior.h.  If 0,e we'll just
148     do a fork/exec, no shell, so don't bother figuring out what
149     shell.  */
150   shell_file = shell_file_arg;
151   if (STARTUP_WITH_SHELL)
152     {
153       /* Figure out what shell to start up the user program under.  */
154       if (shell_file == NULL)
155         shell_file = getenv ("SHELL");
156       if (shell_file == NULL)
157         shell_file = default_shell_file;
158       shell = 1;
159     }
160
161   /* Multiplying the length of exec_file by 4 is to account for the
162      fact that it may expand when quoted; it is a worst-case number
163      based on every character being '.  */
164   len = 5 + 4 * strlen (exec_file) + 1 + strlen (allargs) + 1 + /*slop */ 12;
165   /* If desired, concat something onto the front of ALLARGS.
166      SHELL_COMMAND is the result.  */
167 #ifdef SHELL_COMMAND_CONCAT
168   shell_command = (char *) alloca (strlen (SHELL_COMMAND_CONCAT) + len);
169   strcpy (shell_command, SHELL_COMMAND_CONCAT);
170 #else
171   shell_command = (char *) alloca (len);
172   shell_command[0] = '\0';
173 #endif
174
175   if (!shell)
176     {
177       /* We're going to call execvp.  Create argument vector.
178          Calculate an upper bound on the length of the vector by
179          assuming that every other character is a separate
180          argument.  */
181       int argc = (strlen (allargs) + 1) / 2 + 2;
182       argv = (char **) xmalloc (argc * sizeof (*argv));
183       argv[0] = exec_file;
184       breakup_args (allargs, &argv[1]);
185     }
186   else
187     {
188       /* We're going to call a shell.  */
189
190       /* Now add exec_file, quoting as necessary.  */
191
192       char *p;
193       int need_to_quote;
194       const int escape_bang = escape_bang_in_quoted_argument (shell_file);
195
196       strcat (shell_command, "exec ");
197
198       /* Quoting in this style is said to work with all shells.  But
199          csh on IRIX 4.0.1 can't deal with it.  So we only quote it if
200          we need to.  */
201       p = exec_file;
202       while (1)
203         {
204           switch (*p)
205             {
206             case '\'':
207             case '!':
208             case '"':
209             case '(':
210             case ')':
211             case '$':
212             case '&':
213             case ';':
214             case '<':
215             case '>':
216             case ' ':
217             case '\n':
218             case '\t':
219               need_to_quote = 1;
220               goto end_scan;
221
222             case '\0':
223               need_to_quote = 0;
224               goto end_scan;
225
226             default:
227               break;
228             }
229           ++p;
230         }
231     end_scan:
232       if (need_to_quote)
233         {
234           strcat (shell_command, "'");
235           for (p = exec_file; *p != '\0'; ++p)
236             {
237               if (*p == '\'')
238                 strcat (shell_command, "'\\''");
239               else if (*p == '!' && escape_bang)
240                 strcat (shell_command, "\\!");
241               else
242                 strncat (shell_command, p, 1);
243             }
244           strcat (shell_command, "'");
245         }
246       else
247         strcat (shell_command, exec_file);
248
249       strcat (shell_command, " ");
250       strcat (shell_command, allargs);
251     }
252
253   /* On some systems an exec will fail if the executable is open.  */
254   close_exec_file ();
255
256   /* Retain a copy of our environment variables, since the child will
257      replace the value of environ and if we're vforked, we have to
258      restore it.  */
259   save_our_env = environ;
260
261   /* Tell the terminal handling subsystem what tty we plan to run on;
262      it will just record the information for later.  */
263   new_tty_prefork (inferior_io_terminal);
264
265   /* It is generally good practice to flush any possible pending stdio
266      output prior to doing a fork, to avoid the possibility of both
267      the parent and child flushing the same data after the fork. */
268   gdb_flush (gdb_stdout);
269   gdb_flush (gdb_stderr);
270
271   /* If there's any initialization of the target layers that must
272      happen to prepare to handle the child we're about fork, do it
273      now...  */
274   if (pre_trace_fun != NULL)
275     (*pre_trace_fun) ();
276
277   /* Create the child process.  Since the child process is going to
278      exec(3) shortly afterwards, try to reduce the overhead by
279      calling vfork(2).  However, if PRE_TRACE_FUN is non-null, it's
280      likely that this optimization won't work since there's too much
281      work to do between the vfork(2) and the exec(3).  This is known
282      to be the case on ttrace(2)-based HP-UX, where some handshaking
283      between parent and child needs to happen between fork(2) and
284      exec(2).  However, since the parent is suspended in the vforked
285      state, this doesn't work.  Also note that the vfork(2) call might
286      actually be a call to fork(2) due to the fact that autoconf will
287      ``#define vfork fork'' on certain platforms.  */
288   if (pre_trace_fun || debug_fork)
289     pid = fork ();
290   else
291     pid = vfork ();
292
293   if (pid < 0)
294     perror_with_name (("vfork"));
295
296   if (pid == 0)
297     {
298       if (debug_fork)
299         sleep (debug_fork);
300
301       /* Run inferior in a separate process group.  */
302       debug_setpgrp = gdb_setpgid ();
303       if (debug_setpgrp == -1)
304         perror ("setpgrp failed in child");
305
306       /* Ask the tty subsystem to switch to the one we specified
307          earlier (or to share the current terminal, if none was
308          specified).  */
309       new_tty ();
310
311       /* Changing the signal handlers for the inferior after
312          a vfork can also change them for the superior, so we don't mess
313          with signals here.  See comments in
314          initialize_signals for how we get the right signal handlers
315          for the inferior.  */
316
317       /* "Trace me, Dr. Memory!" */
318       (*traceme_fun) ();
319
320       /* The call above set this process (the "child") as debuggable
321         by the original gdb process (the "parent").  Since processes
322         (unlike people) can have only one parent, if you are debugging
323         gdb itself (and your debugger is thus _already_ the
324         controller/parent for this child), code from here on out is
325         undebuggable.  Indeed, you probably got an error message
326         saying "not parent".  Sorry; you'll have to use print
327         statements!  */
328
329       /* There is no execlpe call, so we have to set the environment
330          for our child in the global variable.  If we've vforked, this
331          clobbers the parent, but environ is restored a few lines down
332          in the parent.  By the way, yes we do need to look down the
333          path to find $SHELL.  Rich Pixley says so, and I agree.  */
334       environ = env;
335
336       /* If we decided above to start up with a shell, we exec the
337          shell, "-c" says to interpret the next arg as a shell command
338          to execute, and this command is "exec <target-program>
339          <args>".  */
340       if (shell)
341         {
342           execlp (shell_file, shell_file, "-c", shell_command, (char *) 0);
343
344           /* If we get here, it's an error.  */
345           fprintf_unfiltered (gdb_stderr, "Cannot exec %s: %s.\n", shell_file,
346                               safe_strerror (errno));
347           gdb_flush (gdb_stderr);
348           _exit (0177);
349         }
350       else
351         {
352           /* Otherwise, we directly exec the target program with
353              execvp.  */
354           int i;
355           char *errstring;
356
357           execvp (exec_file, argv);
358
359           /* If we get here, it's an error.  */
360           errstring = safe_strerror (errno);
361           fprintf_unfiltered (gdb_stderr, "Cannot exec %s ", exec_file);
362
363           i = 1;
364           while (argv[i] != NULL)
365             {
366               if (i != 1)
367                 fprintf_unfiltered (gdb_stderr, " ");
368               fprintf_unfiltered (gdb_stderr, "%s", argv[i]);
369               i++;
370             }
371           fprintf_unfiltered (gdb_stderr, ".\n");
372 #if 0
373           /* This extra info seems to be useless.  */
374           fprintf_unfiltered (gdb_stderr, "Got error %s.\n", errstring);
375 #endif
376           gdb_flush (gdb_stderr);
377           _exit (0177);
378         }
379     }
380
381   /* Restore our environment in case a vforked child clob'd it.  */
382   environ = save_our_env;
383
384   init_thread_list ();
385
386   /* Needed for wait_for_inferior stuff below.  */
387   inferior_ptid = pid_to_ptid (pid);
388
389   /* Now that we have a child process, make it our target, and
390      initialize anything target-vector-specific that needs
391      initializing.  */
392   (*init_trace_fun) (pid);
393
394   /* We are now in the child process of interest, having exec'd the
395      correct program, and are poised at the first instruction of the
396      new program.  */
397 }
398
399 /* Accept NTRAPS traps from the inferior.  */
400
401 void
402 startup_inferior (int ntraps)
403 {
404   int pending_execs = ntraps;
405   int terminal_initted = 0;
406
407   /* The process was started by the fork that created it, but it will
408      have stopped one instruction after execing the shell.  Here we
409      must get it up to actual execution of the real program.  */
410
411   clear_proceed_status ();
412
413   init_wait_for_inferior ();
414
415   inferior_ignoring_leading_exec_events =
416     target_reported_exec_events_per_exec_call () - 1;
417
418   while (1)
419     {
420       /* Make wait_for_inferior be quiet. */
421       stop_soon = STOP_QUIETLY;
422       wait_for_inferior ();
423       if (stop_signal != TARGET_SIGNAL_TRAP)
424         {
425           /* Let shell child handle its own signals in its own way.
426              FIXME: what if child has exited?  Must exit loop
427              somehow.  */
428           resume (0, stop_signal);
429         }
430       else
431         {
432           /* We handle SIGTRAP, however; it means child did an exec.  */
433           if (!terminal_initted)
434             {
435               /* Now that the child has exec'd we know it has already
436                  set its process group.  On POSIX systems, tcsetpgrp
437                  will fail with EPERM if we try it before the child's
438                  setpgid.  */
439
440               /* Set up the "saved terminal modes" of the inferior
441                  based on what modes we are starting it with.  */
442               target_terminal_init ();
443
444               /* Install inferior's terminal modes.  */
445               target_terminal_inferior ();
446
447               terminal_initted = 1;
448             }
449
450           if (--pending_execs == 0)
451             break;
452
453           resume (0, TARGET_SIGNAL_0);  /* Just make it go on.  */
454         }
455     }
456   stop_soon = NO_STOP_QUIETLY;
457 }