/* Dump-to-file commands, for GDB, the GNU debugger.
- Copyright (c) 2002, 2005, 2007, 2008, 2009, 2010, 2011
- Free Software Foundation, Inc.
+ Copyright (C) 2002-2015 Free Software Foundation, Inc.
Contributed by Red Hat.
along with this program. If not, see <http://www.gnu.org/licenses/>. */
#include "defs.h"
-#include "gdb_string.h"
#include "cli/cli-decode.h"
#include "cli/cli-cmds.h"
#include "value.h"
#include "completer.h"
-#include "cli/cli-dump.h"
-#include "gdb_assert.h"
#include <ctype.h>
#include "target.h"
#include "readline/readline.h"
#include "gdbcore.h"
#include "cli/cli-utils.h"
+#include "gdb_bfd.h"
+#include "filestuff.h"
-#define XMALLOC(TYPE) ((TYPE*) xmalloc (sizeof (TYPE)))
-
-char *
-scan_expression_with_cleanup (char **cmd, const char *def)
+static const char *
+scan_expression_with_cleanup (const char **cmd, const char *def)
{
if ((*cmd) == NULL || (**cmd) == '\0')
{
else
{
char *exp;
- char *end;
+ const char *end;
end = (*cmd) + strcspn (*cmd, " \t");
exp = savestring ((*cmd), end - (*cmd));
make_cleanup (xfree, exp);
- (*cmd) = skip_spaces (end);
+ (*cmd) = skip_spaces_const (end);
return exp;
}
}
-char *
-scan_filename_with_cleanup (char **cmd, const char *defname)
+static char *
+scan_filename_with_cleanup (const char **cmd, const char *defname)
{
char *filename;
char *fullname;
else
{
/* FIXME: should parse a possibly quoted string. */
- char *end;
+ const char *end;
- (*cmd) = skip_spaces (*cmd);
+ (*cmd) = skip_spaces_const (*cmd);
end = *cmd + strcspn (*cmd, " \t");
filename = savestring ((*cmd), end - (*cmd));
make_cleanup (xfree, filename);
- (*cmd) = skip_spaces (end);
+ (*cmd) = skip_spaces_const (end);
}
gdb_assert (filename != NULL);
return fullname;
}
-FILE *
+static FILE *
fopen_with_cleanup (const char *filename, const char *mode)
{
- FILE *file = fopen (filename, mode);
+ FILE *file = gdb_fopen_cloexec (filename, mode);
if (file == NULL)
perror_with_name (filename);
{
bfd *ibfd;
- ibfd = bfd_openr (filename, target);
+ ibfd = gdb_bfd_openr (filename, target);
if (ibfd == NULL)
error (_("Failed to open %s: %s."), filename,
bfd_errmsg (bfd_get_error ()));
- make_cleanup_bfd_close (ibfd);
+ make_cleanup_bfd_unref (ibfd);
if (!bfd_check_format (ibfd, bfd_object))
error (_("'%s' is not a recognized file format."), filename);
if (*mode == 'w') /* Write: create new file */
{
- obfd = bfd_openw (filename, target);
+ obfd = gdb_bfd_openw (filename, target);
if (obfd == NULL)
error (_("Failed to open %s: %s."), filename,
bfd_errmsg (bfd_get_error ()));
- make_cleanup_bfd_close (obfd);
+ make_cleanup_bfd_unref (obfd);
if (!bfd_set_format (obfd, bfd_object))
error (_("bfd_openw_with_cleanup: %s."), bfd_errmsg (bfd_get_error ()));
}
return obfd;
}
-struct cmd_list_element *dump_cmdlist;
-struct cmd_list_element *append_cmdlist;
-struct cmd_list_element *srec_cmdlist;
-struct cmd_list_element *ihex_cmdlist;
-struct cmd_list_element *tekhex_cmdlist;
-struct cmd_list_element *binary_dump_cmdlist;
-struct cmd_list_element *binary_append_cmdlist;
+static struct cmd_list_element *dump_cmdlist;
+static struct cmd_list_element *append_cmdlist;
+static struct cmd_list_element *srec_cmdlist;
+static struct cmd_list_element *ihex_cmdlist;
+static struct cmd_list_element *tekhex_cmdlist;
+static struct cmd_list_element *binary_dump_cmdlist;
+static struct cmd_list_element *binary_append_cmdlist;
static void
dump_command (char *cmd, int from_tty)
{
printf_unfiltered (_("\"dump\" must be followed by a subcommand.\n\n"));
- help_list (dump_cmdlist, "dump ", -1, gdb_stdout);
+ help_list (dump_cmdlist, "dump ", all_commands, gdb_stdout);
}
static void
append_command (char *cmd, int from_tty)
{
printf_unfiltered (_("\"append\" must be followed by a subcommand.\n\n"));
- help_list (dump_cmdlist, "append ", -1, gdb_stdout);
+ help_list (dump_cmdlist, "append ", all_commands, gdb_stdout);
}
static void
dump_binary_file (const char *filename, const char *mode,
- const bfd_byte *buf, int len)
+ const bfd_byte *buf, ULONGEST len)
{
FILE *file;
int status;
static void
dump_bfd_file (const char *filename, const char *mode,
const char *target, CORE_ADDR vaddr,
- const bfd_byte *buf, int len)
+ const bfd_byte *buf, ULONGEST len)
{
bfd *obfd;
asection *osection;
}
static void
-dump_memory_to_file (char *cmd, char *mode, char *file_format)
+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;
- char *filename;
+ const char *filename;
void *buf;
- char *lo_exp;
- char *hi_exp;
+ const char *lo_exp;
+ const char *hi_exp;
/* Open the file. */
filename = scan_filename_with_cleanup (&cmd, NULL);
}
static void
-dump_value_to_file (char *cmd, char *mode, char *file_format)
+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;
- char *filename;
+ const char *filename;
/* Open the file. */
filename = scan_filename_with_cleanup (&cmd, NULL);
d->func (args, d->mode);
}
-void
+static void
add_dump_command (char *name, void (*func) (char *args, char *mode),
char *descr)
c = add_cmd (name, all_commands, NULL, descr, &dump_cmdlist);
c->completer = filename_completer;
- d = XMALLOC (struct dump_context);
+ d = XNEW (struct dump_context);
d->func = func;
d->mode = FOPEN_WB;
set_cmd_context (c, d);
c = add_cmd (name, all_commands, NULL, descr, &append_cmdlist);
c->completer = filename_completer;
- d = XMALLOC (struct dump_context);
+ d = XNEW (struct dump_context);
d->func = func;
d->mode = FOPEN_AB;
set_cmd_context (c, d);
if (data->load_offset != 0 || data->load_start != 0 || data->load_end != 0)
printf_filtered (" into memory (%s to %s)\n",
- paddress (target_gdbarch,
+ paddress (target_gdbarch (),
(unsigned long) sec_start
+ sec_offset + data->load_offset),
- paddress (target_gdbarch,
+ paddress (target_gdbarch (),
(unsigned long) sec_start + sec_offset
+ data->load_offset + sec_load_count));
else
}
static void
-restore_binary_file (char *filename, struct callback_data *data)
+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_byte *buf;
long len;
len = target_write_memory (data->load_start + data->load_offset, buf, len);
if (len != 0)
warning (_("restore: memory write failed (%s)."), safe_strerror (len));
- return;
+ do_cleanups (cleanup);
}
static void
-restore_command (char *args, int from_tty)
+restore_command (char *args_in, int from_tty)
{
char *filename;
struct callback_data data;
bfd *ibfd;
int binary_flag = 0;
+ const char *args = args_in;
if (!target_has_execution)
noprocess ();
{
binary_flag = 1;
args += strlen (binary_string);
- args = skip_spaces (args);
+ args = skip_spaces_const (args);
}
/* Parse offset (optional). */
if (args != NULL && *args != '\0')
srec_dump_command (char *cmd, int from_tty)
{
printf_unfiltered ("\"dump srec\" must be followed by a subcommand.\n");
- help_list (srec_cmdlist, "dump srec ", -1, gdb_stdout);
+ help_list (srec_cmdlist, "dump srec ", all_commands, gdb_stdout);
}
static void
ihex_dump_command (char *cmd, int from_tty)
{
printf_unfiltered ("\"dump ihex\" must be followed by a subcommand.\n");
- help_list (ihex_cmdlist, "dump ihex ", -1, gdb_stdout);
+ help_list (ihex_cmdlist, "dump ihex ", all_commands, gdb_stdout);
}
static void
tekhex_dump_command (char *cmd, int from_tty)
{
printf_unfiltered ("\"dump tekhex\" must be followed by a subcommand.\n");
- help_list (tekhex_cmdlist, "dump tekhex ", -1, gdb_stdout);
+ help_list (tekhex_cmdlist, "dump tekhex ", all_commands, gdb_stdout);
}
static void
binary_dump_command (char *cmd, int from_tty)
{
printf_unfiltered ("\"dump binary\" must be followed by a subcommand.\n");
- help_list (binary_dump_cmdlist, "dump binary ", -1, gdb_stdout);
+ help_list (binary_dump_cmdlist, "dump binary ", all_commands, gdb_stdout);
}
static void
binary_append_command (char *cmd, int from_tty)
{
printf_unfiltered ("\"append binary\" must be followed by a subcommand.\n");
- help_list (binary_append_cmdlist, "append binary ", -1, gdb_stdout);
+ help_list (binary_append_cmdlist, "append binary ", all_commands,
+ gdb_stdout);
}
extern initialize_file_ftype _initialize_cli_dump; /* -Wmissing-prototypes */