This is the mail archive of the gdb-patches@sources.redhat.com mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

mi tty commands


Hi,

Here is the patch for the MI command. The problem is, the deeper I get
into this, the more that needs to be done.

I noticed that if we simply had an MI command that was a "wrapper"
around the CLI "set/show" commands, then this MI command would not need
to exist.

If I've taken the correct approach, please look at the interface below,

(gdb)
-inferior-tty-set bob
^done
(gdb)
-inferior-tty-show
^done,inferior_tty_terminal="bob"
(gdb)

A few points,

- Should MI commands with no arguments make sure that they are called
  with none?
- I use argv[0] in -inferior-tty-set to get the parameter, is this OK?
- Is the name of the MI functions OK?

What doco needs to be done for this? And if any, what section would it
go in?

Any comments would be greatly appreciated.

Thanks,
Bob Rossi


	* fork-child.c (fork-inferior): Use accessor function for
	inferior_io_terminal
	* infcmd.c (inferior_io_terminal): make static
	(set_inferior_io_terminal): Add accessor definition
	(get_inferior_io_terminal): Add accessor definition
	(tty_command): Use accessor function
	(_initialize_infcmd): Add inferior_tty setshow variable
	* inferior.h (set_inferior_io_terminal): Add accessor declaration
	(get_inferior_io_terminal): Add accessor declaration
	* nto-procfs (procfs_create_inferior): Use accessor function
	* win32-nat.c (child_create_inferior): Use accessor function
	* mi/mi-cmd-env.c (mi_cmd_inferior_tty_set): Add MI definition
	(mi_cmd_inferior_tty_set): Add MI definition
	* mi/mi-cmds.c (mi_cmds): Add inferior-tty-set/inferior-tty-show
	* mi/mi-cmds.h (mi_cmd_inferior_tty_set): Add prototype
	(mi_cmd_inferior_tty_show): Add prototype

	* gdb.mi/mi-basics.exp (test_setshow_inferior_tty): Test MI tty
   command

Index: gdb/fork-child.c
===================================================================
RCS file: /cvs/src/src/gdb/fork-child.c,v
retrieving revision 1.25
diff -w -u -r1.25 fork-child.c
--- gdb/fork-child.c	11 Feb 2005 18:13:49 -0000	1.25
+++ gdb/fork-child.c	24 Feb 2005 20:17:39 -0000
@@ -137,6 +137,7 @@
   char **save_our_env;
   int shell = 0;
   static char **argv;
+  const char *inferior_io_terminal = get_inferior_io_terminal();
 
   /* If no exec file handed to us, get it from the exec-file command
      -- with a good, common error message if none is specified.  */
@@ -260,7 +261,7 @@
 
   /* Tell the terminal handling subsystem what tty we plan to run on;
      it will just record the information for later.  */
-  new_tty_prefork (inferior_io_terminal);
+  new_tty_prefork ((char*)inferior_io_terminal);
 
   /* It is generally good practice to flush any possible pending stdio
      output prior to doing a fork, to avoid the possibility of both
Index: gdb/infcmd.c
===================================================================
RCS file: /cvs/src/src/gdb/infcmd.c,v
retrieving revision 1.134
diff -w -u -r1.134 infcmd.c
--- gdb/infcmd.c	21 Feb 2005 03:25:56 -0000	1.134
+++ gdb/infcmd.c	24 Feb 2005 20:17:40 -0000
@@ -135,7 +135,7 @@
 
 /* File name for default use for standard in/out in the inferior.  */
 
-char *inferior_io_terminal;
+static char *inferior_io_terminal;
 
 /* Pid of our debugged inferior, or 0 if no inferior now.
    Since various parts of infrun.c test this to see whether there is a program
@@ -202,6 +202,24 @@
 
 /* Accessor routines. */
 
