/* MI Command Set - environment commands.
-
- Copyright (C) 2002, 2003, 2004, 2007, 2008 Free Software Foundation, Inc.
+ Copyright (C) 2002-2016 Free Software Foundation, Inc.
Contributed by Red Hat Inc.
#include "command.h"
#include "ui-out.h"
#include "top.h"
-
-#include "gdb_string.h"
-#include "gdb_stat.h"
+#include <sys/stat.h>
static void env_mod_path (char *dirname, char **which_path);
+
extern void _initialize_mi_cmd_env (void);
static const char path_var_name[] = "PATH";
/* 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)
{
{
struct cleanup *old_cleanups;
char *run;
+
if (args != NULL)
run = xstrprintf ("%s %s", cmd, args);
else
}
}
-
/* Print working directory. */
-enum mi_cmd_result
+
+void
mi_cmd_env_pwd (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)
{
env_execute_cli_command ("pwd", NULL);
- return MI_CMD_DONE;
+ return;
}
/* Otherwise the mi level is 2 or higher. */
- getcwd (gdb_dirbuf, sizeof (gdb_dirbuf));
+ if (! getcwd (gdb_dirbuf, sizeof (gdb_dirbuf)))
+ error (_("-environment-pwd: error finding name of working directory: %s"),
+ safe_strerror (errno));
+
ui_out_field_string (uiout, "cwd", gdb_dirbuf);
-
- return MI_CMD_DONE;
}
/* Change working directory. */
-enum mi_cmd_result
+
+void
mi_cmd_env_cd (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]);
-
- return MI_CMD_DONE;
}
static void
}
/* Add one or more directories to start of executable search path. */
-enum mi_cmd_result
+
+void
mi_cmd_env_path (char *command, char **argv, int argc)
{
+ struct ui_out *uiout = current_uiout;
char *exec_path;
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 }
{
for (i = argc - 1; i >= 0; --i)
env_execute_cli_command ("path", argv[i]);
- return MI_CMD_DONE;
+ return;
}
/* 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 = get_in_environ (current_inferior ()->environment, 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);
+ set_in_environ (current_inferior ()->environment, path_var_name, exec_path);
xfree (exec_path);
- env = get_in_environ (inferior_environ, path_var_name);
+ env = get_in_environ (current_inferior ()->environment, path_var_name);
ui_out_field_string (uiout, "path", env);
-
- return MI_CMD_DONE;
}
/* Add zero or more directories to the front of the source path. */
-enum mi_cmd_result
+
+void
mi_cmd_env_dir (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 }
{
for (i = argc - 1; i >= 0; --i)
env_execute_cli_command ("dir", argv[i]);
- return MI_CMD_DONE;
+ return;
}
/* 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);
forget_cached_source_info ();
-
- return MI_CMD_DONE;
}
/* Set the inferior terminal device name. */
-enum mi_cmd_result
+
+void
mi_cmd_inferior_tty_set (char *command, char **argv, int argc)
{
set_inferior_io_terminal (argv[0]);
-
- return MI_CMD_DONE;
}
-/* Print the inferior terminal device name */
-enum mi_cmd_result
+/* Print the inferior terminal device name. */
+
+void
mi_cmd_inferior_tty_show (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);
-
- return MI_CMD_DONE;
+ ui_out_field_string (current_uiout,
+ "inferior_tty_terminal", inferior_io_terminal);
}
void
_initialize_mi_cmd_env (void)
{
+ struct gdb_environ *environment;
char *env;
- /* We want original execution path to reset to, if desired later. */
- env = get_in_environ (inferior_environ, path_var_name);
+ /* 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. Also, there's no obvious
+ place where this code can be moved such that it surely run
+ before any code possibly mangles original PATH. */
+ environment = make_environ ();
+ init_environ (environment);
+ env = get_in_environ (environment, path_var_name);
/* Can be null if path is not set. */
if (!env)
env = "";
orig_path = xstrdup (env);
+ free_environ (environment);
}