This is the mail archive of the gdb-patches@sourceware.org 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]

Re: [PATCH] Pass --data-directory through gdb_realpath.


Doug Evans writes:
 > Hi.
 > 
 > gdb currently records the supplied --data-directory as is,
 > which if a relative path will be wrong if the user cd's
 > to a different directory.
 > 
 > 2014-04-15  Doug Evans  <dje@google.com>
 > 
 > 	* main.c (captured_main): Pass --data-directory through gdb_realpath.

This patch supercedes the previous one.
It adds similar processing for "set data-directory foo".

2014-04-15  Doug Evans  <dje@google.com>

	* main.c (set_gdb_data_directory): New function.
	(captured_main): Flag error for --data-directory "".
	Call set_gdb_data_directory.
	* main.h (set_gdb_data_directory): Declare.
	* top.c (staged_gdb_datadir): New static local.
	(set_gdb_datadir): Call set_gdb_data_directory
	(show_gdb_datadir): New function.
	(init_main): Update init of data-directory parameter.

	testsuite/
	* gdb.base/catch-syscall.exp (test_catch_syscall_fail_nodatadir):
	Update.
	(do_syscall_tests_without_xml): Update.

diff --git a/gdb/main.c b/gdb/main.c
index 59015f5..2be9bbc 100644
--- a/gdb/main.c
+++ b/gdb/main.c
@@ -106,6 +106,41 @@ get_gdb_program_name (void)
 
 static void print_gdb_help (struct ui_file *);
 
+/* Set the data-directory parameter to NEW_DATADIR.
+   If NEW_DATADIR is not a directory then a warning is printed.
+   We don't signal an error for backward compatibility.  */
+
+void
+set_gdb_data_directory (const char *new_datadir)
+{
+  struct stat st;
+
+  if (stat (new_datadir, &st) < 0)
+    {
+      int save_errno = errno;
+
+      fprintf_unfiltered (gdb_stderr, "Warning: ");
+      print_sys_errmsg (new_datadir, save_errno);
+    }
+  else if (!S_ISDIR (st.st_mode))
+    warning (_("%s is not a directory."), new_datadir);
+
+  xfree (gdb_datadir);
+  gdb_datadir = gdb_realpath (new_datadir);
+
+  /* gdb_realpath won't return an absolute path if the path doesn't exist,
+     but we still want to record an absolute path here.  If the user entered
+     "../foo" and "../foo" doesn't exist then we'll record $(pwd)/../foo which
+     isn't canonical, but that's ok.  */
+  if (!IS_ABSOLUTE_PATH (gdb_datadir))
+    {
+      char *abs_datadir = gdb_abspath (gdb_datadir);
+
+      xfree (gdb_datadir);
+      gdb_datadir = abs_datadir;
+    }
+}
+
 /* Relocate a file or directory.  PROGNAME is the name by which gdb
    was invoked (i.e., argv[0]).  INITIAL is the default value for the
    file or directory.  FLAG is true if the value is relocatable, false
@@ -641,8 +676,15 @@ captured_main (void *data)
 	    gdb_stdout = ui_file_new();
 	    break;
 	  case 'D':
-	    xfree (gdb_datadir);
-	    gdb_datadir = xstrdup (optarg);
+	    if (optarg[0] == '\0')
+	      {
+		fprintf_unfiltered (gdb_stderr,
+				    _("%s: empty path for"
+				      " `--data-directory'\n"),
+				    argv[0]);
+		exit (1);
+	      }
+	    set_gdb_data_directory (optarg);
 	    gdb_datadir_provided = 1;
 	    break;
 #ifdef GDBTK
diff --git a/gdb/main.h b/gdb/main.h
index 089e1c8..502ca30 100644
--- a/gdb/main.h
+++ b/gdb/main.h
@@ -47,4 +47,6 @@ extern char *windows_get_absolute_argv0 (const char *argv0);
    parse the argv array.  */
 extern const char *get_gdb_program_name (void);
 
+extern void set_gdb_data_directory (const char *new_data_dir);
+
 #endif
diff --git a/gdb/testsuite/gdb.base/catch-syscall.exp b/gdb/testsuite/gdb.base/catch-syscall.exp
index da838f7..a70534c 100644
--- a/gdb/testsuite/gdb.base/catch-syscall.exp
+++ b/gdb/testsuite/gdb.base/catch-syscall.exp
@@ -256,7 +256,8 @@ proc test_catch_syscall_fail_nodatadir {} {
 
 	# Make sure GDB doesn't load the syscalls xml from the system
 	# data directory.
-	gdb_test_no_output "set data-directory /the/path/to/nowhere"
+	gdb_test "set data-directory /the/path/to/nowhere" \
+	    "Warning: /the/path/to/nowhere: .*"
 
 	# Testing to see if we receive a warning when calling "catch
 	# syscall" without XML support (without datadir).
@@ -374,7 +375,8 @@ proc test_catch_syscall_with_wrong_args_noxml {} {
 proc do_syscall_tests_without_xml {} {
     # Make sure GDB doesn't load the syscalls xml from the system data
     # directory.
-    gdb_test_no_output "set data-directory /the/path/to/nowhere"
+    gdb_test "set data-directory /the/path/to/nowhere" \
+	"Warning: /the/path/to/nowhere: .*"
 
     # Let's test if we can catch syscalls without XML support.
     # We should succeed, but GDB is not supposed to print syscall names.
diff --git a/gdb/top.c b/gdb/top.c
index fa20025..186b05f 100644
--- a/gdb/top.c
+++ b/gdb/top.c
@@ -1668,14 +1668,28 @@ show_exec_done_display_p (struct ui_file *file, int from_tty,
 		    value);
 }
 
+/* New values of the "data-directory" parameter are staged here.  */
+static char *staged_gdb_datadir;
+
 /* "set" command for the gdb_datadir configuration variable.  */
 
 static void
 set_gdb_datadir (char *args, int from_tty, struct cmd_list_element *c)
 {
+  set_gdb_data_directory (staged_gdb_datadir);
   observer_notify_gdb_datadir_changed ();
 }
 
+/* "show" command for the gdb_datadir configuration variable.  */
+
+static void
+show_gdb_datadir (struct ui_file *file, int from_tty,
+		  struct cmd_list_element *c, const char *value)
+{
+  fprintf_filtered (file, _("GDB's data directory is \"%s\".\n"),
+		    gdb_datadir);
+}
+
 static void
 set_history_filename (char *args, int from_tty, struct cmd_list_element *c)
 {
@@ -1793,11 +1807,11 @@ Use \"on\" to enable the notification, and \"off\" to disable it."),
 			   &setlist, &showlist);
 
   add_setshow_filename_cmd ("data-directory", class_maintenance,
-                           &gdb_datadir, _("Set GDB's data directory."),
+                           &staged_gdb_datadir, _("Set GDB's data directory."),
                            _("Show GDB's data directory."),
                            _("\
 When set, GDB uses the specified path to search for data files."),
-                           set_gdb_datadir, NULL,
+                           set_gdb_datadir, show_gdb_datadir,
                            &setlist,
                            &showlist);
 }


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