From 6fa7e596c6d7740d1bf527a7113d8d7958bd865f Mon Sep 17 00:00:00 2001
From: amylaar <amylaar@138bc75d-0d04-0410-961f-82ee72b054a4>
Date: Thu, 30 Nov 2006 17:05:45 +0000
Subject: [PATCH] include: 2006-05-03  Andrew Stubbs  <andrew.stubbs@st.com>   
          J"orn Rennecke <joern.rennecke@st.com>

	PR driver/29931
	* libiberty.h (make_relative_prefix_ignore_links): Declare.

libiberty:
2006-05-03  Andrew Stubbs  <andrew.stubbs@st.com>
            J"orn Rennecke <joern.rennecke@st.com>

	PR driver/29931
	* make-relative-prefix.c (make_relative_prefix_1): New function,
	broken out of make_relative_prefix.  Make link resolution dependent
	on new parameter.
	(make_relative_prefix): Use make_relative_prefix_1.
	(make_relative_prefix_ignore_links): New function.


git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@119366 138bc75d-0d04-0410-961f-82ee72b054a4
---
 include/ChangeLog                |  6 ++++
 include/libiberty.h              |  7 +++++
 libiberty/ChangeLog              | 10 +++++++
 libiberty/make-relative-prefix.c | 49 +++++++++++++++++++++++++++-----
 4 files changed, 65 insertions(+), 7 deletions(-)

diff --git a/include/ChangeLog b/include/ChangeLog
index c7fce38fb2ba..017d3fd30b5c 100644
--- a/include/ChangeLog
+++ b/include/ChangeLog
@@ -1,3 +1,9 @@
+2006-11-30  Andrew Stubbs  <andrew.stubbs@st.com>
+            J"orn Rennecke <joern.rennecke@st.com>
+
+	PR driver/29931
+	* libiberty.h (make_relative_prefix_ignore_links): Declare.
+
 2006-11-27  Bob Wilson  <bob.wilson@acm.org>
 
 	* xtensa-config.h (XSHAL_ABI): New.
diff --git a/include/libiberty.h b/include/libiberty.h
index 1328d3eb14c0..27291c988681 100644
--- a/include/libiberty.h
+++ b/include/libiberty.h
@@ -197,6 +197,13 @@ extern long get_run_time (void);
 extern char *make_relative_prefix (const char *, const char *,
                                    const char *) ATTRIBUTE_MALLOC;
 
+/* Generate a relocated path to some installation directory without
+   attempting to follow any soft links.  Allocates
+   return value using malloc.  */
+
+extern char *make_relative_prefix_ignore_links (const char *, const char *,
+						const char *) ATTRIBUTE_MALLOC;
+
 /* Choose a temporary directory to use for scratch files.  */
 
 extern char *choose_temp_base (void) ATTRIBUTE_MALLOC;
diff --git a/libiberty/ChangeLog b/libiberty/ChangeLog
index 592954b3c47d..4b27eb05bacf 100644
--- a/libiberty/ChangeLog
+++ b/libiberty/ChangeLog
@@ -1,3 +1,13 @@
+2006-11-30  Andrew Stubbs  <andrew.stubbs@st.com>
+            J"orn Rennecke <joern.rennecke@st.com>
+
+	PR driver/29931
+	* make-relative-prefix.c (make_relative_prefix_1): New function,
+	broken out of make_relative_prefix.  Make link resolution dependent
+	on new parameter.
+	(make_relative_prefix): Use make_relative_prefix_1.
+	(make_relative_prefix_ignore_links): New function.
+
 2006-11-08  Vladimir Prus  <vladimir@codesourcery.com>
 
 	* pex-win32.c (no_suffixes): Remove.
diff --git a/libiberty/make-relative-prefix.c b/libiberty/make-relative-prefix.c
index 66ddcaa471bf..4116ec9963fb 100644
--- a/libiberty/make-relative-prefix.c
+++ b/libiberty/make-relative-prefix.c
@@ -1,6 +1,6 @@
 /* Relative (relocatable) prefix support.
    Copyright (C) 1987, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
-   1999, 2000, 2001, 2002 Free Software Foundation, Inc.
+   1999, 2000, 2001, 2002, 2006 Free Software Foundation, Inc.
 
 This file is part of libiberty.
 
@@ -217,9 +217,9 @@ free_split_directories (char **dirs)
 
    If no relative prefix can be found, return NULL.  */
 
-char *
-make_relative_prefix (const char *progname,
-                      const char *bin_prefix, const char *prefix)
+static char *
+make_relative_prefix_1 (const char *progname, const char *bin_prefix,
+			const char *prefix, const int resolve_links)
 {
   char **prog_dirs, **bin_dirs, **prefix_dirs;
   int prog_num, bin_num, prefix_num;
@@ -289,9 +289,14 @@ make_relative_prefix (const char *progname,
 	}
     }
 
-  full_progname = lrealpath (progname);
-  if (full_progname == NULL)
-    return NULL;
+  if ( resolve_links )
+    {
+      full_progname = lrealpath (progname);
+      if (full_progname == NULL)
+	return NULL;
+    }
+  else
+    full_progname = strdup(progname);
 
   prog_dirs = split_directories (full_progname, &prog_num);
   bin_dirs = split_directories (bin_prefix, &bin_num);
@@ -387,3 +392,33 @@ make_relative_prefix (const char *progname,
 
   return ret;
 }
+
+
+/* Do the full job, including symlink resolution.
+   This path will find files installed in the same place as the
+   program even when a soft link has been made to the program
+   from somwhere else. */
+
+char *
+make_relative_prefix (progname, bin_prefix, prefix)
+     const char *progname;
+     const char *bin_prefix;
+     const char *prefix;
+{
+  return make_relative_prefix_1 (progname, bin_prefix, prefix, 1);
+}
+
+/* Make the relative pathname without attempting to resolve any links.
+   '..' etc may also be left in the pathname.
+   This will find the files the user meant the program to find if the
+   installation is patched together with soft links. */
+
+char *
+make_relative_prefix_ignore_links (progname, bin_prefix, prefix)
+     const char *progname;
+     const char *bin_prefix;
+     const char *prefix;
+{
+  return make_relative_prefix_1 (progname, bin_prefix, prefix, 0);
+}
+
-- 
GitLab