gdb/auto-load.c - gdb
Global variables defined
Data types defined
Functions defined
Macros defined
Source code
- #include "defs.h"
- #include "auto-load.h"
- #include "progspace.h"
- #include "gdb_regex.h"
- #include "ui-out.h"
- #include "filenames.h"
- #include "command.h"
- #include "observer.h"
- #include "objfiles.h"
- #include "cli/cli-script.h"
- #include "gdbcmd.h"
- #include "cli/cli-cmds.h"
- #include "cli/cli-decode.h"
- #include "cli/cli-setshow.h"
- #include "gdb_vecs.h"
- #include "readline/tilde.h"
- #include "completer.h"
- #include "fnmatch.h"
- #include "top.h"
- #include "filestuff.h"
- #include "extension.h"
- #include "gdb/section-scripts.h"
- #define AUTO_SECTION_NAME ".debug_gdb_scripts"
- static int maybe_add_script (struct auto_load_pspace_info *pspace_info,
- int loaded, const char *name,
- const char *full_path,
- const struct extension_language_defn *language);
- static int unsupported_script_warning_print (struct auto_load_pspace_info *);
- static int script_not_found_warning_print (struct auto_load_pspace_info *);
- static int debug_auto_load = 0;
- static void
- show_debug_auto_load (struct ui_file *file, int from_tty,
- struct cmd_list_element *c, const char *value)
- {
- fprintf_filtered (file, _("Debugging output for files "
- "of 'set auto-load ...' is %s.\n"),
- value);
- }
- static int auto_load_gdb_scripts = 1;
- static void
- show_auto_load_gdb_scripts (struct ui_file *file, int from_tty,
- struct cmd_list_element *c, const char *value)
- {
- fprintf_filtered (file, _("Auto-loading of canned sequences of commands "
- "scripts is %s.\n"),
- value);
- }
- int
- auto_load_gdb_scripts_enabled (const struct extension_language_defn *extlang)
- {
- return auto_load_gdb_scripts;
- }
- int global_auto_load = 1;
- int auto_load_local_gdbinit = 1;
- char *auto_load_local_gdbinit_pathname = NULL;
- int auto_load_local_gdbinit_loaded = 0;
- static void
- show_auto_load_local_gdbinit (struct ui_file *file, int from_tty,
- struct cmd_list_element *c, const char *value)
- {
- fprintf_filtered (file, _("Auto-loading of .gdbinit script from current "
- "directory is %s.\n"),
- value);
- }
- static char *auto_load_dir;
- static void
- set_auto_load_dir (char *args, int from_tty, struct cmd_list_element *c)
- {
-
- if (auto_load_dir[0] == '\0')
- {
- xfree (auto_load_dir);
- auto_load_dir = xstrdup (AUTO_LOAD_DIR);
- }
- }
- static void
- show_auto_load_dir (struct ui_file *file, int from_tty,
- struct cmd_list_element *c, const char *value)
- {
- fprintf_filtered (file, _("List of directories from which to load "
- "auto-loaded scripts is %s.\n"),
- value);
- }
- static char *auto_load_safe_path;
- static VEC (char_ptr) *auto_load_safe_path_vec;
- static VEC (char_ptr) *
- auto_load_expand_dir_vars (const char *string)
- {
- VEC (char_ptr) *dir_vec;
- char *s;
- s = xstrdup (string);
- substitute_path_component (&s, "$datadir", gdb_datadir);
- substitute_path_component (&s, "$debugdir", debug_file_directory);
- if (debug_auto_load && strcmp (s, string) != 0)
- fprintf_unfiltered (gdb_stdlog,
- _("auto-load: Expanded $-variables to \"%s\".\n"), s);
- dir_vec = dirnames_to_char_ptr_vec (s);
- xfree(s);
- return dir_vec;
- }
- static void
- auto_load_safe_path_vec_update (void)
- {
- unsigned len;
- int ix;
- if (debug_auto_load)
- fprintf_unfiltered (gdb_stdlog,
- _("auto-load: Updating directories of \"%s\".\n"),
- auto_load_safe_path);
- free_char_ptr_vec (auto_load_safe_path_vec);
- auto_load_safe_path_vec = auto_load_expand_dir_vars (auto_load_safe_path);
- len = VEC_length (char_ptr, auto_load_safe_path_vec);
-
- for (ix = 0; ix < len; ix++)
- {
- char *dir = VEC_index (char_ptr, auto_load_safe_path_vec, ix);
- char *expanded = tilde_expand (dir);
- char *real_path = gdb_realpath (expanded);
-
- VEC_replace (char_ptr, auto_load_safe_path_vec, ix, expanded);
- if (debug_auto_load)
- {
- if (strcmp (expanded, dir) == 0)
- fprintf_unfiltered (gdb_stdlog,
- _("auto-load: Using directory \"%s\".\n"),
- expanded);
- else
- fprintf_unfiltered (gdb_stdlog,
- _("auto-load: Resolved directory \"%s\" "
- "as \"%s\".\n"),
- dir, expanded);
- }
- xfree (dir);
-
- if (strcmp (real_path, expanded) == 0)
- xfree (real_path);
- else
- {
- VEC_safe_push (char_ptr, auto_load_safe_path_vec, real_path);
- if (debug_auto_load)
- fprintf_unfiltered (gdb_stdlog,
- _("auto-load: And canonicalized as \"%s\".\n"),
- real_path);
- }
- }
- }
- static void
- auto_load_gdb_datadir_changed (void)
- {
- auto_load_safe_path_vec_update ();
- }
- static void
- set_auto_load_safe_path (char *args, int from_tty, struct cmd_list_element *c)
- {
-
- if (auto_load_safe_path[0] == '\0')
- {
- xfree (auto_load_safe_path);
- auto_load_safe_path = xstrdup (AUTO_LOAD_SAFE_PATH);
- }
- auto_load_safe_path_vec_update ();
- }
- static void
- show_auto_load_safe_path (struct ui_file *file, int from_tty,
- struct cmd_list_element *c, const char *value)
- {
- const char *cs;
-
- for (cs = value; *cs && (*cs == DIRNAME_SEPARATOR || IS_DIR_SEPARATOR (*cs));
- cs++);
- if (*cs == 0)
- fprintf_filtered (file, _("Auto-load files are safe to load from any "
- "directory.\n"));
- else
- fprintf_filtered (file, _("List of directories from which it is safe to "
- "auto-load files is %s.\n"),
- value);
- }
- static void
- add_auto_load_safe_path (char *args, int from_tty)
- {
- char *s;
- if (args == NULL || *args == 0)
- error (_("\
- Directory argument required.\n\
- Use 'set auto-load safe-path /' for disabling the auto-load safe-path security.\
- "));
- s = xstrprintf ("%s%c%s", auto_load_safe_path, DIRNAME_SEPARATOR, args);
- xfree (auto_load_safe_path);
- auto_load_safe_path = s;
- auto_load_safe_path_vec_update ();
- }
- static void
- add_auto_load_dir (char *args, int from_tty)
- {
- char *s;
- if (args == NULL || *args == 0)
- error (_("Directory argument required."));
- s = xstrprintf ("%s%c%s", auto_load_dir, DIRNAME_SEPARATOR, args);
- xfree (auto_load_dir);
- auto_load_dir = s;
- }
- static int
- filename_is_in_pattern_1 (char *filename, char *pattern)
- {
- size_t pattern_len = strlen (pattern);
- size_t filename_len = strlen (filename);
- if (debug_auto_load)
- fprintf_unfiltered (gdb_stdlog, _("auto-load: Matching file \"%s\" "
- "to pattern \"%s\"\n"),
- filename, pattern);
-
- while (pattern_len && IS_DIR_SEPARATOR (pattern[pattern_len - 1]))
- pattern_len--;
- pattern[pattern_len] = '\0';
-
- if (pattern_len == 0)
- {
- if (debug_auto_load)
- fprintf_unfiltered (gdb_stdlog,
- _("auto-load: Matched - empty pattern\n"));
- return 1;
- }
- for (;;)
- {
-
- while (filename_len && IS_DIR_SEPARATOR (filename[filename_len - 1]))
- filename_len--;
- filename[filename_len] = '\0';
- if (filename_len == 0)
- {
- if (debug_auto_load)
- fprintf_unfiltered (gdb_stdlog,
- _("auto-load: Not matched - pattern \"%s\".\n"),
- pattern);
- return 0;
- }
- if (gdb_filename_fnmatch (pattern, filename, FNM_FILE_NAME | FNM_NOESCAPE)
- == 0)
- {
- if (debug_auto_load)
- fprintf_unfiltered (gdb_stdlog, _("auto-load: Matched - file "
- "\"%s\" to pattern \"%s\".\n"),
- filename, pattern);
- return 1;
- }
-
- while (filename_len > 0 && !IS_DIR_SEPARATOR (filename[filename_len - 1]))
- filename_len--;
- }
- }
- static ATTRIBUTE_PURE int
- filename_is_in_pattern (const char *filename, const char *pattern)
- {
- char *filename_copy, *pattern_copy;
- filename_copy = alloca (strlen (filename) + 1);
- strcpy (filename_copy, filename);
- pattern_copy = alloca (strlen (pattern) + 1);
- strcpy (pattern_copy, pattern);
- return filename_is_in_pattern_1 (filename_copy, pattern_copy);
- }
- static int
- filename_is_in_auto_load_safe_path_vec (const char *filename,
- char **filename_realp)
- {
- char *pattern;
- int ix;
- for (ix = 0; VEC_iterate (char_ptr, auto_load_safe_path_vec, ix, pattern);
- ++ix)
- if (*filename_realp == NULL && filename_is_in_pattern (filename, pattern))
- break;
- if (pattern == NULL)
- {
- if (*filename_realp == NULL)
- {
- *filename_realp = gdb_realpath (filename);
- if (debug_auto_load && strcmp (*filename_realp, filename) != 0)
- fprintf_unfiltered (gdb_stdlog,
- _("auto-load: Resolved "
- "file \"%s\" as \"%s\".\n"),
- filename, *filename_realp);
- }
- if (strcmp (*filename_realp, filename) != 0)
- for (ix = 0;
- VEC_iterate (char_ptr, auto_load_safe_path_vec, ix, pattern); ++ix)
- if (filename_is_in_pattern (*filename_realp, pattern))
- break;
- }
- if (pattern != NULL)
- {
- if (debug_auto_load)
- fprintf_unfiltered (gdb_stdlog, _("auto-load: File \"%s\" matches "
- "directory \"%s\".\n"),
- filename, pattern);
- return 1;
- }
- return 0;
- }
- int
- file_is_auto_load_safe (const char *filename, const char *debug_fmt, ...)
- {
- char *filename_real = NULL;
- struct cleanup *back_to;
- static int advice_printed = 0;
- if (debug_auto_load)
- {
- va_list debug_args;
- va_start (debug_args, debug_fmt);
- vfprintf_unfiltered (gdb_stdlog, debug_fmt, debug_args);
- va_end (debug_args);
- }
- back_to = make_cleanup (free_current_contents, &filename_real);
- if (filename_is_in_auto_load_safe_path_vec (filename, &filename_real))
- {
- do_cleanups (back_to);
- return 1;
- }
- auto_load_safe_path_vec_update ();
- if (filename_is_in_auto_load_safe_path_vec (filename, &filename_real))
- {
- do_cleanups (back_to);
- return 1;
- }
- warning (_("File \"%s\" auto-loading has been declined by your "
- "`auto-load safe-path' set to \"%s\"."),
- filename_real, auto_load_safe_path);
- if (!advice_printed)
- {
- const char *homedir = getenv ("HOME");
- char *homeinit;
- if (homedir == NULL)
- homedir = "$HOME";
- homeinit = xstrprintf ("%s/%s", homedir, gdbinit);
- make_cleanup (xfree, homeinit);
- printf_filtered (_("\
- To enable execution of this file add\n\
- \tadd-auto-load-safe-path %s\n\
- line to your configuration file \"%s\".\n\
- To completely disable this security protection add\n\
- \tset auto-load safe-path /\n\
- line to your configuration file \"%s\".\n\
- For more information about this security protection see the\n\
- \"Auto-loading safe path\" section in the GDB manual. E.g., run from the shell:\n\
- \tinfo \"(gdb)Auto-loading safe path\"\n"),
- filename_real, homeinit, homeinit);
- advice_printed = 1;
- }
- do_cleanups (back_to);
- return 0;
- }
- struct auto_load_pspace_info
- {
-
- struct htab *loaded_scripts;
-
- int unsupported_script_warning_printed;
-
- int script_not_found_warning_printed;
- };
- struct loaded_script
- {
-
- const char *name;
-
- const char *full_path;
-
- int loaded;
- const struct extension_language_defn *language;
- };
- static const struct program_space_data *auto_load_pspace_data;
- static void
- auto_load_pspace_data_cleanup (struct program_space *pspace, void *arg)
- {
- struct auto_load_pspace_info *info = arg;
- if (info->loaded_scripts)
- htab_delete (info->loaded_scripts);
- xfree (info);
- }
- static struct auto_load_pspace_info *
- get_auto_load_pspace_data (struct program_space *pspace)
- {
- struct auto_load_pspace_info *info;
- info = program_space_data (pspace, auto_load_pspace_data);
- if (info == NULL)
- {
- info = XCNEW (struct auto_load_pspace_info);
- set_program_space_data (pspace, auto_load_pspace_data, info);
- }
- return info;
- }
- static hashval_t
- hash_loaded_script_entry (const void *data)
- {
- const struct loaded_script *e = data;
- return htab_hash_string (e->name) ^ htab_hash_pointer (e->language);
- }
- static int
- eq_loaded_script_entry (const void *a, const void *b)
- {
- const struct loaded_script *ea = a;
- const struct loaded_script *eb = b;
- return strcmp (ea->name, eb->name) == 0 && ea->language == eb->language;
- }
- static void
- init_loaded_scripts_info (struct auto_load_pspace_info *pspace_info)
- {
-
- pspace_info->loaded_scripts = htab_create (31,
- hash_loaded_script_entry,
- eq_loaded_script_entry,
- xfree);
- pspace_info->unsupported_script_warning_printed = FALSE;
- pspace_info->script_not_found_warning_printed = FALSE;
- }
- struct auto_load_pspace_info *
- get_auto_load_pspace_data_for_loading (struct program_space *pspace)
- {
- struct auto_load_pspace_info *info;
- info = get_auto_load_pspace_data (pspace);
- if (info->loaded_scripts == NULL)
- init_loaded_scripts_info (info);
- return info;
- }
- static int
- maybe_add_script (struct auto_load_pspace_info *pspace_info, int loaded,
- const char *name, const char *full_path,
- const struct extension_language_defn *language)
- {
- struct htab *htab = pspace_info->loaded_scripts;
- struct loaded_script **slot, entry;
- int in_hash_table;
- entry.name = name;
- entry.language = language;
- slot = (struct loaded_script **) htab_find_slot (htab, &entry, INSERT);
- in_hash_table = *slot != NULL;
-
- if (! in_hash_table)
- {
- char *p;
-
- *slot = xmalloc (sizeof (**slot)
- + strlen (name) + 1
- + (full_path != NULL ? (strlen (full_path) + 1) : 0));
- p = ((char*) *slot) + sizeof (**slot);
- strcpy (p, name);
- (*slot)->name = p;
- if (full_path != NULL)
- {
- p += strlen (p) + 1;
- strcpy (p, full_path);
- (*slot)->full_path = p;
- }
- else
- (*slot)->full_path = NULL;
- (*slot)->loaded = loaded;
- (*slot)->language = language;
- }
- return in_hash_table;
- }
- static void
- clear_section_scripts (void)
- {
- struct program_space *pspace = current_program_space;
- struct auto_load_pspace_info *info;
- info = program_space_data (pspace, auto_load_pspace_data);
- if (info != NULL && info->loaded_scripts != NULL)
- {
- htab_delete (info->loaded_scripts);
- info->loaded_scripts = NULL;
- info->unsupported_script_warning_printed = FALSE;
- info->script_not_found_warning_printed = FALSE;
- }
- }
- static int
- auto_load_objfile_script_1 (struct objfile *objfile, const char *realname,
- const struct extension_language_defn *language)
- {
- char *filename, *debugfile;
- int len, retval;
- FILE *input;
- struct cleanup *cleanups;
- const char *suffix = ext_lang_auto_load_suffix (language);
- len = strlen (realname);
- filename = xmalloc (len + strlen (suffix) + 1);
- memcpy (filename, realname, len);
- strcpy (filename + len, suffix);
- cleanups = make_cleanup (xfree, filename);
- input = gdb_fopen_cloexec (filename, "r");
- debugfile = filename;
- if (debug_auto_load)
- fprintf_unfiltered (gdb_stdlog, _("auto-load: Attempted file \"%s\" %s.\n"),
- debugfile, input ? _("exists") : _("does not exist"));
- if (!input)
- {
- VEC (char_ptr) *vec;
- int ix;
- char *dir;
-
- vec = auto_load_expand_dir_vars (auto_load_dir);
- make_cleanup_free_char_ptr_vec (vec);
- if (debug_auto_load)
- fprintf_unfiltered (gdb_stdlog, _("auto-load: Searching 'set auto-load "
- "scripts-directory' path \"%s\".\n"),
- auto_load_dir);
- for (ix = 0; VEC_iterate (char_ptr, vec, ix, dir); ++ix)
- {
- debugfile = xmalloc (strlen (dir) + strlen (filename) + 1);
- strcpy (debugfile, dir);
-
- strcat (debugfile, filename);
- make_cleanup (xfree, debugfile);
- input = gdb_fopen_cloexec (debugfile, "r");
- if (debug_auto_load)
- fprintf_unfiltered (gdb_stdlog, _("auto-load: Attempted file "
- "\"%s\" %s.\n"),
- debugfile,
- input ? _("exists") : _("does not exist"));
- if (input != NULL)
- break;
- }
- }
- if (input)
- {
- int is_safe;
- struct auto_load_pspace_info *pspace_info;
- make_cleanup_fclose (input);
- is_safe
- = file_is_auto_load_safe (debugfile,
- _("auto-load: Loading %s script \"%s\""
- " by extension for objfile \"%s\".\n"),
- ext_lang_name (language),
- debugfile, objfile_name (objfile));
-
- pspace_info
- = get_auto_load_pspace_data_for_loading (current_program_space);
- maybe_add_script (pspace_info, is_safe, debugfile, debugfile, language);
-
- if (is_safe)
- {
- objfile_script_sourcer_func *sourcer
- = ext_lang_objfile_script_sourcer (language);
-
- gdb_assert (sourcer != NULL);
- sourcer (language, objfile, input, debugfile);
- }
- retval = 1;
- }
- else
- retval = 0;
- do_cleanups (cleanups);
- return retval;
- }
- void
- auto_load_objfile_script (struct objfile *objfile,
- const struct extension_language_defn *language)
- {
- char *realname = gdb_realpath (objfile_name (objfile));
- struct cleanup *cleanups = make_cleanup (xfree, realname);
- if (!auto_load_objfile_script_1 (objfile, realname, language))
- {
-
- size_t len = strlen (realname);
- const size_t lexe = sizeof (".exe") - 1;
- if (len > lexe && strcasecmp (realname + len - lexe, ".exe") == 0)
- {
- len -= lexe;
- realname[len] = '\0';
- if (debug_auto_load)
- fprintf_unfiltered (gdb_stdlog, _("auto-load: Stripped .exe suffix, "
- "retrying with \"%s\".\n"),
- realname);
- auto_load_objfile_script_1 (objfile, realname, language);
- }
- }
- do_cleanups (cleanups);
- }
- static void
- source_section_scripts (struct objfile *objfile, const char *section_name,
- const char *start, const char *end)
- {
- const char *p;
- struct auto_load_pspace_info *pspace_info;
- pspace_info = get_auto_load_pspace_data_for_loading (current_program_space);
- for (p = start; p < end; ++p)
- {
- const char *file;
- FILE *stream;
- char *full_path;
- int opened, in_hash_table;
- struct cleanup *back_to;
- const struct extension_language_defn *language;
- objfile_script_sourcer_func *sourcer;
- switch (*p)
- {
- case SECTION_SCRIPT_ID_PYTHON_FILE:
- language = get_ext_lang_defn (EXT_LANG_PYTHON);
- break;
- case SECTION_SCRIPT_ID_SCHEME_FILE:
- language = get_ext_lang_defn (EXT_LANG_GUILE);
- break;
- default:
- warning (_("Invalid entry in %s section"), section_name);
-
- return;
- }
- file = ++p;
- while (p < end && *p != '\0')
- ++p;
- if (p == end)
- {
- char *buf = alloca (p - file + 1);
- memcpy (buf, file, p - file);
- buf[p - file] = '\0';
- warning (_("Non-null-terminated path in %s: %s"),
- section_name, buf);
-
- break;
- }
- if (p == file)
- {
- warning (_("Empty path in %s"), section_name);
- continue;
- }
-
-
- sourcer = ext_lang_objfile_script_sourcer (language);
- if (sourcer == NULL)
- {
-
- if (!unsupported_script_warning_print (pspace_info))
- {
- warning (_("Unsupported auto-load scripts referenced in"
- " %s section\n"
- "of file %s.\n"
- "Use `info auto-load %s-scripts [REGEXP]'"
- " to list them."),
- section_name, objfile_name (objfile),
- ext_lang_name (language));
- }
-
- maybe_add_script (pspace_info, 0, file, NULL, language);
- continue;
- }
-
- if (!ext_lang_auto_load_enabled (language))
- {
-
- continue;
- }
- opened = find_and_open_script (file, 1 ,
- &stream, &full_path);
- back_to = make_cleanup (null_cleanup, NULL);
- if (opened)
- {
- make_cleanup_fclose (stream);
- make_cleanup (xfree, full_path);
- if (!file_is_auto_load_safe (full_path,
- _("auto-load: Loading %s script "
- "\"%s\" from section \"%s\" of "
- "objfile \"%s\".\n"),
- ext_lang_name (language), full_path,
- section_name, objfile_name (objfile)))
- opened = 0;
- }
- else
- {
- full_path = NULL;
-
- if (script_not_found_warning_print (pspace_info))
- warning (_("Missing auto-load scripts referenced in section %s\n\
- of file %s\n\
- Use `info auto-load %s-scripts [REGEXP]' to list them."),
- section_name, objfile_name (objfile),
- ext_lang_name (language));
- }
- in_hash_table = maybe_add_script (pspace_info, opened, file, full_path,
- language);
-
- if (opened && !in_hash_table)
- sourcer (language, objfile, stream, full_path);
- do_cleanups (back_to);
- }
- }
- static void
- auto_load_section_scripts (struct objfile *objfile, const char *section_name)
- {
- bfd *abfd = objfile->obfd;
- asection *scripts_sect;
- bfd_byte *data = NULL;
- scripts_sect = bfd_get_section_by_name (abfd, section_name);
- if (scripts_sect == NULL)
- return;
- if (!bfd_get_full_section_contents (abfd, scripts_sect, &data))
- warning (_("Couldn't read %s section of %s"),
- section_name, bfd_get_filename (abfd));
- else
- {
- struct cleanup *cleanups;
- char *p = (char *) data;
- cleanups = make_cleanup (xfree, p);
- source_section_scripts (objfile, section_name, p,
- p + bfd_get_section_size (scripts_sect));
- do_cleanups (cleanups);
- }
- }
- void
- load_auto_scripts_for_objfile (struct objfile *objfile)
- {
-
- if (!global_auto_load || (objfile->flags & OBJF_NOT_FILENAME) != 0)
- return;
-
- auto_load_ext_lang_scripts_for_objfile (objfile);
-
- auto_load_section_scripts (objfile, AUTO_SECTION_NAME);
- }
- static void
- auto_load_new_objfile (struct objfile *objfile)
- {
- if (!objfile)
- {
-
- clear_section_scripts ();
- return;
- }
- load_auto_scripts_for_objfile (objfile);
- }
- typedef struct loaded_script *loaded_script_ptr;
- DEF_VEC_P (loaded_script_ptr);
- struct collect_matching_scripts_data
- {
- VEC (loaded_script_ptr) **scripts_p;
- const struct extension_language_defn *language;
- };
- static int
- collect_matching_scripts (void **slot, void *info)
- {
- struct loaded_script *script = *slot;
- struct collect_matching_scripts_data *data = info;
- if (script->language == data->language && re_exec (script->name))
- VEC_safe_push (loaded_script_ptr, *data->scripts_p, script);
- return 1;
- }
- static void
- print_script (struct loaded_script *script)
- {
- struct ui_out *uiout = current_uiout;
- struct cleanup *chain;
- chain = make_cleanup_ui_out_tuple_begin_end (uiout, NULL);
- ui_out_field_string (uiout, "loaded", script->loaded ? "Yes" : "No");
- ui_out_field_string (uiout, "script", script->name);
- ui_out_text (uiout, "\n");
-
- if (script->full_path != NULL
- && strcmp (script->name, script->full_path) != 0)
- {
- ui_out_text (uiout, "\tfull name: ");
- ui_out_field_string (uiout, "full_path", script->full_path);
- ui_out_text (uiout, "\n");
- }
- do_cleanups (chain);
- }
- static int
- sort_scripts_by_name (const void *ap, const void *bp)
- {
- const struct loaded_script *a = *(const struct loaded_script **) ap;
- const struct loaded_script *b = *(const struct loaded_script **) bp;
- return FILENAME_CMP (a->name, b->name);
- }
- XXX
- char auto_load_info_scripts_pattern_nl[] = "";
- void
- auto_load_info_scripts (char *pattern, int from_tty,
- const struct extension_language_defn *language)
- {
- struct ui_out *uiout = current_uiout;
- struct auto_load_pspace_info *pspace_info;
- struct cleanup *script_chain;
- VEC (loaded_script_ptr) *scripts;
- int nr_scripts;
- dont_repeat ();
- pspace_info = get_auto_load_pspace_data (current_program_space);
- if (pattern && *pattern)
- {
- char *re_err = re_comp (pattern);
- if (re_err)
- error (_("Invalid regexp: %s"), re_err);
- }
- else
- {
- re_comp ("");
- }
-
- scripts = VEC_alloc (loaded_script_ptr, 10);
- script_chain = make_cleanup (VEC_cleanup (loaded_script_ptr), &scripts);
- if (pspace_info != NULL && pspace_info->loaded_scripts != NULL)
- {
- struct collect_matching_scripts_data data = { &scripts, language };
-
- htab_traverse_noresize (pspace_info->loaded_scripts,
- collect_matching_scripts, &data);
- }
- nr_scripts = VEC_length (loaded_script_ptr, scripts);
-
- if (nr_scripts > 0 && pattern == auto_load_info_scripts_pattern_nl)
- ui_out_text (uiout, "\n");
- make_cleanup_ui_out_table_begin_end (uiout, 2, nr_scripts,
- "AutoLoadedScriptsTable");
- ui_out_table_header (uiout, 7, ui_left, "loaded", "Loaded");
- ui_out_table_header (uiout, 70, ui_left, "script", "Script");
- ui_out_table_body (uiout);
- if (nr_scripts > 0)
- {
- int i;
- loaded_script_ptr script;
- qsort (VEC_address (loaded_script_ptr, scripts),
- VEC_length (loaded_script_ptr, scripts),
- sizeof (loaded_script_ptr), sort_scripts_by_name);
- for (i = 0; VEC_iterate (loaded_script_ptr, scripts, i, script); ++i)
- print_script (script);
- }
- do_cleanups (script_chain);
- if (nr_scripts == 0)
- {
- if (pattern && *pattern)
- ui_out_message (uiout, 0, "No auto-load scripts matching %s.\n",
- pattern);
- else
- ui_out_message (uiout, 0, "No auto-load scripts.\n");
- }
- }
- static void
- info_auto_load_gdb_scripts (char *pattern, int from_tty)
- {
- auto_load_info_scripts (pattern, from_tty, &extension_language_gdb);
- }
- static void
- info_auto_load_local_gdbinit (char *args, int from_tty)
- {
- if (auto_load_local_gdbinit_pathname == NULL)
- printf_filtered (_("Local .gdbinit file was not found.\n"));
- else if (auto_load_local_gdbinit_loaded)
- printf_filtered (_("Local .gdbinit file \"%s\" has been loaded.\n"),
- auto_load_local_gdbinit_pathname);
- else
- printf_filtered (_("Local .gdbinit file \"%s\" has not been loaded.\n"),
- auto_load_local_gdbinit_pathname);
- }
- static int
- unsupported_script_warning_print (struct auto_load_pspace_info *pspace_info)
- {
- int retval = !pspace_info->unsupported_script_warning_printed;
- pspace_info->unsupported_script_warning_printed = 1;
- return retval;
- }
- static int
- script_not_found_warning_print (struct auto_load_pspace_info *pspace_info)
- {
- int retval = !pspace_info->script_not_found_warning_printed;
- pspace_info->script_not_found_warning_printed = 1;
- return retval;
- }
- static void
- set_auto_load_cmd (char *args, int from_tty)
- {
- struct cmd_list_element *list;
- size_t length;
-
- length = args ? strlen (args) : 0;
- while (length > 0 && (args[length - 1] == ' ' || args[length - 1] == '\t'))
- length--;
- if (length == 0 || (strncmp (args, "off", length) != 0
- && strncmp (args, "0", length) != 0
- && strncmp (args, "no", length) != 0
- && strncmp (args, "disable", length) != 0))
- error (_("Valid is only global 'set auto-load no'; "
- "otherwise check the auto-load sub-commands."));
- for (list = *auto_load_set_cmdlist_get (); list != NULL; list = list->next)
- if (list->var_type == var_boolean)
- {
- gdb_assert (list->type == set_cmd);
- do_set_command (args, from_tty, list);
- }
- }
- struct cmd_list_element **
- auto_load_set_cmdlist_get (void)
- {
- static struct cmd_list_element *retval;
- if (retval == NULL)
- add_prefix_cmd ("auto-load", class_maintenance, set_auto_load_cmd, _("\
- Auto-loading specific settings.\n\
- Configure various auto-load-specific variables such as\n\
- automatic loading of Python scripts."),
- &retval, "set auto-load ",
- 1, &setlist);
- return &retval;
- }
- static void
- show_auto_load_cmd (char *args, int from_tty)
- {
- cmd_show_list (*auto_load_show_cmdlist_get (), from_tty, "");
- }
- struct cmd_list_element **
- auto_load_show_cmdlist_get (void)
- {
- static struct cmd_list_element *retval;
- if (retval == NULL)
- add_prefix_cmd ("auto-load", class_maintenance, show_auto_load_cmd, _("\
- Show auto-loading specific settings.\n\
- Show configuration of various auto-load-specific variables such as\n\
- automatic loading of Python scripts."),
- &retval, "show auto-load ",
- 0, &showlist);
- return &retval;
- }
- static void
- info_auto_load_cmd (char *args, int from_tty)
- {
- struct cmd_list_element *list;
- struct cleanup *infolist_chain;
- struct ui_out *uiout = current_uiout;
- infolist_chain = make_cleanup_ui_out_tuple_begin_end (uiout, "infolist");
- for (list = *auto_load_info_cmdlist_get (); list != NULL; list = list->next)
- {
- struct cleanup *option_chain
- = make_cleanup_ui_out_tuple_begin_end (uiout, "option");
- gdb_assert (!list->prefixlist);
- gdb_assert (list->type == not_set_cmd);
- ui_out_field_string (uiout, "name", list->name);
- ui_out_text (uiout, ": ");
- cmd_func (list, auto_load_info_scripts_pattern_nl, from_tty);
-
- do_cleanups (option_chain);
- }
-
- do_cleanups (infolist_chain);
- }
- struct cmd_list_element **
- auto_load_info_cmdlist_get (void)
- {
- static struct cmd_list_element *retval;
- if (retval == NULL)
- add_prefix_cmd ("auto-load", class_info, info_auto_load_cmd, _("\
- Print current status of auto-loaded files.\n\
- Print whether various files like Python scripts or .gdbinit files have been\n\
- found and/or loaded."),
- &retval, "info auto-load ",
- 0, &infolist);
- return &retval;
- }
- void _initialize_auto_load (void);
- void
- _initialize_auto_load (void)
- {
- struct cmd_list_element *cmd;
- char *scripts_directory_help, *gdb_name_help, *python_name_help;
- char *guile_name_help;
- const char *suffix;
- auto_load_pspace_data
- = register_program_space_data_with_cleanup (NULL,
- auto_load_pspace_data_cleanup);
- observer_attach_new_objfile (auto_load_new_objfile);
- add_setshow_boolean_cmd ("gdb-scripts", class_support,
- &auto_load_gdb_scripts, _("\
- Enable or disable auto-loading of canned sequences of commands scripts."), _("\
- Show whether auto-loading of canned sequences of commands scripts is enabled."),
- _("\
- If enabled, canned sequences of commands are loaded when the debugger reads\n\
- an executable or shared library.\n\
- This options has security implications for untrusted inferiors."),
- NULL, show_auto_load_gdb_scripts,
- auto_load_set_cmdlist_get (),
- auto_load_show_cmdlist_get ());
- add_cmd ("gdb-scripts", class_info, info_auto_load_gdb_scripts,
- _("Print the list of automatically loaded sequences of commands.\n\
- Usage: info auto-load gdb-scripts [REGEXP]"),
- auto_load_info_cmdlist_get ());
- add_setshow_boolean_cmd ("local-gdbinit", class_support,
- &auto_load_local_gdbinit, _("\
- Enable or disable auto-loading of .gdbinit script in current directory."), _("\
- Show whether auto-loading .gdbinit script in current directory is enabled."),
- _("\
- If enabled, canned sequences of commands are loaded when debugger starts\n\
- from .gdbinit file in current directory. Such files are deprecated,\n\
- use a script associated with inferior executable file instead.\n\
- This options has security implications for untrusted inferiors."),
- NULL, show_auto_load_local_gdbinit,
- auto_load_set_cmdlist_get (),
- auto_load_show_cmdlist_get ());
- add_cmd ("local-gdbinit", class_info, info_auto_load_local_gdbinit,
- _("Print whether current directory .gdbinit file has been loaded.\n\
- Usage: info auto-load local-gdbinit"),
- auto_load_info_cmdlist_get ());
- auto_load_dir = xstrdup (AUTO_LOAD_DIR);
- suffix = ext_lang_auto_load_suffix (get_ext_lang_defn (EXT_LANG_GDB));
- gdb_name_help
- = xstrprintf (_("\
- GDB scripts: OBJFILE%s\n"),
- suffix);
- python_name_help = NULL;
- #ifdef HAVE_PYTHON
- suffix = ext_lang_auto_load_suffix (get_ext_lang_defn (EXT_LANG_PYTHON));
- python_name_help
- = xstrprintf (_("\
- Python scripts: OBJFILE%s\n"),
- suffix);
- #endif
- guile_name_help = NULL;
- #ifdef HAVE_GUILE
- suffix = ext_lang_auto_load_suffix (get_ext_lang_defn (EXT_LANG_GUILE));
- guile_name_help
- = xstrprintf (_("\
- Guile scripts: OBJFILE%s\n"),
- suffix);
- #endif
- scripts_directory_help
- = xstrprintf (_("\
- Automatically loaded scripts are located in one of the directories listed\n\
- by this option.\n\
- \n\
- Script names:\n\
- %s%s%s\
- \n\
- This option is ignored for the kinds of scripts \
- having 'set auto-load ... off'.\n\
- Directories listed here need to be present also \
- in the 'set auto-load safe-path'\n\
- option."),
- gdb_name_help,
- python_name_help ? python_name_help : "",
- guile_name_help ? guile_name_help : "");
- add_setshow_optional_filename_cmd ("scripts-directory", class_support,
- &auto_load_dir, _("\
- Set the list of directories from which to load auto-loaded scripts."), _("\
- Show the list of directories from which to load auto-loaded scripts."),
- scripts_directory_help,
- set_auto_load_dir, show_auto_load_dir,
- auto_load_set_cmdlist_get (),
- auto_load_show_cmdlist_get ());
- xfree (scripts_directory_help);
- xfree (python_name_help);
- xfree (gdb_name_help);
- xfree (guile_name_help);
- auto_load_safe_path = xstrdup (AUTO_LOAD_SAFE_PATH);
- auto_load_safe_path_vec_update ();
- add_setshow_optional_filename_cmd ("safe-path", class_support,
- &auto_load_safe_path, _("\
- Set the list of files and directories that are safe for auto-loading."), _("\
- Show the list of files and directories that are safe for auto-loading."), _("\
- Various files loaded automatically for the 'set auto-load ...' options must\n\
- be located in one of the directories listed by this option. Warning will be\n\
- printed and file will not be used otherwise.\n\
- You can mix both directory and filename entries.\n\
- Setting this parameter to an empty list resets it to its default value.\n\
- Setting this parameter to '/' (without the quotes) allows any file\n\
- for the 'set auto-load ...' options. Each path entry can be also shell\n\
- wildcard pattern; '*' does not match directory separator.\n\
- This option is ignored for the kinds of files having 'set auto-load ... off'.\n\
- This options has security implications for untrusted inferiors."),
- set_auto_load_safe_path,
- show_auto_load_safe_path,
- auto_load_set_cmdlist_get (),
- auto_load_show_cmdlist_get ());
- observer_attach_gdb_datadir_changed (auto_load_gdb_datadir_changed);
- cmd = add_cmd ("add-auto-load-safe-path", class_support,
- add_auto_load_safe_path,
- _("Add entries to the list of directories from which it is safe "
- "to auto-load files.\n\
- See the commands 'set auto-load safe-path' and 'show auto-load safe-path' to\n\
- access the current full list setting."),
- &cmdlist);
- set_cmd_completer (cmd, filename_completer);
- cmd = add_cmd ("add-auto-load-scripts-directory", class_support,
- add_auto_load_dir,
- _("Add entries to the list of directories from which to load "
- "auto-loaded scripts.\n\
- See the commands 'set auto-load scripts-directory' and\n\
- 'show auto-load scripts-directory' to access the current full list setting."),
- &cmdlist);
- set_cmd_completer (cmd, filename_completer);
- add_setshow_boolean_cmd ("auto-load", class_maintenance,
- &debug_auto_load, _("\
- Set auto-load verifications debugging."), _("\
- Show auto-load verifications debugging."), _("\
- When non-zero, debugging output for files of 'set auto-load ...'\n\
- is displayed."),
- NULL, show_debug_auto_load,
- &setdebuglist, &showdebuglist);
- }