+void 
+set_inferior_io_terminal (char *terminal_name)
+{
+  if (inferior_io_terminal)
+    xfree ( inferior_io_terminal );
+
+  if (!terminal_name)
+    inferior_io_terminal = NULL;
+  else
+    inferior_io_terminal = savestring (terminal_name, strlen (terminal_name));
+}
+
+const char *
+get_inferior_io_terminal (void)
+{
+  return inferior_io_terminal;
+}
+
 char *
 get_inferior_args (void)
 {
@@ -375,7 +393,7 @@
   if (file == 0)
     error_no_arg (_("terminal name for running target process"));
 
-  inferior_io_terminal = savestring (file, strlen (file));
+  set_inferior_io_terminal (file);
 }
 
 /* Kill the inferior if already running.  This function is designed
@@ -1982,6 +2000,14 @@
 	       _("Set terminal for future runs of program being debugged."));
   set_cmd_completer (c, filename_completer);
 
+  /* add the filename of the terminal connected to inferior I/O */
+  add_setshow_string_noescape_cmd ( "inferior_tty", class_run,
+				    &inferior_io_terminal, _("\
+Set terminal for future runs of program being debugged."), _("\
+Show terminal for future runs of program being debugged."), _("\
+Usage: set inferior_tty /dev/pts/1"), NULL, NULL, &setlist, &showlist);
+  set_cmd_completer (c, filename_completer);
+
   add_setshow_optional_filename_cmd ("args", class_run,
 				     &inferior_args, _("\
 Set argument list to give program being debugged when it is started."), _("\
Index: gdb/inferior.h
===================================================================
RCS file: /cvs/src/src/gdb/inferior.h,v
retrieving revision 1.69
diff -w -u -r1.69 inferior.h
--- gdb/inferior.h	12 Sep 2004 15:05:05 -0000	1.69
+++ gdb/inferior.h	24 Feb 2005 20:17:40 -0000
@@ -102,9 +102,10 @@
 
 extern void clear_sigio_trap (void);
 
-/* File name for default use for standard in/out in the inferior.  */
+/* Set/Get name for default use for standard in/out in the inferior.  */
 
-extern char *inferior_io_terminal;
+extern void set_inferior_io_terminal (char *terminal_name);
+extern const char *get_inferior_io_terminal (void);
 
 /* Collected pid, tid, etc. of the debugged inferior.  When there's
    no inferior, PIDGET (inferior_ptid) will be 0. */
Index: gdb/nto-procfs.c
===================================================================
RCS file: /cvs/src/src/gdb/nto-procfs.c,v
retrieving revision 1.13
diff -w -u -r1.13 nto-procfs.c
--- gdb/nto-procfs.c	15 Feb 2005 15:49:14 -0000	1.13
+++ gdb/nto-procfs.c	24 Feb 2005 20:17:41 -0000
@@ -984,6 +984,7 @@
   char *in = "", *out = "", *err = "";
   int fd, fds[3];
   sigset_t set;
+  const char *inferior_io_terminal = get_inferior_io_terminal();
 
   argv = xmalloc (((strlen (allargs) + 1) / (unsigned) 2 + 2) *
 		  sizeof (*argv));
@@ -1010,11 +1011,11 @@
   if (inferior_io_terminal)
     {
       if (!in[0])
-	in = inferior_io_terminal;
+	in = (char*)inferior_io_terminal;
       if (!out[0])
-	out = inferior_io_terminal;
+	out = (char*)inferior_io_terminal;
       if (!err[0])
-	err = inferior_io_terminal;
+	err = (char*)inferior_io_terminal;
     }
 
   if (in[0])
Index: gdb/win32-nat.c
===================================================================
RCS file: /cvs/src/src/gdb/win32-nat.c,v
retrieving revision 1.108
diff -w -u -r1.108 win32-nat.c
--- gdb/win32-nat.c	18 Feb 2005 15:25:31 -0000	1.108
+++ gdb/win32-nat.c	24 Feb 2005 20:17:42 -0000
@@ -1725,6 +1725,7 @@
   const char *sh;
   int tty;
   int ostdin, ostdout, ostderr;
+  const char *inferior_io_terminal = get_inferior_io_terminal();
 
   if (!exec_file)
     error (_("No executable specified, use `target exec'."));
Index: gdb/mi/mi-cmd-env.c
===================================================================
RCS file: /cvs/src/src/gdb/mi/mi-cmd-env.c,v
retrieving revision 1.8
diff -w -u -r1.8 mi-cmd-env.c
--- gdb/mi/mi-cmd-env.c	11 Feb 2005 04:06:11 -0000	1.8
+++ gdb/mi/mi-cmd-env.c	24 Feb 2005 20:17:43 -0000
@@ -244,6 +244,30 @@
   return MI_CMD_DONE;
 }
 
+/* Set the inferior terminal device name */
+enum mi_cmd_result
+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
+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 (inferior_io_terminal)
+    ui_out_field_string (uiout, "inferior_tty_terminal", inferior_io_terminal);
+
+  return MI_CMD_DONE;
+}
+
 void 
 _initialize_mi_cmd_env (void)
 {
Index: gdb/mi/mi-cmds.c
===================================================================
RCS file: /cvs/src/src/gdb/mi/mi-cmds.c,v
retrieving revision 1.16
diff -w -u -r1.16 mi-cmds.c
--- gdb/mi/mi-cmds.c	11 Feb 2005 18:13:55 -0000	1.16
+++ gdb/mi/mi-cmds.c	24 Feb 2005 20:17:43 -0000
@@ -153,6 +153,8 @@
   { "trace-save", { NULL, 0 }, NULL, NULL },
   { "trace-start", { NULL, 0 }, NULL, NULL },
   { "trace-stop", { NULL, 0 }, NULL, NULL },
+  { "inferior-tty-set", { NULL, 0 }, NULL, mi_cmd_inferior_tty_set },
+  { "inferior-tty-show", { NULL, 0 }, NULL, mi_cmd_inferior_tty_show },
   { "var-assign", { NULL, 0 }, 0, mi_cmd_var_assign},
   { "var-create", { NULL, 0 }, 0, mi_cmd_var_create},
   { "var-delete", { NULL, 0 }, 0, mi_cmd_var_delete},
Index: gdb/mi/mi-cmds.h
===================================================================
RCS file: /cvs/src/src/gdb/mi/mi-cmds.h,v
retrieving revision 1.15
diff -w -u -r1.15 mi-cmds.h
--- gdb/mi/mi-cmds.h	13 Jan 2005 22:08:27 -0000	1.15
+++ gdb/mi/mi-cmds.h	24 Feb 2005 20:17:43 -0000
@@ -96,6 +96,8 @@
 extern mi_cmd_args_ftype mi_cmd_target_select;
 extern mi_cmd_argv_ftype mi_cmd_thread_list_ids;
 extern mi_cmd_argv_ftype mi_cmd_thread_select;
+extern mi_cmd_argv_ftype mi_cmd_inferior_tty_set;
+extern mi_cmd_argv_ftype mi_cmd_inferior_tty_show;
 extern mi_cmd_argv_ftype mi_cmd_var_assign;
 extern mi_cmd_argv_ftype mi_cmd_var_create;
 extern mi_cmd_argv_ftype mi_cmd_var_delete;
Index: gdb/testsuite/gdb.mi/mi-basics.exp
===================================================================
RCS file: /cvs/src/src/gdb/testsuite/gdb.mi/mi-basics.exp,v
retrieving revision 1.9
diff -w -u -r1.9 mi-basics.exp
--- gdb/testsuite/gdb.mi/mi-basics.exp	9 Aug 2004 16:32:44 -0000	1.9
+++ gdb/testsuite/gdb.mi/mi-basics.exp	24 Feb 2005 20:17:51 -0000
@@ -236,12 +236,41 @@
 
 } 
 
+proc test_setshow_inferior_tty {} {
+    global mi_gdb_prompt
+
+    # test that the commands,
+    #   -inferior-tty-set
+    #   -inferior-tth-show
+
+	mi_gdb_test "301-inferior-tty-show" \
+	            "301\\\^done" \
+				"initial tty is empty"
+
+	mi_gdb_test "302-inferior-tty-set /dev/pts/1" \
+	            "302\\\^done" \
+				"set tty to /dev/pts/1"
+
+	mi_gdb_test "303-inferior-tty-show" \
+	            "303\\\^done,inferior_tty_terminal=\"/dev/pts/1\"" \
+				"tty was set correctly"
+
+	mi_gdb_test "304-inferior-tty-set" \
+	            "304\\\^done" \
+				"set tty to the empty string"
+
+	mi_gdb_test "305-inferior-tty-show" \
+	            "305\\\^done" \
+				"final tty is empty"
+}
+
 if [test_mi_interpreter_selection] {
   test_exec_and_symbol_mi_operatons
   test_breakpoints_deletion
   test_dir_specification
   test_cwd_specification
   test_path_specification
+  test_setshow_inferior_tty
 }
 
 mi_gdb_exit


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]