Copyright (C) 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995,
1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2007, 2008,
- 2009 Free Software Foundation, Inc.
+ 2009, 2010 Free Software Foundation, Inc.
This file is part of GDB.
/* System root path, used to find libraries etc. */
char *gdb_sysroot = 0;
+/* GDB datadir, used to store data files. */
+char *gdb_datadir = 0;
+
struct ui_file *gdb_stdout;
struct ui_file *gdb_stderr;
struct ui_file *gdb_stdlog;
extern char *external_editor_command;
+/* Relocate a file or directory. PROGNAME is the name by which gdb
+ was invoked (i.e., argv[0]). INITIAL is the default value for the
+ file or directory. FLAG is true if the value is relocatable, false
+ otherwise. Returns a newly allocated string; this may return NULL
+ under the same conditions as make_relative_prefix. */
+static char *
+relocate_path (const char *progname, const char *initial, int flag)
+{
+ if (flag)
+ return make_relative_prefix (progname, BINDIR, initial);
+ return xstrdup (initial);
+}
+
+/* Like relocate_path, but specifically checks for a directory.
+ INITIAL is relocated according to the rules of relocate_path. If
+ the result is a directory, it is used; otherwise, INITIAL is used.
+ The chosen directory is then canonicalized using lrealpath. This
+ function always returns a newly-allocated string. */
+static char *
+relocate_directory (const char *progname, const char *initial, int flag)
+{
+ char *dir;
+
+ dir = relocate_path (progname, initial, flag);
+ if (dir)
+ {
+ struct stat s;
+
+ if (stat (dir, &s) != 0 || !S_ISDIR (s.st_mode))
+ {
+ xfree (dir);
+ dir = NULL;
+ }
+ }
+ if (!dir)
+ dir = xstrdup (initial);
+
+ /* Canonicalize the directory. */
+ if (*dir)
+ {
+ char *canon_sysroot = lrealpath (dir);
+ if (canon_sysroot)
+ {
+ xfree (dir);
+ dir = canon_sysroot;
+ }
+ }
+
+ return dir;
+}
+
/* Compute the locations of init files that GDB should source and return
them in SYSTEM_GDBINIT, HOME_GDBINIT, LOCAL_GDBINIT. If there is
no system gdbinit (resp. home gdbinit and local gdbinit) to be loaded,
struct stat homebuf, cwdbuf, s;
char *homedir, *relocated_sysgdbinit;
- sysgdbinit = SYSTEM_GDBINIT;
- if (!sysgdbinit [0] || stat (sysgdbinit, &s) != 0)
- sysgdbinit = NULL;
-
-#ifdef SYSTEM_GDBINIT_RELOCATABLE
- relocated_sysgdbinit = make_relative_prefix (gdb_program_name, BINDIR,
- SYSTEM_GDBINIT);
- if (relocated_sysgdbinit)
+ if (SYSTEM_GDBINIT[0])
{
- struct stat s;
- int res = 0;
-
- if (stat (relocated_sysgdbinit, &s) == 0)
+ relocated_sysgdbinit = relocate_path (gdb_program_name,
+ SYSTEM_GDBINIT,
+ SYSTEM_GDBINIT_RELOCATABLE);
+ if (relocated_sysgdbinit && stat (relocated_sysgdbinit, &s) == 0)
sysgdbinit = relocated_sysgdbinit;
else
xfree (relocated_sysgdbinit);
}
-#endif
homedir = getenv ("HOME");
current_directory = gdb_dirbuf;
/* Set the sysroot path. */
-#ifdef TARGET_SYSTEM_ROOT_RELOCATABLE
- gdb_sysroot = make_relative_prefix (argv[0], BINDIR, TARGET_SYSTEM_ROOT);
- if (gdb_sysroot)
- {
- struct stat s;
- int res = 0;
+ gdb_sysroot = relocate_directory (argv[0], TARGET_SYSTEM_ROOT,
+ TARGET_SYSTEM_ROOT_RELOCATABLE);
- if (stat (gdb_sysroot, &s) == 0)
- if (S_ISDIR (s.st_mode))
- res = 1;
+ debug_file_directory = relocate_directory (argv[0], DEBUGDIR,
+ DEBUGDIR_RELOCATABLE);
- if (res == 0)
- {
- xfree (gdb_sysroot);
- gdb_sysroot = xstrdup (TARGET_SYSTEM_ROOT);
- }
- }
- else
- gdb_sysroot = xstrdup (TARGET_SYSTEM_ROOT);
-#else
- gdb_sysroot = xstrdup (TARGET_SYSTEM_ROOT);
-#endif
-
- /* Canonicalize the sysroot path. */
- if (*gdb_sysroot)
- {
- char *canon_sysroot = lrealpath (gdb_sysroot);
- if (canon_sysroot)
- {
- xfree (gdb_sysroot);
- gdb_sysroot = canon_sysroot;
- }
- }
-
-#ifdef DEBUGDIR_RELOCATABLE
- debug_file_directory = make_relative_prefix (argv[0], BINDIR, DEBUGDIR);
- if (debug_file_directory)
- {
- struct stat s;
- int res = 0;
-
- if (stat (debug_file_directory, &s) == 0)
- if (S_ISDIR (s.st_mode))
- res = 1;
-
- if (res == 0)
- {
- xfree (debug_file_directory);
- debug_file_directory = xstrdup (DEBUGDIR);
- }
- }
- else
- debug_file_directory = xstrdup (DEBUGDIR);
-#else
- debug_file_directory = xstrdup (DEBUGDIR);
-#endif
-
- /* Canonicalize the debugfile path. */
- if (*debug_file_directory)
- {
- char *canon_debug = lrealpath (debug_file_directory);
- if (canon_debug)
- {
- xfree (debug_file_directory);
- debug_file_directory = canon_debug;
- }
- }
-
- get_init_files (&system_gdbinit, &home_gdbinit, &local_gdbinit);
+ gdb_datadir = relocate_directory (argv[0], GDB_DATADIR,
+ GDB_DATADIR_RELOCATABLE);
#ifdef RELOC_SRCDIR
add_substitute_path_rule (RELOC_SRCDIR,
{"statistics", no_argument, 0, OPT_STATISTICS},
{"write", no_argument, &write_files, 1},
{"args", no_argument, &set_args, 1},
- {"l", required_argument, 0, 'l'},
+ {"l", required_argument, 0, 'l'},
{"return-child-result", no_argument, &return_child_result, 1},
{0, no_argument, 0, 0}
};
use_windows = 0;
}
- if (set_args)
- {
- /* The remaining options are the command-line options for the
- inferior. The first one is the sym/exec file, and the rest
- are arguments. */
- if (optind >= argc)
- {
- fprintf_unfiltered (gdb_stderr,
- _("%s: `--args' specified but no program specified\n"),
- argv[0]);
- exit (1);
- }
- symarg = argv[optind];
- execarg = argv[optind];
- ++optind;
- set_inferior_args_vector (argc - optind, &argv[optind]);
- }
- else
- {
- /* OK, that's all the options. */
-
- /* The first argument, if specified, is the name of the
- executable. */
- if (optind < argc)
- {
- symarg = argv[optind];
- execarg = argv[optind];
- optind++;
- }
-
- /* If the user hasn't already specified a PID or the name of a
- core file, then a second optional argument is allowed. If
- present, this argument should be interpreted as either a
- PID or a core file, whichever works. */
- if (pidarg == NULL && corearg == NULL && optind < argc)
- {
- pid_or_core_arg = argv[optind];
- optind++;
- }
-
- /* Any argument left on the command line is unexpected and
- will be ignored. Inform the user. */
- if (optind < argc)
- fprintf_unfiltered (gdb_stderr, _("\
-Excess command line arguments ignored. (%s%s)\n"),
- argv[optind],
- (optind == argc - 1) ? "" : " ...");
- }
if (batch)
quiet = 1;
}
control of the console via the deprecated_init_ui_hook (). */
gdb_init (argv[0]);
+ /* Now that gdb_init has created the initial inferior, we're in position
+ to set args for that inferior. */
+ if (set_args)
+ {
+ /* The remaining options are the command-line options for the
+ inferior. The first one is the sym/exec file, and the rest
+ are arguments. */
+ if (optind >= argc)
+ {
+ fprintf_unfiltered (gdb_stderr,
+ _("%s: `--args' specified but no program specified\n"),
+ argv[0]);
+ exit (1);
+ }
+ symarg = argv[optind];
+ execarg = argv[optind];
+ ++optind;
+ set_inferior_args_vector (argc - optind, &argv[optind]);
+ }
+ else
+ {
+ /* OK, that's all the options. */
+
+ /* The first argument, if specified, is the name of the
+ executable. */
+ if (optind < argc)
+ {
+ symarg = argv[optind];
+ execarg = argv[optind];
+ optind++;
+ }
+
+ /* If the user hasn't already specified a PID or the name of a
+ core file, then a second optional argument is allowed. If
+ present, this argument should be interpreted as either a
+ PID or a core file, whichever works. */
+ if (pidarg == NULL && corearg == NULL && optind < argc)
+ {
+ pid_or_core_arg = argv[optind];
+ optind++;
+ }
+
+ /* Any argument left on the command line is unexpected and
+ will be ignored. Inform the user. */
+ if (optind < argc)
+ fprintf_unfiltered (gdb_stderr, _("\
+Excess command line arguments ignored. (%s%s)\n"),
+ argv[optind],
+ (optind == argc - 1) ? "" : " ...");
+ }
+
+ /* Lookup gdbinit files. Note that the gdbinit file name may be overriden
+ during file initialization, so get_init_files should be called after
+ gdb_init. */
+ get_init_files (&system_gdbinit, &home_gdbinit, &local_gdbinit);
+
/* Do these (and anything which might call wrap_here or *_filtered)
after initialize_all_files() but before the interpreter has been
installed. Otherwize the help/version messages will be eaten by
open it, better only print one error message.
catch_command_errors returns non-zero on success! */
if (catch_command_errors (exec_file_attach, execarg, !batch, RETURN_MASK_ALL))
- catch_command_errors (symbol_file_add_main, symarg, 0, RETURN_MASK_ALL);
+ catch_command_errors (symbol_file_add_main, symarg, !batch, RETURN_MASK_ALL);
}
else
{
if (execarg != NULL)
catch_command_errors (exec_file_attach, execarg, !batch, RETURN_MASK_ALL);
if (symarg != NULL)
- catch_command_errors (symbol_file_add_main, symarg, 0, RETURN_MASK_ALL);
+ catch_command_errors (symbol_file_add_main, symarg, !batch, RETURN_MASK_ALL);
}
if (corearg && pidarg)
}
if (ttyarg != NULL)
- catch_command_errors (tty_command, ttyarg, !batch, RETURN_MASK_ALL);
+ set_inferior_io_terminal (ttyarg);
/* Error messages should no longer be distinguished with extra output. */
error_pre_print = NULL;