aboutsummaryrefslogtreecommitdiff
path: root/gdb/auto-load.c
diff options
context:
space:
mode:
Diffstat (limited to 'gdb/auto-load.c')
-rw-r--r--gdb/auto-load.c128
1 files changed, 51 insertions, 77 deletions
diff --git a/gdb/auto-load.c b/gdb/auto-load.c
index 37bf942..ddd0601 100644
--- a/gdb/auto-load.c
+++ b/gdb/auto-load.c
@@ -218,7 +218,7 @@ auto_load_safe_path_vec_update (void)
{
char *dir = VEC_index (char_ptr, auto_load_safe_path_vec, ix);
char *expanded = tilde_expand (dir);
- char *real_path = gdb_realpath (expanded);
+ gdb::unique_xmalloc_ptr<char> real_path = gdb_realpath (expanded);
/* Ensure the current entry is at least tilde_expand-ed. */
VEC_replace (char_ptr, auto_load_safe_path_vec, ix, expanded);
@@ -238,16 +238,15 @@ auto_load_safe_path_vec_update (void)
xfree (dir);
/* If gdb_realpath returns a different content, append it. */
- if (strcmp (real_path, expanded) == 0)
- xfree (real_path);
- else
+ if (strcmp (real_path.get (), expanded) != 0)
{
- 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);
+ real_path.get ());
+
+ VEC_safe_push (char_ptr, auto_load_safe_path_vec,
+ real_path.release ());
}
}
}
@@ -419,12 +418,11 @@ filename_is_in_pattern (const char *filename, const char *pattern)
/* Return 1 if FILENAME belongs to one of directory components of
AUTO_LOAD_SAFE_PATH_VEC. Return 0 otherwise.
auto_load_safe_path_vec_update is never called.
- *FILENAME_REALP may be updated by gdb_realpath of FILENAME - it has to be
- freed by the caller. */
+ *FILENAME_REALP may be updated by gdb_realpath of FILENAME. */
static int
filename_is_in_auto_load_safe_path_vec (const char *filename,
- char **filename_realp)
+ gdb::unique_xmalloc_ptr<char> *filename_realp)
{
char *pattern;
int ix;
@@ -439,17 +437,17 @@ filename_is_in_auto_load_safe_path_vec (const char *filename,
if (*filename_realp == NULL)
{
*filename_realp = gdb_realpath (filename);
- if (debug_auto_load && strcmp (*filename_realp, filename) != 0)
+ if (debug_auto_load && strcmp (filename_realp->get (), filename) != 0)
fprintf_unfiltered (gdb_stdlog,
_("auto-load: Resolved "
"file \"%s\" as \"%s\".\n"),
- filename, *filename_realp);
+ filename, filename_realp->get ());
}
- if (strcmp (*filename_realp, filename) != 0)
+ if (strcmp (filename_realp->get (), 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))
+ if (filename_is_in_pattern (filename_realp->get (), pattern))
break;
}
@@ -476,8 +474,7 @@ filename_is_in_auto_load_safe_path_vec (const char *filename,
int
file_is_auto_load_safe (const char *filename, const char *debug_fmt, ...)
{
- char *filename_real = NULL;
- struct cleanup *back_to;
+ gdb::unique_xmalloc_ptr<char> filename_real;
static int advice_printed = 0;
if (debug_auto_load)
@@ -489,34 +486,24 @@ file_is_auto_load_safe (const char *filename, const char *debug_fmt, ...)
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;
- }
+ 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;
- }
+ 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);
+ filename_real.get (), 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);
+ std::string homeinit = string_printf ("%s/%s", homedir, gdbinit);
printf_filtered (_("\
To enable execution of this file add\n\
@@ -528,11 +515,11 @@ 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);
+ filename_real.get (),
+ homeinit.c_str (), homeinit.c_str ());
advice_printed = 1;
}
- do_cleanups (back_to);
return 0;
}
@@ -786,7 +773,6 @@ auto_load_objfile_script_1 (struct objfile *objfile, const char *realname,
{
char *filename, *debugfile;
int len, retval;
- FILE *input;
struct cleanup *cleanups;
const char *suffix = ext_lang_auto_load_suffix (language);
@@ -797,7 +783,7 @@ auto_load_objfile_script_1 (struct objfile *objfile, const char *realname,
cleanups = make_cleanup (xfree, filename);
- input = gdb_fopen_cloexec (filename, "r");
+ gdb_file_up input = gdb_fopen_cloexec (filename, "r");
debugfile = filename;
if (debug_auto_load)
fprintf_unfiltered (gdb_stdlog, _("auto-load: Attempted file \"%s\" %s.\n"),
@@ -845,8 +831,6 @@ auto_load_objfile_script_1 (struct objfile *objfile, const char *realname,
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\""
@@ -875,7 +859,7 @@ auto_load_objfile_script_1 (struct objfile *objfile, const char *realname,
compiled in. And the extension language is required to implement
this function. */
gdb_assert (sourcer != NULL);
- sourcer (language, objfile, input, debugfile);
+ sourcer (language, objfile, input.get (), debugfile);
}
retval = 1;
@@ -894,30 +878,28 @@ 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);
+ gdb::unique_xmalloc_ptr<char> realname
+ = gdb_realpath (objfile_name (objfile));
- if (!auto_load_objfile_script_1 (objfile, realname, language))
+ if (!auto_load_objfile_script_1 (objfile, realname.get (), language))
{
/* For Windows/DOS .exe executables, strip the .exe suffix, so that
FOO-gdb.gdb could be used for FOO.exe, and try again. */
- size_t len = strlen (realname);
+ size_t len = strlen (realname.get ());
const size_t lexe = sizeof (".exe") - 1;
- if (len > lexe && strcasecmp (realname + len - lexe, ".exe") == 0)
+ if (len > lexe && strcasecmp (realname.get () + len - lexe, ".exe") == 0)
{
len -= lexe;
- realname[len] = '\0';
+ realname.get ()[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);
+ realname.get ());
+ auto_load_objfile_script_1 (objfile, realname.get (), language);
}
}
-
- do_cleanups (cleanups);
}
/* Subroutine of source_section_scripts to simplify it.
@@ -931,10 +913,7 @@ source_script_file (struct auto_load_pspace_info *pspace_info,
const char *section_name, unsigned int offset,
const char *file)
{
- FILE *stream;
- char *full_path;
- int opened, in_hash_table;
- struct cleanup *cleanups;
+ int in_hash_table;
objfile_script_sourcer_func *sourcer;
/* Skip this script if support is not compiled in. */
@@ -956,27 +935,22 @@ source_script_file (struct auto_load_pspace_info *pspace_info,
return;
}
- opened = find_and_open_script (file, 1 /*search_path*/,
- &stream, &full_path);
+ gdb::optional<open_script> opened = find_and_open_script (file,
+ 1 /*search_path*/);
- cleanups = make_cleanup (null_cleanup, NULL);
if (opened)
{
- make_cleanup_fclose (stream);
- make_cleanup (xfree, full_path);
-
- if (!file_is_auto_load_safe (full_path,
+ if (!file_is_auto_load_safe (opened->full_path.get (),
_("auto-load: Loading %s script "
"\"%s\" from section \"%s\" of "
"objfile \"%s\".\n"),
- ext_lang_name (language), full_path,
+ ext_lang_name (language),
+ opened->full_path.get (),
section_name, objfile_name (objfile)))
- opened = 0;
+ opened.reset ();
}
else
{
- full_path = NULL;
-
/* If one script isn't found it's not uncommon for more to not be
found either. We don't want to print a message for each script,
too much noise. Instead, we print the warning once and tell the
@@ -989,14 +963,16 @@ source_script_file (struct auto_load_pspace_info *pspace_info,
section_name, offset);
}
- in_hash_table = maybe_add_script_file (pspace_info, opened, file, full_path,
+ in_hash_table = maybe_add_script_file (pspace_info, bool (opened), file,
+ (opened
+ ? opened->full_path.get ()
+ : NULL),
language);
/* If this file is not currently loaded, load it. */
if (opened && !in_hash_table)
- sourcer (language, objfile, stream, full_path);
-
- do_cleanups (cleanups);
+ sourcer (language, objfile, opened->stream.get (),
+ opened->full_path.get ());
}
/* Subroutine of source_section_scripts to simplify it.
@@ -1382,18 +1358,18 @@ auto_load_info_scripts (char *pattern, int from_tty,
if (nr_scripts > 0 && pattern == auto_load_info_scripts_pattern_nl)
uiout->text ("\n");
- /* Note: This creates a cleanup to output the table end marker. */
- make_cleanup_ui_out_table_begin_end (uiout, 2, nr_scripts,
- "AutoLoadedScriptsTable");
+ {
+ ui_out_emit_table table_emitter (uiout, 2, nr_scripts,
+ "AutoLoadedScriptsTable");
- uiout->table_header (7, ui_left, "loaded", "Loaded");
- uiout->table_header (70, ui_left, "script", "Script");
- uiout->table_body ();
+ uiout->table_header (7, ui_left, "loaded", "Loaded");
+ uiout->table_header (70, ui_left, "script", "Script");
+ uiout->table_body ();
- print_scripts (script_files);
- print_scripts (script_texts);
+ print_scripts (script_files);
+ print_scripts (script_texts);
+ }
- /* Finish up the table before checking for no matching scripts. */
do_cleanups (script_chain);
if (nr_scripts == 0)
@@ -1591,8 +1567,6 @@ found and/or loaded."),
return &retval;
}
-void _initialize_auto_load (void);
-
void
_initialize_auto_load (void)
{