about summary refs log tree commit diff
diff options
context:
space:
mode:
authorAdhemerval Zanella Netto <adhemerval.zanella@linaro.org>2022-10-19 19:14:05 -0300
committerAdhemerval Zanella <adhemerval.zanella@linaro.org>2022-12-07 11:27:01 -0300
commitb14e1f9fcd3ca4dd86d0637f6e32e7bf642394da (patch)
treea9e47c9e273f87978c912a15e8cdc2daef064b81
parent36d423e2032e98305799071b831691fc4c06deea (diff)
downloadglibc-b14e1f9fcd3ca4dd86d0637f6e32e7bf642394da.tar.gz
glibc-b14e1f9fcd3ca4dd86d0637f6e32e7bf642394da.tar.xz
glibc-b14e1f9fcd3ca4dd86d0637f6e32e7bf642394da.zip
linux: Consolidate dl-origin.c
Use the generic implementation as the default, since the syscall
is supported by all architectures.

Also cleanup some headers and remove the INTERNAL_SYSCALL_ERROR_P
usage (the INTERNAL_SYSCALL_CALL macro already returns an negative
value if an error occurs).
-rw-r--r--sysdeps/unix/sysv/linux/dl-origin.c14
-rw-r--r--sysdeps/unix/sysv/linux/generic/dl-origin.c79
2 files changed, 5 insertions, 88 deletions
diff --git a/sysdeps/unix/sysv/linux/dl-origin.c b/sysdeps/unix/sysv/linux/dl-origin.c
index 9a76c78648..2fd1e5f400 100644
--- a/sysdeps/unix/sysv/linux/dl-origin.c
+++ b/sysdeps/unix/sysv/linux/dl-origin.c
@@ -17,15 +17,11 @@
    <https://www.gnu.org/licenses/>.  */
 
 #include <assert.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <sys/param.h>
+#include <dl-dst.h>
+#include <fcntl.h>
 #include <ldsodefs.h>
 #include <sysdep.h>
 
-#include <dl-dst.h>
-
 /* On Linux >= 2.1 systems which have the dcache implementation we can get
    the path of the application from the /proc/self/exe symlink.  Try this
    first and fall back on the generic method if necessary.  */
@@ -37,9 +33,9 @@ _dl_get_origin (void)
   char *result;
   int len;
 
-  len = INTERNAL_SYSCALL_CALL (readlink, "/proc/self/exe", linkval,
-			       sizeof (linkval));
-  if (! INTERNAL_SYSCALL_ERROR_P (len) && len > 0 && linkval[0] != '[')
+  len = INTERNAL_SYSCALL_CALL (readlinkat, AT_FDCWD, "/proc/self/exe",
+			       linkval, sizeof (linkval));
+  if (len > 0 && linkval[0] != '[')
     {
       /* We can use this value.  */
       assert (linkval[0] == '/');
diff --git a/sysdeps/unix/sysv/linux/generic/dl-origin.c b/sysdeps/unix/sysv/linux/generic/dl-origin.c
deleted file mode 100644
index ed3ac3570c..0000000000
--- a/sysdeps/unix/sysv/linux/generic/dl-origin.c
+++ /dev/null
@@ -1,79 +0,0 @@
-/* Find path of executable.
-   Copyright (C) 1998-2022 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   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, see
-   <https://www.gnu.org/licenses/>.  */
-
-#include <assert.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <fcntl.h>
-#include <sys/param.h>
-#include <ldsodefs.h>
-#include <sysdep.h>
-
-#include <dl-dst.h>
-
-/* On Linux >= 2.1 systems which have the dcache implementation we can get
-   the path of the application from the /proc/self/exe symlink.  Try this
-   first and fall back on the generic method if necessary.  */
-
-const char *
-_dl_get_origin (void)
-{
-  char linkval[PATH_MAX];
-  char *result;
-  int len;
-
-  len = INTERNAL_SYSCALL_CALL (readlinkat, AT_FDCWD, "/proc/self/exe",
-			       linkval, sizeof (linkval));
-  if (! INTERNAL_SYSCALL_ERROR_P (len) && len > 0 && linkval[0] != '[')
-    {
-      /* We can use this value.  */
-      assert (linkval[0] == '/');
-      while (len > 1 && linkval[len - 1] != '/')
-	--len;
-      result = (char *) malloc (len + 1);
-      if (result == NULL)
-	result = (char *) -1;
-      else if (len == 1)
-	memcpy (result, "/", 2);
-      else
-	*((char *) __mempcpy (result, linkval, len - 1)) = '\0';
-    }
-  else
-    {
-      result = (char *) -1;
-      /* We use the environment variable LD_ORIGIN_PATH.  If it is set make
-	 a copy and strip out trailing slashes.  */
-      if (GLRO(dl_origin_path) != NULL)
-	{
-	  size_t len = strlen (GLRO(dl_origin_path));
-	  result = (char *) malloc (len + 1);
-	  if (result == NULL)
-	    result = (char *) -1;
-	  else
-	    {
-	      char *cp = __mempcpy (result, GLRO(dl_origin_path), len);
-	      while (cp > result + 1 && cp[-1] == '/')
-		--cp;
-	      *cp = '\0';
-	    }
-	}
-    }
-
-  return result;
-}