summaryrefslogtreecommitdiff
path: root/libc/sysdeps/linux/common/setrlimit.c
diff options
context:
space:
mode:
authorMike Frysinger <vapier@gentoo.org>2006-02-10 04:17:33 +0000
committerMike Frysinger <vapier@gentoo.org>2006-02-10 04:17:33 +0000
commitef25eef9a18839cfd26eb5810296c62e4165b631 (patch)
tree6f06384abb0034d802f5babd2e2dbc7b0af5d9c2 /libc/sysdeps/linux/common/setrlimit.c
parentc7dec4ce777a04faffdc5f36500474118f854550 (diff)
only check for rlimit stuff if the target doesnt support the newer function call, and dont bother with 64bit versions on 64bit hosts as the regular one works fine (should fix the setrlimit ltp tests)
Diffstat (limited to 'libc/sysdeps/linux/common/setrlimit.c')
-rw-r--r--libc/sysdeps/linux/common/setrlimit.c46
1 files changed, 37 insertions, 9 deletions
diff --git a/libc/sysdeps/linux/common/setrlimit.c b/libc/sysdeps/linux/common/setrlimit.c
index 7a53e043f..58cfd469f 100644
--- a/libc/sysdeps/linux/common/setrlimit.c
+++ b/libc/sysdeps/linux/common/setrlimit.c
@@ -7,36 +7,64 @@
* Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball.
*/
+#define setrlimit64 __hide_setrlimit64
#include "syscalls.h"
#include <unistd.h>
#include <sys/resource.h>
+#undef setrlimit64
libc_hidden_proto(setrlimit)
-#ifndef __NR_ugetrlimit
-/* Only wrap setrlimit if the new ugetrlimit is not present */
+/* Only wrap setrlimit if the new usetrlimit is not present and setrlimit sucks */
-#define __NR___syscall_setrlimit __NR_setrlimit
-#define RMIN(x, y) ((x) < (y) ? (x) : (y))
+#if defined(__NR_usetrlimit)
+
+/* just call usetrlimit() */
+# define __NR___syscall_usetrlimit __NR_usetrlimit
+static always_inline
+_syscall2(int, __syscall_usetrlimit, enum __rlimit_resource, resource,
+ const struct rlimit *, rlim);
+int setrlimit(__rlimit_resource_t resource, struct rlimit *rlimits)
+{
+ return (__syscall_usetrlimit(resource, rlimits));
+}
+
+#elif !defined(__UCLIBC_HANDLE_OLDER_RLIMIT__)
+
+/* We don't need to wrap setrlimit() */
+_syscall2(int, setrlimit, __rlimit_resource_t, resource,
+ const struct rlimit *, rlim);
+
+#else
+
+/* we have to handle old style setrlimit() */
+# define __NR___syscall_setrlimit __NR_setrlimit
static inline
_syscall2(int, __syscall_setrlimit, int, resource, const struct rlimit *, rlim);
+
int setrlimit(__rlimit_resource_t resource, const struct rlimit *rlimits)
{
struct rlimit rlimits_small;
+ if (rlimits == NULL) {
+ __set_errno(EINVAL);
+ return -1;
+ }
+
/* We might have to correct the limits values. Since the old values
* were signed the new values might be too large. */
+# define RMIN(x, y) ((x) < (y) ? (x) : (y))
rlimits_small.rlim_cur = RMIN((unsigned long int) rlimits->rlim_cur,
RLIM_INFINITY >> 1);
rlimits_small.rlim_max = RMIN((unsigned long int) rlimits->rlim_max,
RLIM_INFINITY >> 1);
+#undef RMIN
return (__syscall_setrlimit(resource, &rlimits_small));
}
+#endif
-#undef RMIN
+libc_hidden_def(setrlimit)
-#else /* We don't need to wrap setrlimit */
-_syscall2(int, setrlimit, __rlimit_resource_t, resource,
- const struct rlimit *, rlim);
+#if defined __UCLIBC_HAS_LFS__ && __WORDSIZE == 64
+strong_alias(setrlimit, setrlimit64)
#endif
-libc_hidden_def(setrlimit)