public inbox for glibc-cvs@sourceware.org
help / color / mirror / Atom feed
* [glibc] linux: Consolidate dl-origin.c
@ 2022-12-07 19:14 Adhemerval Zanella
  0 siblings, 0 replies; only message in thread
From: Adhemerval Zanella @ 2022-12-07 19:14 UTC (permalink / raw)
  To: glibc-cvs

https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=b14e1f9fcd3ca4dd86d0637f6e32e7bf642394da

commit b14e1f9fcd3ca4dd86d0637f6e32e7bf642394da
Author: Adhemerval Zanella Netto <adhemerval.zanella@linaro.org>
Date:   Wed Oct 19 19:14:05 2022 -0300

    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).

Diff:
---
 sysdeps/unix/sysv/linux/dl-origin.c         | 14 ++---
 sysdeps/unix/sysv/linux/generic/dl-origin.c | 79 -----------------------------
 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;
-}

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2022-12-07 19:14 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-12-07 19:14 [glibc] linux: Consolidate dl-origin.c Adhemerval Zanella

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).