bug-hurd
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[HURD PATCH 5/7] Hurd dl-origin.c: Use _hurd_init_filename if available


From: Jeremie Koenig
Subject: [HURD PATCH 5/7] Hurd dl-origin.c: Use _hurd_init_filename if available
Date: Wed, 17 Aug 2011 21:35:30 +0200

        * sysdeps/mach/hurd/dl-origin.c (_dl_get_origin): Use
        _hurd_init_filename if LD_ORIGIN_PATH is not defined.
---
 sysdeps/mach/hurd/dl-origin.c |   33 +++++++++++++++++++++++++++++----
 1 files changed, 29 insertions(+), 4 deletions(-)

diff --git a/sysdeps/mach/hurd/dl-origin.c b/sysdeps/mach/hurd/dl-origin.c
index 8761937..bd5bc64 100644
--- a/sysdeps/mach/hurd/dl-origin.c
+++ b/sysdeps/mach/hurd/dl-origin.c
@@ -13,39 +13,64 @@
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
    Lesser General Public License for more details.
 
    You should have received a copy of the GNU Lesser General Public
    License along with the GNU C Library; if not, write to the Free
    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
    02111-1307 USA.  */
 
 #include <stdlib.h>
 #include <string.h>
 #include <sys/param.h>
 #include <ldsodefs.h>
+#include <hurd.h>
 
 #include <dl-dst.h>
 
 
 const char *
 _dl_get_origin (void)
 {
   char *result = (char *) -1;
-  /* We use the environment variable LD_ORIGIN_PATH.  If it is set make
-     a copy and strip out trailing slashes.  */
+  const char *src = NULL;
+  size_t len;
+
+  /* We use either the file name retreived from the exec server at
+     startup, or the environment variable LD_ORIGIN_PATH (which takes
+     precedence).  */
   if (GLRO(dl_origin_path) != NULL)
     {
-      size_t len = strlen (GLRO(dl_origin_path));
+      src = GLRO(dl_origin_path);
+      len = strlen (src);
+    }
+  else if (_hurd_init_filename[0] != '\0')
+    {
+      char *end = strrchr(_hurd_init_filename, '/');
+      if (end != NULL)
+       {
+         src = _hurd_init_filename;
+         len = end - src;
+       }
+      else
+       {
+         src = ".";
+         len = 1;
+       }
+    }
+
+  /* If one of them is set, make a copy and strip out trailing slashes.  */
+  if (src != NULL)
+    {
       result = (char *) malloc (len + 1);
       if (result == NULL)
        result = (char *) -1;
       else
        {
-         char *cp = __mempcpy (result, GLRO(dl_origin_path), len);
+         char *cp = __mempcpy (result, src, len);
          while (cp > result + 1 && cp[-1] == '/')
            --cp;
          *cp = '\0';
        }
     }
 
   return result;
 }
-- 
1.7.5.4




reply via email to

[Prev in Thread] Current Thread [Next in Thread]