summaryrefslogtreecommitdiff
path: root/sysdeps/unix/sysv/linux/setrlimit64.c
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps/unix/sysv/linux/setrlimit64.c')
-rw-r--r--sysdeps/unix/sysv/linux/setrlimit64.c53
1 files changed, 28 insertions, 25 deletions
diff --git a/sysdeps/unix/sysv/linux/setrlimit64.c b/sysdeps/unix/sysv/linux/setrlimit64.c
index 5f444d2ae7..860fccb548 100644
--- a/sysdeps/unix/sysv/linux/setrlimit64.c
+++ b/sysdeps/unix/sysv/linux/setrlimit64.c
@@ -1,4 +1,5 @@
-/* Copyright (C) 2010-2016 Free Software Foundation, Inc.
+/* Linux setrlimit64 implementation (64 bits off_t).
+ Copyright (C) 2010-2018 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
@@ -16,36 +17,38 @@
<http://www.gnu.org/licenses/>. */
#include <errno.h>
-#include <sys/resource.h>
#include <sys/types.h>
-#include <sysdep.h>
-#include <kernel-features.h>
+#include <shlib-compat.h>
+
+/* Add this redirection so the strong_alias for __RLIM_T_MATCHES_RLIM64_T
+ linking setrlimit64 to {__}setrlimit does not throw a type error. */
+#undef setrlimit
+#undef __setrlimit
+#define setrlimit setrlimit_redirect
+#define __setrlimit __setrlimit_redirect
+#include <sys/resource.h>
+#undef setrlimit
+#undef __setrlimit
/* Set the soft and hard limits for RESOURCE to *RLIMITS.
Only the super-user can increase hard limits.
Return 0 if successful, -1 if not (and sets errno). */
int
-setrlimit64 (enum __rlimit_resource resource, const struct rlimit64 *rlimits)
+__setrlimit64 (enum __rlimit_resource resource, const struct rlimit64 *rlimits)
{
-#ifdef __ASSUME_PRLIMIT64
- return INLINE_SYSCALL (prlimit64, 4, 0, resource, rlimits, NULL);
-#else
-# ifdef __NR_prlimit64
- int res = INLINE_SYSCALL (prlimit64, 4, 0, resource, rlimits, NULL);
- if (res == 0 || errno != ENOSYS)
- return res;
-# endif
- struct rlimit rlimits32;
-
- if (rlimits->rlim_cur >= RLIM_INFINITY)
- rlimits32.rlim_cur = RLIM_INFINITY;
- else
- rlimits32.rlim_cur = rlimits->rlim_cur;
- if (rlimits->rlim_max >= RLIM_INFINITY)
- rlimits32.rlim_max = RLIM_INFINITY;
- else
- rlimits32.rlim_max = rlimits->rlim_max;
+ return INLINE_SYSCALL_CALL (prlimit64, 0, resource, rlimits, NULL);
+}
+/* Alpha defines a versioned setrlimit{64}. */
+#ifndef USE_VERSIONED_RLIMIT
+weak_alias (__setrlimit64, setrlimit64)
+#endif
- return __setrlimit (resource, &rlimits32);
+#if __RLIM_T_MATCHES_RLIM64_T
+strong_alias (__setrlimit64, __setrlimit)
+# ifndef USE_VERSIONED_RLIMIT
+weak_alias (__setrlimit64, setrlimit)
+# endif
+# ifdef SHARED
+__hidden_ver1 (__setrlimit64, __GI___setrlimit, __setrlimit64);
+# endif
#endif
-}