]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
linux: Consolidate dl-origin.c
authorAdhemerval Zanella Netto <adhemerval.zanella@linaro.org>
Wed, 19 Oct 2022 22:14:05 +0000 (19:14 -0300)
committerAdhemerval Zanella <adhemerval.zanella@linaro.org>
Wed, 7 Dec 2022 14:27:01 +0000 (11:27 -0300)
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).

sysdeps/unix/sysv/linux/dl-origin.c
sysdeps/unix/sysv/linux/generic/dl-origin.c [deleted file]

index 9a76c78648a42f5cd43e7b8903c653e97821ba4e..2fd1e5f4006746cd3daee8e6c089de6c5df28e3a 100644 (file)
    <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 (file)
index ed3ac35..0000000
+++ /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;
-}