diff options
author | Edith Epstein <eepstein@cygnus> | 1999-01-29 21:47:09 +0000 |
---|---|---|
committer | Edith Epstein <eepstein@cygnus> | 1999-01-29 21:47:09 +0000 |
commit | 34adffbd05f3b8fc585b1fa180ec05b1f6ebf481 (patch) | |
tree | 9299e985c60f4315ac215aaf9bf05de7685d7b35 /gdb/fork-child.c | |
parent | fbd641cbd348124c35994973312aa42ec6cbae00 (diff) | |
download | gdb-34adffbd05f3b8fc585b1fa180ec05b1f6ebf481.zip gdb-34adffbd05f3b8fc585b1fa180ec05b1f6ebf481.tar.gz gdb-34adffbd05f3b8fc585b1fa180ec05b1f6ebf481.tar.bz2 |
Fri Jan 29 16:44:01 1999 Edith Epstein <eepstein@sophia.cygnus.com>
* inferior.h: ran indent
* fork-child.c: ran indent
* infrun.c : ran indent
Diffstat (limited to 'gdb/fork-child.c')
-rw-r--r-- | gdb/fork-child.c | 350 |
1 files changed, 181 insertions, 169 deletions
diff --git a/gdb/fork-child.c b/gdb/fork-child.c index e262f89..f3504bc 100644 --- a/gdb/fork-child.c +++ b/gdb/fork-child.c @@ -20,7 +20,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "defs.h" #include "gdb_string.h" -#include "frame.h" /* required by inferior.h */ +#include "frame.h" /* required by inferior.h */ #include "inferior.h" #include "target.h" #include "wait.h" @@ -47,49 +47,52 @@ extern char **environ; * E.g., on "run a b c d" this routine would get as input * the string "a b c d", and as output it would fill in argv with * the four arguments "a", "b", "c", "d". - */ + */ static void breakup_args ( - scratch, - argv) -char *scratch; -char **argv; + scratch, + argv) + char *scratch; + char **argv; { - char *cp = scratch; + char *cp = scratch; #if DEBUGGING - printf("breakup_args: input = %s\n", scratch); + printf ("breakup_args: input = %s\n", scratch); #endif - for (;;) { + for (;;) + { - /* Scan past leading separators */ - while (*cp == ' ' || *cp == '\t' || *cp == '\n') { - cp++; - } + /* Scan past leading separators */ + while (*cp == ' ' || *cp == '\t' || *cp == '\n') + { + cp++; + } - /* Break if at end of string */ - if (*cp == '\0') break; + /* Break if at end of string */ + if (*cp == '\0') + break; - /* Take an arg */ - *argv++ = cp; + /* Take an arg */ + *argv++ = cp; - /* Scan for next arg separator */ - cp = strchr (cp, ' '); - if (cp == NULL) - cp = strchr (cp, '\t'); - if (cp == NULL) - cp = strchr (cp, '\n'); + /* Scan for next arg separator */ + cp = strchr (cp, ' '); + if (cp == NULL) + cp = strchr (cp, '\t'); + if (cp == NULL) + cp = strchr (cp, '\n'); - /* No separators => end of string => break */ - if (cp == NULL) - break; + /* No separators => end of string => break */ + if (cp == NULL) + break; - /* Replace the separator with a terminator */ - *cp++ = '\0'; + /* Replace the separator with a terminator */ + *cp++ = '\0'; } - /* execv requires a null-terminated arg vector */ - *argv = NULL; + /* execv requires a null-terminated arg vector */ + *argv = NULL; } @@ -128,23 +131,24 @@ fork_inferior (exec_file, allargs, env, traceme_fun, init_trace_fun, /* If no exec file handed to us, get it from the exec-file command -- with a good, common error message if none is specified. */ if (exec_file == 0) - exec_file = get_exec_file(1); + exec_file = get_exec_file (1); /* STARTUP_WITH_SHELL is defined in inferior.h. * If 0, we'll just do a fork/exec, no shell, so don't * bother figuring out what shell. */ - if (STARTUP_WITH_SHELL) { - /* Figure out what shell to start up the user program under. */ - if (shell_file == NULL) - shell_file = getenv ("SHELL"); - if (shell_file == NULL) - shell_file = default_shell_file; - shell = 1; - } + if (STARTUP_WITH_SHELL) + { + /* Figure out what shell to start up the user program under. */ + if (shell_file == NULL) + shell_file = getenv ("SHELL"); + if (shell_file == NULL) + shell_file = default_shell_file; + shell = 1; + } #if DEBUGGING - printf("shell is %s\n", shell_file); + printf ("shell is %s\n", shell_file); #endif /* Multiplying the length of exec_file by 4 is to account for the fact @@ -161,90 +165,93 @@ fork_inferior (exec_file, allargs, env, traceme_fun, init_trace_fun, shell_command[0] = '\0'; #endif - if (!shell) { - /* We're going to call execvp. Create argv */ - /* Largest case: every other character is a separate arg */ + if (!shell) + { + /* We're going to call execvp. Create argv */ + /* Largest case: every other character is a separate arg */ #if DEBUGGING - printf("allocating argv, length = %d\n", - ( - (strlen (allargs) + 1) / (unsigned) 2 - + 2 - ) * sizeof (*argv) - ); + printf ("allocating argv, length = %d\n", + ( + (strlen (allargs) + 1) / (unsigned) 2 + + 2 + ) * sizeof (*argv) + ); #endif - argv = (char **) xmalloc(((strlen (allargs) + 1) / (unsigned) 2 + 2) * sizeof (*argv)); - argv[0] = exec_file; - breakup_args(allargs, &argv[1]); + argv = (char **) xmalloc (((strlen (allargs) + 1) / (unsigned) 2 + 2) * sizeof (*argv)); + argv[0] = exec_file; + breakup_args (allargs, &argv[1]); - } else { + } + else + { - /* We're going to call a shell */ + /* We're going to call a shell */ - /* Now add exec_file, quoting as necessary. */ + /* Now add exec_file, quoting as necessary. */ - char *p; - int need_to_quote; + char *p; + int need_to_quote; - strcat (shell_command, "exec "); + strcat (shell_command, "exec "); - /* Quoting in this style is said to work with all shells. But csh + /* Quoting in this style is said to work with all shells. But csh on IRIX 4.0.1 can't deal with it. So we only quote it if we need to. */ - p = exec_file; - while (1) - { - switch (*p) - { - case '\'': - case '"': - case '(': - case ')': - case '$': - case '&': - case ';': - case '<': - case '>': - case ' ': - case '\n': - case '\t': - need_to_quote = 1; - goto end_scan; - - case '\0': - need_to_quote = 0; - goto end_scan; - - default: - break; - } - ++p; - } - end_scan: - if (need_to_quote) - { - strcat (shell_command, "'"); - for (p = exec_file; *p != '\0'; ++p) - { - if (*p == '\'') - strcat (shell_command, "'\\''"); - else - strncat (shell_command, p, 1); - } - strcat (shell_command, "'"); - } - else - strcat (shell_command, exec_file); - - strcat (shell_command, " "); - strcat (shell_command, allargs); - - } + p = exec_file; + while (1) + { + switch (*p) + { + case '\'': + case '"': + case '(': + case ')': + case '$': + case '&': + case ';': + case '<': + case '>': + case ' ': + case '\n': + case '\t': + need_to_quote = 1; + goto end_scan; + + case '\0': + need_to_quote = 0; + goto end_scan; + + default: + break; + } + ++p; + } + end_scan: + if (need_to_quote) + { + strcat (shell_command, "'"); + for (p = exec_file; *p != '\0'; ++p) + { + if (*p == '\'') + strcat (shell_command, "'\\''"); + else + strncat (shell_command, p, 1); + } + strcat (shell_command, "'"); + } + else + strcat (shell_command, exec_file); + + strcat (shell_command, " "); + strcat (shell_command, allargs); + + } /* exec is said to fail if the executable is open. */ close_exec_file (); /* Retain a copy of our environment variables, since the child will - replace the value of environ and if we're vforked, we have to + replace the value of environ and if we're vforked, we have to restore it. */ save_our_env = environ; @@ -280,13 +287,13 @@ fork_inferior (exec_file, allargs, env, traceme_fun, init_trace_fun, if (pid == 0) { - if (debug_fork) + if (debug_fork) sleep (debug_fork); /* Run inferior in a separate process group. */ debug_setpgrp = gdb_setpgid (); if (debug_setpgrp == -1) - perror("setpgrp failed in child"); + perror ("setpgrp failed in child"); /* Ask the tty subsystem to switch to the one we specified earlier (or to share the current terminal, if none was specified). */ @@ -318,76 +325,81 @@ fork_inferior (exec_file, allargs, env, traceme_fun, init_trace_fun, environ = env; /* If we decided above to start up with a shell, - * we exec the shell, + * we exec the shell, * "-c" says to interpret the next arg as a shell command * to execute, and this command is "exec <target-program> <args>". * "-f" means "fast startup" to the c-shell, which means * don't do .cshrc file. Doing .cshrc may cause fork/exec * events which will confuse debugger start-up code. */ - if (shell) { + if (shell) + { #if 0 - /* HP change is problematic. The -f option has different meanings - for different shells. It is particularly inappropriate for + /* HP change is problematic. The -f option has different meanings + for different shells. It is particularly inappropriate for bourne shells. */ - execlp (shell_file, shell_file, "-f", "-c", shell_command, (char *)0); + execlp (shell_file, shell_file, "-f", "-c", shell_command, (char *) 0); #else - execlp (shell_file, shell_file, "-c", shell_command, (char *)0); + execlp (shell_file, shell_file, "-c", shell_command, (char *) 0); #endif - - - /* If we get here, it's an error */ - fprintf_unfiltered (gdb_stderr, "Cannot exec %s: %s.\n", shell_file, - safe_strerror (errno)); - gdb_flush (gdb_stderr); - _exit (0177); - } else { - /* Otherwise, we directly exec the target program with execvp. */ - int i; - char * errstring; + + + /* If we get here, it's an error */ + fprintf_unfiltered (gdb_stderr, "Cannot exec %s: %s.\n", shell_file, + safe_strerror (errno)); + gdb_flush (gdb_stderr); + _exit (0177); + } + else + { + /* Otherwise, we directly exec the target program with execvp. */ + int i; + char *errstring; #if DEBUGGING - printf("about to exec target, exec_file = %s\n", exec_file); - i = 0; - while (argv[i] != NULL) { - printf("strlen(argv[%d]) is %d\n", i, strlen(argv[i])); - printf("argv[%d] is %s\n", i, argv[i]); - i++; - } + printf ("about to exec target, exec_file = %s\n", exec_file); + i = 0; + while (argv[i] != NULL) + { + printf ("strlen(argv[%d]) is %d\n", i, strlen (argv[i])); + printf ("argv[%d] is %s\n", i, argv[i]); + i++; + } #endif - execvp (exec_file, argv); - - /* If we get here, it's an error */ - errstring = safe_strerror (errno); - fprintf_unfiltered (gdb_stderr, "Cannot exec %s ", exec_file); - - i = 1; - while (argv[i] != NULL) { - if (i != 1) - fprintf_unfiltered (gdb_stderr, " "); - fprintf_unfiltered (gdb_stderr, "%s", argv[i]); - i++; - } - fprintf_unfiltered (gdb_stderr, ".\n"); - /* This extra info seems to be useless + execvp (exec_file, argv); + + /* If we get here, it's an error */ + errstring = safe_strerror (errno); + fprintf_unfiltered (gdb_stderr, "Cannot exec %s ", exec_file); + + i = 1; + while (argv[i] != NULL) + { + if (i != 1) + fprintf_unfiltered (gdb_stderr, " "); + fprintf_unfiltered (gdb_stderr, "%s", argv[i]); + i++; + } + fprintf_unfiltered (gdb_stderr, ".\n"); + /* This extra info seems to be useless fprintf_unfiltered (gdb_stderr, "Got error %s.\n", errstring); */ - gdb_flush (gdb_stderr); - _exit (0177); - } + gdb_flush (gdb_stderr); + _exit (0177); + } } /* Restore our environment in case a vforked child clob'd it. */ environ = save_our_env; - init_thread_list(); + init_thread_list (); inferior_pid = pid; /* Needed for wait_for_inferior stuff below */ /* Now that we have a child process, make it our target, and initialize anything target-vector-specific that needs initializing. */ - (*init_trace_fun)(pid); + (*init_trace_fun) (pid); /* We are now in the child process of interest, having exec'd the correct program, and are poised at the first instruction of the @@ -414,14 +426,14 @@ fork_inferior (exec_file, allargs, env, traceme_fun, init_trace_fun, */ void clone_and_follow_inferior (child_pid, followed_child) - int child_pid; - int *followed_child; + int child_pid; + int *followed_child; { extern int auto_solib_add; - int debugger_pid; - int status; - char pid_spelling [100]; /* Arbitrary but sufficient length. */ + int debugger_pid; + int status; + char pid_spelling[100]; /* Arbitrary but sufficient length. */ /* This semaphore is used to coordinate the two debuggers' handoff of CHILD_PID. The original debugger will detach from CHILD_PID, @@ -432,9 +444,9 @@ clone_and_follow_inferior (child_pid, followed_child) */ #define SEM_TALK (1) #define SEM_LISTEN (0) - int handoff_semaphore[2]; /* Original "talks" to [1], clone "listens" to [0] */ - int talk_value = 99; - int listen_value; + int handoff_semaphore[2]; /* Original "talks" to [1], clone "listens" to [0] */ + int talk_value = 99; + int listen_value; /* Set debug_fork then attach to the child while it sleeps, to debug. */ static int debug_fork = 0; @@ -469,7 +481,7 @@ clone_and_follow_inferior (child_pid, followed_child) to CHILD_PID. */ if (debugger_pid != 0) { - char signal_spelling[100]; /* Arbitrary but sufficient length */ + char signal_spelling[100];/* Arbitrary but sufficient length */ /* Detach from CHILD_PID. Deliver a "stop" signal when we do, though, so that it remains stopped until the clone debugger can attach @@ -489,8 +501,8 @@ clone_and_follow_inferior (child_pid, followed_child) /* We're the child. */ else { - if (debug_fork) - sleep (debug_fork); + if (debug_fork) + sleep (debug_fork); /* The child (i.e., the cloned debugger) must now attach to CHILD_PID. inferior_pid is presently set to the parent process @@ -516,7 +528,7 @@ clone_and_follow_inferior (child_pid, followed_child) new_tty (); dont_repeat (); - sprintf(pid_spelling, "%d", child_pid); + sprintf (pid_spelling, "%d", child_pid); target_require_attach (pid_spelling, 1); /* Perform any necessary cleanup, after attachment. (This form @@ -592,11 +604,11 @@ startup_inferior (ntraps) terminal_initted = 1; } - pending_execs = pending_execs - 1; + pending_execs = pending_execs - 1; if (0 == pending_execs) break; - resume (0, TARGET_SIGNAL_0); /* Just make it go on */ + resume (0, TARGET_SIGNAL_0); /* Just make it go on */ } } #endif /* STARTUP_INFERIOR */ |