aboutsummaryrefslogtreecommitdiff
path: root/gdb/cli/cli-dump.c
diff options
context:
space:
mode:
Diffstat (limited to 'gdb/cli/cli-dump.c')
-rw-r--r--gdb/cli/cli-dump.c118
1 files changed, 36 insertions, 82 deletions
diff --git a/gdb/cli/cli-dump.c b/gdb/cli/cli-dump.c
index d6d4aab..30897d8 100644
--- a/gdb/cli/cli-dump.c
+++ b/gdb/cli/cli-dump.c
@@ -33,16 +33,11 @@
#include "filestuff.h"
#include "common/byte-vector.h"
-static const char *
-scan_expression_with_cleanup (const char **cmd, const char *def)
+static gdb::unique_xmalloc_ptr<char>
+scan_expression (const char **cmd, const char *def)
{
if ((*cmd) == NULL || (**cmd) == '\0')
- {
- char *exp = xstrdup (def);
-
- make_cleanup (xfree, exp);
- return exp;
- }
+ return gdb::unique_xmalloc_ptr<char> (xstrdup (def));
else
{
char *exp;
@@ -50,17 +45,16 @@ scan_expression_with_cleanup (const char **cmd, const char *def)
end = (*cmd) + strcspn (*cmd, " \t");
exp = savestring ((*cmd), end - (*cmd));
- make_cleanup (xfree, exp);
(*cmd) = skip_spaces_const (end);
- return exp;
+ return gdb::unique_xmalloc_ptr<char> (exp);
}
}
-static char *
-scan_filename_with_cleanup (const char **cmd, const char *defname)
+static gdb::unique_xmalloc_ptr<char>
+scan_filename (const char **cmd, const char *defname)
{
- char *filename;
+ gdb::unique_xmalloc_ptr<char> filename;
char *fullname;
/* FIXME: Need to get the ``/a(ppend)'' flag from somewhere. */
@@ -70,8 +64,7 @@ scan_filename_with_cleanup (const char **cmd, const char *defname)
{
if (defname == NULL)
error (_("Missing filename."));
- filename = xstrdup (defname);
- make_cleanup (xfree, filename);
+ filename.reset (xstrdup (defname));
}
else
{
@@ -80,27 +73,12 @@ scan_filename_with_cleanup (const char **cmd, const char *defname)
(*cmd) = skip_spaces_const (*cmd);
end = *cmd + strcspn (*cmd, " \t");
- filename = savestring ((*cmd), end - (*cmd));
- make_cleanup (xfree, filename);
+ filename.reset (savestring ((*cmd), end - (*cmd)));
(*cmd) = skip_spaces_const (end);
}
gdb_assert (filename != NULL);
- fullname = tilde_expand (filename);
- make_cleanup (xfree, fullname);
-
- return fullname;
-}
-
-static FILE *
-fopen_with_cleanup (const char *filename, const char *mode)
-{
- FILE *file = gdb_fopen_cloexec (filename, mode);
-
- if (file == NULL)
- perror_with_name (filename);
- make_cleanup_fclose (file);
- return file;
+ return gdb::unique_xmalloc_ptr<char> (tilde_expand (filename.get ()));
}
static gdb_bfd_ref_ptr
@@ -168,11 +146,10 @@ static void
dump_binary_file (const char *filename, const char *mode,
const bfd_byte *buf, ULONGEST len)
{
- FILE *file;
int status;
- file = fopen_with_cleanup (filename, mode);
- status = fwrite (buf, len, 1, file);
+ gdb_file_up file = gdb_fopen_cloexec (filename, mode);
+ status = fwrite (buf, len, 1, file.get ());
if (status != 1)
perror_with_name (filename);
}
@@ -201,28 +178,25 @@ dump_bfd_file (const char *filename, const char *mode,
static void
dump_memory_to_file (const char *cmd, const char *mode, const char *file_format)
{
- struct cleanup *old_cleanups = make_cleanup (null_cleanup, NULL);
CORE_ADDR lo;
CORE_ADDR hi;
ULONGEST count;
- const char *filename;
- const char *lo_exp;
const char *hi_exp;
/* Open the file. */
- filename = scan_filename_with_cleanup (&cmd, NULL);
+ gdb::unique_xmalloc_ptr<char> filename = scan_filename (&cmd, NULL);
/* Find the low address. */
if (cmd == NULL || *cmd == '\0')
error (_("Missing start address."));
- lo_exp = scan_expression_with_cleanup (&cmd, NULL);
+ gdb::unique_xmalloc_ptr<char> lo_exp = scan_expression (&cmd, NULL);
/* Find the second address - rest of line. */
if (cmd == NULL || *cmd == '\0')
error (_("Missing stop address."));
hi_exp = cmd;
- lo = parse_and_eval_address (lo_exp);
+ lo = parse_and_eval_address (lo_exp.get ());
hi = parse_and_eval_address (hi_exp);
if (hi <= lo)
error (_("Invalid memory address range (start >= end)."));
@@ -235,15 +209,9 @@ dump_memory_to_file (const char *cmd, const char *mode, const char *file_format)
/* Have everything. Open/write the data. */
if (file_format == NULL || strcmp (file_format, "binary") == 0)
- {
- dump_binary_file (filename, mode, buf.data (), count);
- }
+ dump_binary_file (filename.get (), mode, buf.data (), count);
else
- {
- dump_bfd_file (filename, mode, file_format, lo, buf.data (), count);
- }
-
- do_cleanups (old_cleanups);
+ dump_bfd_file (filename.get (), mode, file_format, lo, buf.data (), count);
}
static void
@@ -255,12 +223,10 @@ dump_memory_command (char *cmd, const char *mode)
static void
dump_value_to_file (const char *cmd, const char *mode, const char *file_format)
{
- struct cleanup *old_cleanups = make_cleanup (null_cleanup, NULL);
struct value *val;
- const char *filename;
/* Open the file. */
- filename = scan_filename_with_cleanup (&cmd, NULL);
+ gdb::unique_xmalloc_ptr<char> filename = scan_filename (&cmd, NULL);
/* Find the value. */
if (cmd == NULL || *cmd == '\0')
@@ -271,10 +237,8 @@ dump_value_to_file (const char *cmd, const char *mode, const char *file_format)
/* Have everything. Open/write the data. */
if (file_format == NULL || strcmp (file_format, "binary") == 0)
- {
- dump_binary_file (filename, mode, value_contents (val),
- TYPE_LENGTH (value_type (val)));
- }
+ dump_binary_file (filename.get (), mode, value_contents (val),
+ TYPE_LENGTH (value_type (val)));
else
{
CORE_ADDR vaddr;
@@ -289,12 +253,10 @@ dump_value_to_file (const char *cmd, const char *mode, const char *file_format)
warning (_("value is not an lval: address assumed to be zero"));
}
- dump_bfd_file (filename, mode, file_format, vaddr,
+ dump_bfd_file (filename.get (), mode, file_format, vaddr,
value_contents (val),
TYPE_LENGTH (value_type (val)));
}
-
- do_cleanups (old_cleanups);
}
static void
@@ -446,8 +408,6 @@ restore_section_callback (bfd *ibfd, asection *isec, void *args)
bfd_vma sec_end = sec_start + size;
bfd_size_type sec_offset = 0;
bfd_size_type sec_load_count = size;
- struct cleanup *old_chain;
- gdb_byte *buf;
int ret;
/* Ignore non-loadable sections, eg. from elf files. */
@@ -475,9 +435,8 @@ restore_section_callback (bfd *ibfd, asection *isec, void *args)
sec_load_count -= sec_end - data->load_end;
/* Get the data. */
- buf = (gdb_byte *) xmalloc (size);
- old_chain = make_cleanup (xfree, buf);
- if (!bfd_get_section_contents (ibfd, isec, buf, 0, size))
+ gdb::byte_vector buf (size);
+ if (!bfd_get_section_contents (ibfd, isec, buf.data (), 0, size))
error (_("Failed to read bfd file %s: '%s'."), bfd_get_filename (ibfd),
bfd_errmsg (bfd_get_error ()));
@@ -499,24 +458,21 @@ restore_section_callback (bfd *ibfd, asection *isec, void *args)
/* Write the data. */
ret = target_write_memory (sec_start + sec_offset + data->load_offset,
- buf + sec_offset, sec_load_count);
+ &buf[sec_offset], sec_load_count);
if (ret != 0)
warning (_("restore: memory write failed (%s)."), safe_strerror (ret));
- do_cleanups (old_chain);
- return;
}
static void
restore_binary_file (const char *filename, struct callback_data *data)
{
- struct cleanup *cleanup = make_cleanup (null_cleanup, NULL);
- FILE *file = fopen_with_cleanup (filename, FOPEN_RB);
+ gdb_file_up file = gdb_fopen_cloexec (filename, FOPEN_RB);
long len;
/* Get the file size for reading. */
- if (fseek (file, 0, SEEK_END) == 0)
+ if (fseek (file.get (), 0, SEEK_END) == 0)
{
- len = ftell (file);
+ len = ftell (file.get ());
if (len < 0)
perror_with_name (filename);
}
@@ -541,12 +497,12 @@ restore_binary_file (const char *filename, struct callback_data *data)
(unsigned long) (data->load_start + data->load_offset + len));
/* Now set the file pos to the requested load start pos. */
- if (fseek (file, data->load_start, SEEK_SET) != 0)
+ if (fseek (file.get (), data->load_start, SEEK_SET) != 0)
perror_with_name (filename);
/* Now allocate a buffer and read the file contents. */
gdb::byte_vector buf (len);
- if (fread (buf.data (), 1, len, file) != len)
+ if (fread (buf.data (), 1, len, file.get ()) != len)
perror_with_name (filename);
/* Now write the buffer into target memory. */
@@ -554,13 +510,11 @@ restore_binary_file (const char *filename, struct callback_data *data)
buf.data (), len);
if (len != 0)
warning (_("restore: memory write failed (%s)."), safe_strerror (len));
- do_cleanups (cleanup);
}
static void
restore_command (char *args_in, int from_tty)
{
- char *filename;
struct callback_data data;
bfd *ibfd;
int binary_flag = 0;
@@ -574,7 +528,7 @@ restore_command (char *args_in, int from_tty)
data.load_end = 0;
/* Parse the input arguments. First is filename (required). */
- filename = scan_filename_with_cleanup (&args, NULL);
+ gdb::unique_xmalloc_ptr<char> filename = scan_filename (&args, NULL);
if (args != NULL && *args != '\0')
{
static const char binary_string[] = "binary";
@@ -589,13 +543,13 @@ restore_command (char *args_in, int from_tty)
/* Parse offset (optional). */
if (args != NULL && *args != '\0')
data.load_offset = binary_flag ?
- parse_and_eval_address (scan_expression_with_cleanup (&args, NULL)) :
- parse_and_eval_long (scan_expression_with_cleanup (&args, NULL));
+ parse_and_eval_address (scan_expression (&args, NULL).get ()) :
+ parse_and_eval_long (scan_expression (&args, NULL).get ());
if (args != NULL && *args != '\0')
{
/* Parse start address (optional). */
data.load_start =
- parse_and_eval_long (scan_expression_with_cleanup (&args, NULL));
+ parse_and_eval_long (scan_expression (&args, NULL).get ());
if (args != NULL && *args != '\0')
{
/* Parse end address (optional). */
@@ -608,18 +562,18 @@ restore_command (char *args_in, int from_tty)
if (info_verbose)
printf_filtered ("Restore file %s offset 0x%lx start 0x%lx end 0x%lx\n",
- filename, (unsigned long) data.load_offset,
+ filename.get (), (unsigned long) data.load_offset,
(unsigned long) data.load_start,
(unsigned long) data.load_end);
if (binary_flag)
{
- restore_binary_file (filename, &data);
+ restore_binary_file (filename.get (), &data);
}
else
{
/* Open the file for loading. */
- gdb_bfd_ref_ptr ibfd (bfd_openr_or_error (filename, NULL));
+ gdb_bfd_ref_ptr ibfd (bfd_openr_or_error (filename.get (), NULL));
/* Process the sections. */
bfd_map_over_sections (ibfd.get (), restore_section_callback, &data);