* fork-child.c (fork_inferior): Fork instead of vfork if
[external/binutils.git] / gdb / fork-child.c
1 /* Fork a Unix child process, and set up to debug it, for GDB.
2
3    Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1998, 1999,
4    2000, 2001, 2004 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 2 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, write to the Free Software
22    Foundation, Inc., 59 Temple Place - Suite 330,
23    Boston, MA 02111-1307, USA.  */
24
25 #include "defs.h"
26 #include "gdb_string.h"
27 #include "frame.h"              /* required by inferior.h */
28 #include "inferior.h"
29 #include "target.h"
30 #include "gdb_wait.h"
31 #include "gdb_vfork.h"
32 #include "gdbcore.h"
33 #include "terminal.h"
34 #include "gdbthread.h"
35 #include "command.h" /* for dont_repeat () */
36
37 #include <signal.h>
38
39 /* This just gets used as a default if we can't find SHELL.  */
40 #ifndef SHELL_FILE
41 #define SHELL_FILE "/bin/sh"
42 #endif
43
44 extern char **environ;
45
46 /* Break up SCRATCH into an argument vector suitable for passing to
47    execvp and store it in ARGV.  E.g., on "run a b c d" this routine
48    would get as input the string "a b c d", and as output it would
49    fill in ARGV with the four arguments "a", "b", "c", "d".  */
50
51 static void
52 breakup_args (char *scratch, char **argv)
53 {
54   char *cp = scratch;
55
56   for (;;)
57     {
58       /* Scan past leading separators */
59       while (*cp == ' ' || *cp == '\t' || *cp == '\n')
60         cp++;
61
62       /* Break if at end of string.  */
63       if (*cp == '\0')
64         break;
65
66       /* Take an arg.  */
67       *argv++ = cp;
68
69       /* Scan for next arg separator.  */
70       cp = strchr (cp, ' ');
71       if (cp == NULL)
72         cp = strchr (cp, '\t');
73       if (cp == NULL)
74         cp = strchr (cp, '\n');
75
76       /* No separators => end of string => break.  */
77       if (cp == NULL)
78         break;
79
80       /* Replace the separator with a terminator.  */
81       *cp++ = '\0';
82     }
83
84   /* Null-terminate the vector.  */
85   *argv = NULL;
86 }
87
88 /* When executing a command under the given shell, return non-zero if
89    the '!' character should be escaped when embedded in a quoted
90    command-line argument.  */
91
92 static int
93 escape_bang_in_quoted_argument (const char *shell_file)
94 {
95   const int shell_file_len = strlen (shell_file);
96
97   /* Bang should be escaped only in C Shells.  For now, simply check
98      that the shell name ends with 'csh', which covers at least csh
99      and tcsh.  This should be good enough for now.  */
100
101   if (shell_file_len < 3)
102     return 0;
103
104   if (shell_file[shell_file_len - 3] == 'c'
105       && shell_file[shell_file_len - 2] == 's'
106       && shell_file[shell_file_len - 1] == 'h')
107     return 1;
108
109   return 0;
110 }
111
112 /* Start an inferior Unix child process and sets inferior_ptid to its
113    pid.  EXEC_FILE is the file to run.  ALLARGS is a string containing
114    the arguments to the program.  ENV is the environment vector to
115    pass.  SHELL_FILE is the shell file, or NULL if we should pick
116    one.  */
117
118 /* This function is NOT reentrant.  Some of the variables have been
119    made static to ensure that they survive the vfork call.  */
120
121 void
122 fork_inferior (char *exec_file_arg, char *allargs, char **env,
123                void (*traceme_fun) (void), void (*init_trace_fun) (int),
124                void (*pre_trace_fun) (void), char *shell_file_arg)
125 {
126   int pid;
127   char *shell_command;
128   static char default_shell_file[] = SHELL_FILE;
129   int len;
130   /* Set debug_fork then attach to the child while it sleeps, to debug. */
131   static int debug_fork = 0;
132   /* This is set to the result of setpgrp, which if vforked, will be visible
133      to you in the parent process.  It's only used by humans for debugging.  */
134   static int debug_setpgrp = 657473;
135   static char *shell_file;
136   static char *exec_file;
137   char **save_our_env;
138   int shell = 0;
139   static char **argv;
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) shortlty 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>".  "-f" means "fast startup" to the c-shell, which
340         means don't do .cshrc file. Doing .cshrc may cause fork/exec
341         events which will confuse debugger start-up code.  */
342       if (shell)
343         {
344           execlp (shell_file, shell_file, "-c", shell_command, (char *) 0);
345
346           /* If we get here, it's an error.  */
347           fprintf_unfiltered (gdb_stderr, "Cannot exec %s: %s.\n", shell_file,
348                               safe_strerror (errno));
349           gdb_flush (gdb_stderr);
350           _exit (0177);
351         }
352       else
353         {
354           /* Otherwise, we directly exec the target program with
355              execvp.  */
356           int i;
357           char *errstring;
358
359           execvp (exec_file, argv);
360
361           /* If we get here, it's an error.  */
362           errstring = safe_strerror (errno);
363           fprintf_unfiltered (gdb_stderr, "Cannot exec %s ", exec_file);
364
365           i = 1;
366           while (argv[i] != NULL)
367             {
368               if (i != 1)
369                 fprintf_unfiltered (gdb_stderr, " ");
370               fprintf_unfiltered (gdb_stderr, "%s", argv[i]);
371               i++;
372             }
373           fprintf_unfiltered (gdb_stderr, ".\n");
374 #if 0
375           /* This extra info seems to be useless.  */
376           fprintf_unfiltered (gdb_stderr, "Got error %s.\n", errstring);
377 #endif
378           gdb_flush (gdb_stderr);
379           _exit (0177);
380         }
381     }
382
383   /* Restore our environment in case a vforked child clob'd it.  */
384   environ = save_our_env;
385
386   init_thread_list ();
387
388   /* Needed for wait_for_inferior stuff below.  */
389   inferior_ptid = pid_to_ptid (pid);
390
391   /* Now that we have a child process, make it our target, and
392      initialize anything target-vector-specific that needs
393      initializing.  */
394   (*init_trace_fun) (pid);
395
396   /* We are now in the child process of interest, having exec'd the
397      correct program, and are poised at the first instruction of the
398      new program.  */
399
400   /* Allow target dependent code to play with the new process.  This
401      might be used to have target-specific code initialize a variable
402      in the new process prior to executing the first instruction.  */
403   TARGET_CREATE_INFERIOR_HOOK (pid);
404
405 #ifdef SOLIB_CREATE_INFERIOR_HOOK
406   SOLIB_CREATE_INFERIOR_HOOK (pid);
407 #endif
408 }
409
410 /* Accept NTRAPS traps from the inferior.  */
411
412 void
413 startup_inferior (int ntraps)
414 {
415   int pending_execs = ntraps;
416   int terminal_initted = 0;
417
418   /* The process was started by the fork that created it, but it will
419      have stopped one instruction after execing the shell.  Here we
420      must get it up to actual execution of the real program.  */
421
422   clear_proceed_status ();
423
424   init_wait_for_inferior ();
425
426   if (STARTUP_WITH_SHELL)
427     inferior_ignoring_startup_exec_events = ntraps;
428   else
429     inferior_ignoring_startup_exec_events = 0;
430   inferior_ignoring_leading_exec_events =
431     target_reported_exec_events_per_exec_call () - 1;
432
433   while (1)
434     {
435       /* Make wait_for_inferior be quiet. */
436       stop_soon = STOP_QUIETLY;
437       wait_for_inferior ();
438       if (stop_signal != TARGET_SIGNAL_TRAP)
439         {
440           /* Let shell child handle its own signals in its own way.
441              FIXME: what if child has exited?  Must exit loop
442              somehow.  */
443           resume (0, stop_signal);
444         }
445       else
446         {
447           /* We handle SIGTRAP, however; it means child did an exec.  */
448           if (!terminal_initted)
449             {
450               /* Now that the child has exec'd we know it has already
451                  set its process group.  On POSIX systems, tcsetpgrp
452                  will fail with EPERM if we try it before the child's
453                  setpgid.  */
454
455               /* Set up the "saved terminal modes" of the inferior
456                  based on what modes we are starting it with.  */
457               target_terminal_init ();
458
459               /* Install inferior's terminal modes.  */
460               target_terminal_inferior ();
461
462               terminal_initted = 1;
463             }
464
465           if (--pending_execs == 0)
466             break;
467
468           resume (0, TARGET_SIGNAL_0);  /* Just make it go on.  */
469         }
470     }
471   stop_soon = NO_STOP_QUIETLY;
472 }