diff options
Diffstat (limited to 'gdb/cli/cli-dump.c')
-rw-r--r-- | gdb/cli/cli-dump.c | 118 |
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); |