about summary refs log tree commit diff
path: root/sysdeps/unix/sysv/linux/chown.c
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps/unix/sysv/linux/chown.c')
-rw-r--r--sysdeps/unix/sysv/linux/chown.c35
1 files changed, 29 insertions, 6 deletions
diff --git a/sysdeps/unix/sysv/linux/chown.c b/sysdeps/unix/sysv/linux/chown.c
index f380d93736..578dfc7e3f 100644
--- a/sysdeps/unix/sysv/linux/chown.c
+++ b/sysdeps/unix/sysv/linux/chown.c
@@ -38,7 +38,7 @@ static int __libc_old_chown;
 
 
 int
-__chown (const char *file, uid_t owner, gid_t group)
+__real_chown (const char *file, uid_t owner, gid_t group)
 {
   int result;
 
@@ -56,13 +56,36 @@ __chown (const char *file, uid_t owner, gid_t group)
 
   return __lchown (file, owner, group);
 }
-#else
-/* compiling under older kernels */
+#endif
+
+
+#if !defined __NR_lchown || \
+    (defined HAVE_ELF && defined PIC && defined DO_VERSIONING)
+/* compiling under older kernels or for compatibiity */
 int
-__chown (const char *file, uid_t owner, gid_t group)
+__chown_is_lchown (const char *file, uid_t owner, gid_t group)
 {
-  return __syscall_chown (file, owner, group);
+  return __lchown (file, owner, group);
 }
 #endif
 
-weak_alias (__chown, chown)
+#if defined HAVE_ELF && defined PIC && defined DO_VERSIONING
+symbol_version (__chown_is_lchown, __chown, GLIBC_2.0)
+symbol_version (__chown_is_lchown, chown, GLIBC_2.0)
+
+# ifdef __NR_lchown
+default_symbol_version (__real_chown, __chown, GLIBC_2.1)
+default_symbol_version (__real_chown, chown, GLIBC_2.1)
+# else
+default_symbol_version (__chown_is_lchown, __chown, GLIBC_2.1)
+default_symbol_version (__chown_is_lchown, chown, GLIBC_2.1)
+# endif
+#else
+# ifdef __NR_lchown
+strong_alias (__real_chown, __chown)
+weak_alias (__real_chown, chown)
+# else
+strong_alias (__chown_is_lchown, __chown)
+weak_alias (__chown_is_lchown, chown)
+# endif
+#endif