/* MI Command Set - environment commands.
-
- Copyright (C) 2002, 2003, 2004, 2007, 2008, 2009
- Free Software Foundation, Inc.
+ Copyright (C) 2002-2020 Free Software Foundation, Inc.
Contributed by Red Hat Inc.
#include "mi-getopt.h"
#include "symtab.h"
#include "target.h"
-#include "environ.h"
+#include "gdbsupport/environ.h"
#include "command.h"
#include "ui-out.h"
#include "top.h"
-
-#include "gdb_string.h"
-#include "gdb_stat.h"
-
-static void env_mod_path (char *dirname, char **which_path);
-extern void _initialize_mi_cmd_env (void);
+#include <sys/stat.h>
+#include "source.h"
static const char path_var_name[] = "PATH";
static char *orig_path = NULL;
/* The following is copied from mi-main.c so for m1 and below we can
perform old behavior and use cli commands. If ARGS is non-null,
append it to the CMD. */
+
static void
env_execute_cli_command (const char *cmd, const char *args)
{
if (cmd != 0)
{
- struct cleanup *old_cleanups;
- char *run;
+ gdb::unique_xmalloc_ptr<char> run;
+
if (args != NULL)
- run = xstrprintf ("%s %s", cmd, args);
+ run.reset (xstrprintf ("%s %s", cmd, args));
else
- run = xstrdup (cmd);
- old_cleanups = make_cleanup (xfree, run);
- execute_command ( /*ui */ run, 0 /*from_tty */ );
- do_cleanups (old_cleanups);
- return;
+ run.reset (xstrdup (cmd));
+ execute_command ( /*ui */ run.get (), 0 /*from_tty */ );
}
}
-
/* Print working directory. */
+
void
-mi_cmd_env_pwd (char *command, char **argv, int argc)
+mi_cmd_env_pwd (const char *command, char **argv, int argc)
{
+ struct ui_out *uiout = current_uiout;
+
if (argc > 0)
- error (_("mi_cmd_env_pwd: No arguments required"));
+ error (_("-environment-pwd: No arguments allowed"));
if (mi_version (uiout) < 2)
{
/* Otherwise the mi level is 2 or higher. */
- getcwd (gdb_dirbuf, sizeof (gdb_dirbuf));
- ui_out_field_string (uiout, "cwd", gdb_dirbuf);
+ gdb::unique_xmalloc_ptr<char> cwd (getcwd (NULL, 0));
+ if (cwd == NULL)
+ error (_("-environment-pwd: error finding name of working directory: %s"),
+ safe_strerror (errno));
+
+ uiout->field_string ("cwd", cwd.get ());
}
/* Change working directory. */
+
void
-mi_cmd_env_cd (char *command, char **argv, int argc)
+mi_cmd_env_cd (const char *command, char **argv, int argc)
{
if (argc == 0 || argc > 1)
- error (_("mi_cmd_env_cd: Usage DIRECTORY"));
+ error (_("-environment-cd: Usage DIRECTORY"));
env_execute_cli_command ("cd", argv[0]);
}
static void
-env_mod_path (char *dirname, char **which_path)
+env_mod_path (const char *dirname, char **which_path)
{
if (dirname == 0 || dirname[0] == '\0')
return;
}
/* Add one or more directories to start of executable search path. */
+
void
-mi_cmd_env_path (char *command, char **argv, int argc)
+mi_cmd_env_path (const char *command, char **argv, int argc)
{
+ struct ui_out *uiout = current_uiout;
char *exec_path;
- char *env;
+ const char *env;
int reset = 0;
- int optind = 0;
+ int oind = 0;
int i;
- char *optarg;
+ char *oarg;
enum opt
{
RESET_OPT
};
- static struct mi_opt opts[] =
+ static const struct mi_opt opts[] =
{
{"r", RESET_OPT, 0},
{ 0, 0, 0 }
/* Otherwise the mi level is 2 or higher. */
while (1)
{
- int opt = mi_getopt ("mi_cmd_env_path", argc, argv, opts,
- &optind, &optarg);
+ int opt = mi_getopt ("-environment-path", argc, argv, opts,
+ &oind, &oarg);
+
if (opt < 0)
break;
switch ((enum opt) opt)
break;
}
}
- argv += optind;
- argc -= optind;
+ argv += oind;
+ argc -= oind;
if (reset)
else
{
/* Otherwise, get current path to modify. */
- env = get_in_environ (inferior_environ, path_var_name);
+ env = current_inferior ()->environment.get (path_var_name);
/* Can be null if path is not set. */
if (!env)
for (i = argc - 1; i >= 0; --i)
env_mod_path (argv[i], &exec_path);
- set_in_environ (inferior_environ, path_var_name, exec_path);
+ current_inferior ()->environment.set (path_var_name, exec_path);
xfree (exec_path);
- env = get_in_environ (inferior_environ, path_var_name);
- ui_out_field_string (uiout, "path", env);
+ env = current_inferior ()->environment.get (path_var_name);
+ uiout->field_string ("path", env);
}
/* Add zero or more directories to the front of the source path. */
+
void
-mi_cmd_env_dir (char *command, char **argv, int argc)
+mi_cmd_env_dir (const char *command, char **argv, int argc)
{
+ struct ui_out *uiout = current_uiout;
int i;
- int optind = 0;
+ int oind = 0;
int reset = 0;
- char *optarg;
+ char *oarg;
enum opt
{
RESET_OPT
};
- static struct mi_opt opts[] =
+ static const struct mi_opt opts[] =
{
{"r", RESET_OPT, 0},
{ 0, 0, 0 }
/* Otherwise mi level is 2 or higher. */
while (1)
{
- int opt = mi_getopt ("mi_cmd_env_dir", argc, argv, opts,
- &optind, &optarg);
+ int opt = mi_getopt ("-environment-directory", argc, argv, opts,
+ &oind, &oarg);
+
if (opt < 0)
break;
switch ((enum opt) opt)
break;
}
}
- argv += optind;
- argc -= optind;
+ argv += oind;
+ argc -= oind;
if (reset)
{
for (i = argc - 1; i >= 0; --i)
env_mod_path (argv[i], &source_path);
- init_last_source_visited ();
- ui_out_field_string (uiout, "source-path", source_path);
+ uiout->field_string ("source-path", source_path);
forget_cached_source_info ();
}
/* Set the inferior terminal device name. */
+
void
-mi_cmd_inferior_tty_set (char *command, char **argv, int argc)
+mi_cmd_inferior_tty_set (const char *command, char **argv, int argc)
{
set_inferior_io_terminal (argv[0]);
}
-/* Print the inferior terminal device name */
+/* Print the inferior terminal device name. */
+
void
-mi_cmd_inferior_tty_show (char *command, char **argv, int argc)
+mi_cmd_inferior_tty_show (const char *command, char **argv, int argc)
{
const char *inferior_io_terminal = get_inferior_io_terminal ();
- if ( !mi_valid_noargs ("mi_cmd_inferior_tty_show", argc, argv))
- error (_("mi_cmd_inferior_tty_show: Usage: No args"));
+ if ( !mi_valid_noargs ("-inferior-tty-show", argc, argv))
+ error (_("-inferior-tty-show: Usage: No args"));
if (inferior_io_terminal)
- ui_out_field_string (uiout, "inferior_tty_terminal", inferior_io_terminal);
+ current_uiout->field_string ("inferior_tty_terminal", inferior_io_terminal);
}
void
_initialize_mi_cmd_env (void)
{
- char *env;
-
- /* We want original execution path to reset to, if desired later. */
- env = get_in_environ (inferior_environ, path_var_name);
+ const char *env;
+
+ /* We want original execution path to reset to, if desired later.
+ At this point, current inferior is not created, so cannot use
+ current_inferior ()->environment. We use getenv here because it
+ is not necessary to create a whole new gdb_environ just for one
+ variable. */
+ env = getenv (path_var_name);
/* Can be null if path is not set. */
if (!env)