[hurd,commited 2/3] hurd: Add __readlink and readlink to dl-sysdep.c

Samuel Thibault <[email protected]>
Newsgroups gmane.os.hurd.cvs,gmane.comp.lib.glibc.alpha
Message-ID <[email protected]>
Fixes fcea66cd4685f9f3719e09cac52c73b9ece4bade
("Add system-wide tunables: Filters")
which adds calling it from rtld.
---
 sysdeps/mach/hurd/Versions             |  2 ++
 sysdeps/mach/hurd/dl-sysdep.c          | 42 ++++++++++++++++++++++++++
 sysdeps/mach/hurd/i386/ld.abilist      |  1 +
 sysdeps/mach/hurd/i386/localplt.data   |  1 +
 sysdeps/mach/hurd/x86_64/ld.abilist    |  1 +
 sysdeps/mach/hurd/x86_64/localplt.data |  1 +
 6 files changed, 48 insertions(+)

diff --git a/sysdeps/mach/hurd/Versions b/sysdeps/mach/hurd/Versions
index ce8694fc88..e340ccc727 100644
--- a/sysdeps/mach/hurd/Versions
+++ b/sysdeps/mach/hurd/Versions
@@ -37,6 +37,7 @@ ld {
     __close; __getpid;
     __mmap; __open; __read; __sbrk; __strtoul_internal;
     __write; __writev;
+    readlink;
     _exit; _hurd_intr_rpc_mach_msg;
     abort;
   }
@@ -57,6 +58,7 @@ ld {
 
     # functions that must be shared with libc
     __access; __libc_read; __libc_write; __libc_lseek64;
+    __readlink;
     __close_nocancel;
     __open_nocancel;
     __read_nocancel; __pread64_nocancel;
diff --git a/sysdeps/mach/hurd/dl-sysdep.c b/sysdeps/mach/hurd/dl-sysdep.c
index 4d32c04069..29acbe1c76 100644
--- a/sysdeps/mach/hurd/dl-sysdep.c
+++ b/sysdeps/mach/hurd/dl-sysdep.c
@@ -377,6 +377,48 @@ __read (int fd, void *buf, size_t nbytes)
 libc_hidden_weak (__read)
 weak_alias (__read, __read_nocancel)
 
+check_no_hidden(__readlink);
+__ssize_t weak_function
+__readlink (const char *path, char *buf, size_t len)
+{
+  mach_port_t port;
+  error_t err;
+  struct stat64 st;
+  char *rbuf = buf;
+  mach_msg_type_number_t nread = len;
+
+  err = open_file (path, O_READ | O_NOLINK, &port, 0);
+  if (err)
+    return __hurd_fail (err);
+
+  err = __io_stat (port, &st);
+  if (err)
+    goto out;
+
+  if (!S_ISLNK (st.st_mode))
+    {
+      err = EINVAL;
+      goto out;
+    }
+
+  err = __io_read (port, &rbuf, &nread, 0, len);
+  if (err)
+    goto out;
+
+  len = nread;
+  if (rbuf != buf)
+    {
+      memcpy (buf, rbuf, len);
+      __vm_deallocate (__mach_task_self (), (vm_address_t) rbuf, nread);
+    }
+
+out:
+  __mach_port_deallocate (__mach_task_self (), port);
+  return err ? __hurd_fail (err) : len;
+}
+libc_hidden_weak (__readlink)
+weak_alias (__readlink, readlink)
+
 check_no_hidden(__write);
 check_no_hidden(__write_nocancel);
 __ssize_t weak_function
diff --git a/sysdeps/mach/hurd/i386/ld.abilist b/sysdeps/mach/hurd/i386/ld.abilist
index ebba31f770..3e25d7cfde 100644
--- a/sysdeps/mach/hurd/i386/ld.abilist
+++ b/sysdeps/mach/hurd/i386/ld.abilist
@@ -14,6 +14,7 @@ GLIBC_2.2.6 _dl_mcount F
 GLIBC_2.2.6 _hurd_intr_rpc_mach_msg F
 GLIBC_2.2.6 _r_debug D 0x14
 GLIBC_2.2.6 abort F
+GLIBC_2.2.6 readlink F
 GLIBC_2.3 ___tls_get_addr F
 GLIBC_2.3 __tls_get_addr F
 GLIBC_2.34 __rtld_version_placeholder F
diff --git a/sysdeps/mach/hurd/i386/localplt.data b/sysdeps/mach/hurd/i386/localplt.data
index f0bddf933f..2befcd3748 100644
--- a/sysdeps/mach/hurd/i386/localplt.data
+++ b/sysdeps/mach/hurd/i386/localplt.data
@@ -32,6 +32,7 @@ ld.so: __getpid
 ld.so: __getcwd
 ld.so: _exit ?
 ld.so: abort
+ld.so: readlink
 ld.so: _hurd_intr_rpc_mach_msg
 ld.so: __errno_location
 ld.so: _dl_init_first
diff --git a/sysdeps/mach/hurd/x86_64/ld.abilist b/sysdeps/mach/hurd/x86_64/ld.abilist
index 2297a5f354..df6942d69a 100644
--- a/sysdeps/mach/hurd/x86_64/ld.abilist
+++ b/sysdeps/mach/hurd/x86_64/ld.abilist
@@ -15,3 +15,4 @@ GLIBC_2.38 _dl_mcount F
 GLIBC_2.38 _hurd_intr_rpc_mach_msg F
 GLIBC_2.38 _r_debug D 0x28
 GLIBC_2.38 abort F
+GLIBC_2.38 readlink F
diff --git a/sysdeps/mach/hurd/x86_64/localplt.data b/sysdeps/mach/hurd/x86_64/localplt.data
index 710abff73e..fda28cd983 100644
--- a/sysdeps/mach/hurd/x86_64/localplt.data
+++ b/sysdeps/mach/hurd/x86_64/localplt.data
@@ -31,6 +31,7 @@ ld.so: __getpid
 ld.so: __getcwd
 ld.so: _exit ?
 ld.so: abort
+ld.so: readlink
 ld.so: _hurd_intr_rpc_mach_msg
 ld.so: __errno_location
 ld.so: _dl_init_first
-- 
2.53.0
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.