OLD | NEW |
1 /* MI Command Set - environment commands. | 1 /* MI Command Set - environment commands. |
2 | |
3 Copyright (C) 2002-2004, 2007-2012 Free Software Foundation, Inc. | 2 Copyright (C) 2002-2004, 2007-2012 Free Software Foundation, Inc. |
4 | 3 |
5 Contributed by Red Hat Inc. | 4 Contributed by Red Hat Inc. |
6 | 5 |
7 This file is part of GDB. | 6 This file is part of GDB. |
8 | 7 |
9 This program is free software; you can redistribute it and/or modify | 8 This program is free software; you can redistribute it and/or modify |
10 it under the terms of the GNU General Public License as published by | 9 it under the terms of the GNU General Public License as published by |
11 the Free Software Foundation; either version 3 of the License, or | 10 the Free Software Foundation; either version 3 of the License, or |
12 (at your option) any later version. | 11 (at your option) any later version. |
(...skipping 16 matching lines...) Expand all Loading... |
29 #include "target.h" | 28 #include "target.h" |
30 #include "environ.h" | 29 #include "environ.h" |
31 #include "command.h" | 30 #include "command.h" |
32 #include "ui-out.h" | 31 #include "ui-out.h" |
33 #include "top.h" | 32 #include "top.h" |
34 | 33 |
35 #include "gdb_string.h" | 34 #include "gdb_string.h" |
36 #include "gdb_stat.h" | 35 #include "gdb_stat.h" |
37 | 36 |
38 static void env_mod_path (char *dirname, char **which_path); | 37 static void env_mod_path (char *dirname, char **which_path); |
| 38 |
39 extern void _initialize_mi_cmd_env (void); | 39 extern void _initialize_mi_cmd_env (void); |
40 | 40 |
41 static const char path_var_name[] = "PATH"; | 41 static const char path_var_name[] = "PATH"; |
42 static char *orig_path = NULL; | 42 static char *orig_path = NULL; |
43 | 43 |
44 /* The following is copied from mi-main.c so for m1 and below we can | 44 /* The following is copied from mi-main.c so for m1 and below we can |
45 perform old behavior and use cli commands. If ARGS is non-null, | 45 perform old behavior and use cli commands. If ARGS is non-null, |
46 append it to the CMD. */ | 46 append it to the CMD. */ |
| 47 |
47 static void | 48 static void |
48 env_execute_cli_command (const char *cmd, const char *args) | 49 env_execute_cli_command (const char *cmd, const char *args) |
49 { | 50 { |
50 if (cmd != 0) | 51 if (cmd != 0) |
51 { | 52 { |
52 struct cleanup *old_cleanups; | 53 struct cleanup *old_cleanups; |
53 char *run; | 54 char *run; |
54 | 55 |
55 if (args != NULL) | 56 if (args != NULL) |
56 run = xstrprintf ("%s %s", cmd, args); | 57 run = xstrprintf ("%s %s", cmd, args); |
57 else | 58 else |
58 run = xstrdup (cmd); | 59 run = xstrdup (cmd); |
59 old_cleanups = make_cleanup (xfree, run); | 60 old_cleanups = make_cleanup (xfree, run); |
60 execute_command ( /*ui */ run, 0 /*from_tty */ ); | 61 execute_command ( /*ui */ run, 0 /*from_tty */ ); |
61 do_cleanups (old_cleanups); | 62 do_cleanups (old_cleanups); |
62 return; | 63 return; |
63 } | 64 } |
64 } | 65 } |
65 | 66 |
| 67 /* Print working directory. */ |
66 | 68 |
67 /* Print working directory. */ | |
68 void | 69 void |
69 mi_cmd_env_pwd (char *command, char **argv, int argc) | 70 mi_cmd_env_pwd (char *command, char **argv, int argc) |
70 { | 71 { |
71 struct ui_out *uiout = current_uiout; | 72 struct ui_out *uiout = current_uiout; |
72 | 73 |
73 if (argc > 0) | 74 if (argc > 0) |
74 error (_("-environment-pwd: No arguments required")); | 75 error (_("-environment-pwd: No arguments allowed")); |
75 | 76 |
76 if (mi_version (uiout) < 2) | 77 if (mi_version (uiout) < 2) |
77 { | 78 { |
78 env_execute_cli_command ("pwd", NULL); | 79 env_execute_cli_command ("pwd", NULL); |
79 return; | 80 return; |
80 } | 81 } |
81 | 82 |
82 /* Otherwise the mi level is 2 or higher. */ | 83 /* Otherwise the mi level is 2 or higher. */ |
83 | 84 |
84 if (! getcwd (gdb_dirbuf, sizeof (gdb_dirbuf))) | 85 if (! getcwd (gdb_dirbuf, sizeof (gdb_dirbuf))) |
85 error (_("-environment-pwd: error finding name of working directory: %s"), | 86 error (_("-environment-pwd: error finding name of working directory: %s"), |
86 safe_strerror (errno)); | 87 safe_strerror (errno)); |
87 | 88 |
88 ui_out_field_string (uiout, "cwd", gdb_dirbuf); | 89 ui_out_field_string (uiout, "cwd", gdb_dirbuf); |
89 } | 90 } |
90 | 91 |
91 /* Change working directory. */ | 92 /* Change working directory. */ |
| 93 |
92 void | 94 void |
93 mi_cmd_env_cd (char *command, char **argv, int argc) | 95 mi_cmd_env_cd (char *command, char **argv, int argc) |
94 { | 96 { |
95 if (argc == 0 || argc > 1) | 97 if (argc == 0 || argc > 1) |
96 error (_("-environment-cd: Usage DIRECTORY")); | 98 error (_("-environment-cd: Usage DIRECTORY")); |
97 | 99 |
98 env_execute_cli_command ("cd", argv[0]); | 100 env_execute_cli_command ("cd", argv[0]); |
99 } | 101 } |
100 | 102 |
101 static void | 103 static void |
102 env_mod_path (char *dirname, char **which_path) | 104 env_mod_path (char *dirname, char **which_path) |
103 { | 105 { |
104 if (dirname == 0 || dirname[0] == '\0') | 106 if (dirname == 0 || dirname[0] == '\0') |
105 return; | 107 return; |
106 | 108 |
107 /* Call add_path with last arg 0 to indicate not to parse for | 109 /* Call add_path with last arg 0 to indicate not to parse for |
108 separator characters. */ | 110 separator characters. */ |
109 add_path (dirname, which_path, 0); | 111 add_path (dirname, which_path, 0); |
110 } | 112 } |
111 | 113 |
112 /* Add one or more directories to start of executable search path. */ | 114 /* Add one or more directories to start of executable search path. */ |
| 115 |
113 void | 116 void |
114 mi_cmd_env_path (char *command, char **argv, int argc) | 117 mi_cmd_env_path (char *command, char **argv, int argc) |
115 { | 118 { |
116 struct ui_out *uiout = current_uiout; | 119 struct ui_out *uiout = current_uiout; |
117 char *exec_path; | 120 char *exec_path; |
118 char *env; | 121 char *env; |
119 int reset = 0; | 122 int reset = 0; |
120 int optind = 0; | 123 int oind = 0; |
121 int i; | 124 int i; |
122 char *optarg; | 125 char *oarg; |
123 enum opt | 126 enum opt |
124 { | 127 { |
125 RESET_OPT | 128 RESET_OPT |
126 }; | 129 }; |
127 static const struct mi_opt opts[] = | 130 static const struct mi_opt opts[] = |
128 { | 131 { |
129 {"r", RESET_OPT, 0}, | 132 {"r", RESET_OPT, 0}, |
130 { 0, 0, 0 } | 133 { 0, 0, 0 } |
131 }; | 134 }; |
132 | 135 |
133 dont_repeat (); | 136 dont_repeat (); |
134 | 137 |
135 if (mi_version (uiout) < 2) | 138 if (mi_version (uiout) < 2) |
136 { | 139 { |
137 for (i = argc - 1; i >= 0; --i) | 140 for (i = argc - 1; i >= 0; --i) |
138 env_execute_cli_command ("path", argv[i]); | 141 env_execute_cli_command ("path", argv[i]); |
139 return; | 142 return; |
140 } | 143 } |
141 | 144 |
142 /* Otherwise the mi level is 2 or higher. */ | 145 /* Otherwise the mi level is 2 or higher. */ |
143 while (1) | 146 while (1) |
144 { | 147 { |
145 int opt = mi_getopt ("-environment-path", argc, argv, opts, | 148 int opt = mi_getopt ("-environment-path", argc, argv, opts, |
146 &optind, &optarg); | 149 &oind, &oarg); |
147 | 150 |
148 if (opt < 0) | 151 if (opt < 0) |
149 break; | 152 break; |
150 switch ((enum opt) opt) | 153 switch ((enum opt) opt) |
151 { | 154 { |
152 case RESET_OPT: | 155 case RESET_OPT: |
153 reset = 1; | 156 reset = 1; |
154 break; | 157 break; |
155 } | 158 } |
156 } | 159 } |
157 argv += optind; | 160 argv += oind; |
158 argc -= optind; | 161 argc -= oind; |
159 | 162 |
160 | 163 |
161 if (reset) | 164 if (reset) |
162 { | 165 { |
163 /* Reset implies resetting to original path first. */ | 166 /* Reset implies resetting to original path first. */ |
164 exec_path = xstrdup (orig_path); | 167 exec_path = xstrdup (orig_path); |
165 } | 168 } |
166 else | 169 else |
167 { | 170 { |
168 /* Otherwise, get current path to modify. */ | 171 /* Otherwise, get current path to modify. */ |
169 env = get_in_environ (current_inferior ()->environment, path_var_name); | 172 env = get_in_environ (current_inferior ()->environment, path_var_name); |
170 | 173 |
171 /* Can be null if path is not set. */ | 174 /* Can be null if path is not set. */ |
172 if (!env) | 175 if (!env) |
173 env = ""; | 176 env = ""; |
174 exec_path = xstrdup (env); | 177 exec_path = xstrdup (env); |
175 } | 178 } |
176 | 179 |
177 for (i = argc - 1; i >= 0; --i) | 180 for (i = argc - 1; i >= 0; --i) |
178 env_mod_path (argv[i], &exec_path); | 181 env_mod_path (argv[i], &exec_path); |
179 | 182 |
180 set_in_environ (current_inferior ()->environment, path_var_name, exec_path); | 183 set_in_environ (current_inferior ()->environment, path_var_name, exec_path); |
181 xfree (exec_path); | 184 xfree (exec_path); |
182 env = get_in_environ (current_inferior ()->environment, path_var_name); | 185 env = get_in_environ (current_inferior ()->environment, path_var_name); |
183 ui_out_field_string (uiout, "path", env); | 186 ui_out_field_string (uiout, "path", env); |
184 } | 187 } |
185 | 188 |
186 /* Add zero or more directories to the front of the source path. */ | 189 /* Add zero or more directories to the front of the source path. */ |
| 190 |
187 void | 191 void |
188 mi_cmd_env_dir (char *command, char **argv, int argc) | 192 mi_cmd_env_dir (char *command, char **argv, int argc) |
189 { | 193 { |
190 struct ui_out *uiout = current_uiout; | 194 struct ui_out *uiout = current_uiout; |
191 int i; | 195 int i; |
192 int optind = 0; | 196 int oind = 0; |
193 int reset = 0; | 197 int reset = 0; |
194 char *optarg; | 198 char *oarg; |
195 enum opt | 199 enum opt |
196 { | 200 { |
197 RESET_OPT | 201 RESET_OPT |
198 }; | 202 }; |
199 static const struct mi_opt opts[] = | 203 static const struct mi_opt opts[] = |
200 { | 204 { |
201 {"r", RESET_OPT, 0}, | 205 {"r", RESET_OPT, 0}, |
202 { 0, 0, 0 } | 206 { 0, 0, 0 } |
203 }; | 207 }; |
204 | 208 |
205 dont_repeat (); | 209 dont_repeat (); |
206 | 210 |
207 if (mi_version (uiout) < 2) | 211 if (mi_version (uiout) < 2) |
208 { | 212 { |
209 for (i = argc - 1; i >= 0; --i) | 213 for (i = argc - 1; i >= 0; --i) |
210 env_execute_cli_command ("dir", argv[i]); | 214 env_execute_cli_command ("dir", argv[i]); |
211 return; | 215 return; |
212 } | 216 } |
213 | 217 |
214 /* Otherwise mi level is 2 or higher. */ | 218 /* Otherwise mi level is 2 or higher. */ |
215 while (1) | 219 while (1) |
216 { | 220 { |
217 int opt = mi_getopt ("-environment-directory", argc, argv, opts, | 221 int opt = mi_getopt ("-environment-directory", argc, argv, opts, |
218 &optind, &optarg); | 222 &oind, &oarg); |
219 | 223 |
220 if (opt < 0) | 224 if (opt < 0) |
221 break; | 225 break; |
222 switch ((enum opt) opt) | 226 switch ((enum opt) opt) |
223 { | 227 { |
224 case RESET_OPT: | 228 case RESET_OPT: |
225 reset = 1; | 229 reset = 1; |
226 break; | 230 break; |
227 } | 231 } |
228 } | 232 } |
229 argv += optind; | 233 argv += oind; |
230 argc -= optind; | 234 argc -= oind; |
231 | 235 |
232 if (reset) | 236 if (reset) |
233 { | 237 { |
234 /* Reset means setting to default path first. */ | 238 /* Reset means setting to default path first. */ |
235 xfree (source_path); | 239 xfree (source_path); |
236 init_source_path (); | 240 init_source_path (); |
237 } | 241 } |
238 | 242 |
239 for (i = argc - 1; i >= 0; --i) | 243 for (i = argc - 1; i >= 0; --i) |
240 env_mod_path (argv[i], &source_path); | 244 env_mod_path (argv[i], &source_path); |
241 | 245 |
242 ui_out_field_string (uiout, "source-path", source_path); | 246 ui_out_field_string (uiout, "source-path", source_path); |
243 forget_cached_source_info (); | 247 forget_cached_source_info (); |
244 } | 248 } |
245 | 249 |
246 /* Set the inferior terminal device name. */ | 250 /* Set the inferior terminal device name. */ |
| 251 |
247 void | 252 void |
248 mi_cmd_inferior_tty_set (char *command, char **argv, int argc) | 253 mi_cmd_inferior_tty_set (char *command, char **argv, int argc) |
249 { | 254 { |
250 set_inferior_io_terminal (argv[0]); | 255 set_inferior_io_terminal (argv[0]); |
251 } | 256 } |
252 | 257 |
253 /* Print the inferior terminal device name */ | 258 /* Print the inferior terminal device name. */ |
| 259 |
254 void | 260 void |
255 mi_cmd_inferior_tty_show (char *command, char **argv, int argc) | 261 mi_cmd_inferior_tty_show (char *command, char **argv, int argc) |
256 { | 262 { |
257 const char *inferior_io_terminal = get_inferior_io_terminal (); | 263 const char *inferior_io_terminal = get_inferior_io_terminal (); |
258 | 264 |
259 if ( !mi_valid_noargs ("-inferior-tty-show", argc, argv)) | 265 if ( !mi_valid_noargs ("-inferior-tty-show", argc, argv)) |
260 error (_("-inferior-tty-show: Usage: No args")); | 266 error (_("-inferior-tty-show: Usage: No args")); |
261 | 267 |
262 if (inferior_io_terminal) | 268 if (inferior_io_terminal) |
263 ui_out_field_string (current_uiout, | 269 ui_out_field_string (current_uiout, |
264 "inferior_tty_terminal", inferior_io_terminal); | 270 "inferior_tty_terminal", inferior_io_terminal); |
265 } | 271 } |
266 | 272 |
267 void | 273 void |
268 _initialize_mi_cmd_env (void) | 274 _initialize_mi_cmd_env (void) |
269 { | 275 { |
270 struct gdb_environ *environment; | 276 struct gdb_environ *environment; |
271 char *env; | 277 char *env; |
272 | 278 |
273 /* We want original execution path to reset to, if desired later. | 279 /* We want original execution path to reset to, if desired later. |
274 At this point, current inferior is not created, so cannot use | 280 At this point, current inferior is not created, so cannot use |
275 current_inferior ()->environment. Also, there's no obvious | 281 current_inferior ()->environment. Also, there's no obvious |
276 place where this code can be moved suchs that it surely run | 282 place where this code can be moved such that it surely run |
277 before any code possibly mangles original PATH. */ | 283 before any code possibly mangles original PATH. */ |
278 environment = make_environ (); | 284 environment = make_environ (); |
279 init_environ (environment); | 285 init_environ (environment); |
280 env = get_in_environ (environment, path_var_name); | 286 env = get_in_environ (environment, path_var_name); |
281 | 287 |
282 /* Can be null if path is not set. */ | 288 /* Can be null if path is not set. */ |
283 if (!env) | 289 if (!env) |
284 env = ""; | 290 env = ""; |
285 orig_path = xstrdup (env); | 291 orig_path = xstrdup (env); |
286 free_environ (environment); | 292 free_environ (environment); |
287 } | 293 } |
OLD | NEW |