From ef25eef9a18839cfd26eb5810296c62e4165b631 Mon Sep 17 00:00:00 2001 From: Mike Frysinger Date: Fri, 10 Feb 2006 04:17:33 +0000 Subject: 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) --- .../linux/common/bits/uClibc_arch_features.h | 3 ++ libc/sysdeps/linux/common/getrlimit.c | 33 ++++++++++++---- libc/sysdeps/linux/common/getrlimit64.c | 7 +++- libc/sysdeps/linux/common/setrlimit.c | 46 +++++++++++++++++----- libc/sysdeps/linux/common/setrlimit64.c | 5 ++- .../sysdeps/linux/i386/bits/uClibc_arch_features.h | 3 ++ .../sysdeps/linux/m68k/bits/uClibc_arch_features.h | 3 ++ .../linux/powerpc/bits/uClibc_arch_features.h | 3 ++ libc/sysdeps/linux/sh/bits/uClibc_arch_features.h | 3 ++ 9 files changed, 86 insertions(+), 20 deletions(-) (limited to 'libc/sysdeps/linux') diff --git a/libc/sysdeps/linux/common/bits/uClibc_arch_features.h b/libc/sysdeps/linux/common/bits/uClibc_arch_features.h index 6780a9dd6..7b666e175 100644 --- a/libc/sysdeps/linux/common/bits/uClibc_arch_features.h +++ b/libc/sysdeps/linux/common/bits/uClibc_arch_features.h @@ -20,6 +20,9 @@ /* does your target have a broken create_module() ? */ #undef __UCLIBC_BROKEN_CREATE_MODULE__ +/* does your target have to worry about older [gs]etrlimit() ? */ +#undef __UCLIBC_HANDLE_OLDER_RLIMIT__ + /* does your target prefix all symbols with an _ ? */ #define __UCLIBC_NO_UNDERSCORES__ diff --git a/libc/sysdeps/linux/common/getrlimit.c b/libc/sysdeps/linux/common/getrlimit.c index 70d038a76..dfaedb3e5 100644 --- a/libc/sysdeps/linux/common/getrlimit.c +++ b/libc/sysdeps/linux/common/getrlimit.c @@ -7,25 +7,37 @@ * Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball. */ +#define getrlimit64 __hide_getrlimit64 #include "syscalls.h" #include #include +#undef getrlimit64 libc_hidden_proto(getrlimit) -#ifdef __NR_ugetrlimit -# define __NR___ugetrlimit __NR_ugetrlimit -static inline -_syscall2(int, __ugetrlimit, enum __rlimit_resource, resource, - struct rlimit *, rlim); +/* Only wrap getrlimit if the new ugetrlimit is not present and getrlimit sucks */ + +#if defined(__NR_ugetrlimit) + +/* just call ugetrlimit() */ +# define __NR___syscall_ugetrlimit __NR_ugetrlimit +static always_inline +_syscall2(int, __syscall_ugetrlimit, enum __rlimit_resource, resource, + struct rlimit *, rlim); int getrlimit(__rlimit_resource_t resource, struct rlimit *rlimits) { - return (__ugetrlimit(resource, rlimits)); + return (__syscall_ugetrlimit(resource, rlimits)); } -#else /* __NR_ugetrlimit */ +#elif !defined(__UCLIBC_HANDLE_OLDER_RLIMIT__) + +/* We don't need to wrap getrlimit() */ +_syscall2(int, getrlimit, __rlimit_resource_t, resource, + struct rlimit *, rlim); -/* Only include the old getrlimit if the new one (ugetrlimit) is not around */ +#else + +/* we have to handle old style getrlimit() */ # define __NR___syscall_getrlimit __NR_getrlimit static inline _syscall2(int, __syscall_getrlimit, int, resource, struct rlimit *, rlim); @@ -48,4 +60,9 @@ int getrlimit(__rlimit_resource_t resource, struct rlimit *rlimits) return result; } #endif + libc_hidden_def(getrlimit) + +#if defined __UCLIBC_HAS_LFS__ && __WORDSIZE == 64 +strong_alias(getrlimit, getrlimit64) +#endif diff --git a/libc/sysdeps/linux/common/getrlimit64.c b/libc/sysdeps/linux/common/getrlimit64.c index 6f670c001..d134287d5 100644 --- a/libc/sysdeps/linux/common/getrlimit64.c +++ b/libc/sysdeps/linux/common/getrlimit64.c @@ -33,10 +33,13 @@ #include #include +#include -libc_hidden_proto(getrlimit) +/* the regular getrlimit will work just fine for 64bit users */ + +#if defined __UCLIBC_HAS_LFS__ && __WORDSIZE == 32 -#if defined __UCLIBC_HAS_LFS__ +libc_hidden_proto(getrlimit) /* Put the soft and hard limits for RESOURCE in *RLIMITS. Returns 0 if successful, -1 if not (and sets errno). */ 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 #include +#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) diff --git a/libc/sysdeps/linux/common/setrlimit64.c b/libc/sysdeps/linux/common/setrlimit64.c index b0d84de53..9b338f094 100644 --- a/libc/sysdeps/linux/common/setrlimit64.c +++ b/libc/sysdeps/linux/common/setrlimit64.c @@ -33,8 +33,11 @@ #include #include +#include -#if defined __UCLIBC_HAS_LFS__ +/* the regular setrlimit will work just fine for 64bit users */ + +#if defined __UCLIBC_HAS_LFS__ && __WORDSIZE == 32 libc_hidden_proto(setrlimit) diff --git a/libc/sysdeps/linux/i386/bits/uClibc_arch_features.h b/libc/sysdeps/linux/i386/bits/uClibc_arch_features.h index 44ec3efd0..718ab2a9c 100644 --- a/libc/sysdeps/linux/i386/bits/uClibc_arch_features.h +++ b/libc/sysdeps/linux/i386/bits/uClibc_arch_features.h @@ -17,6 +17,9 @@ /* does your target have a broken create_module() ? */ #define __UCLIBC_BROKEN_CREATE_MODULE__ +/* does your target have to worry about older [gs]etrlimit() ? */ +#define __UCLIBC_HANDLE_OLDER_RLIMIT__ + /* does your target prefix all symbols with an _ ? */ #define __UCLIBC_NO_UNDERSCORES__ diff --git a/libc/sysdeps/linux/m68k/bits/uClibc_arch_features.h b/libc/sysdeps/linux/m68k/bits/uClibc_arch_features.h index 4ad5fd6cf..a94803749 100644 --- a/libc/sysdeps/linux/m68k/bits/uClibc_arch_features.h +++ b/libc/sysdeps/linux/m68k/bits/uClibc_arch_features.h @@ -21,6 +21,9 @@ /* does your target have a broken create_module() ? */ #define __UCLIBC_BROKEN_CREATE_MODULE__ +/* does your target have to worry about older [gs]etrlimit() ? */ +#define __UCLIBC_HANDLE_OLDER_RLIMIT__ + /* does your target prefix all symbols with an _ ? */ #define __UCLIBC_NO_UNDERSCORES__ diff --git a/libc/sysdeps/linux/powerpc/bits/uClibc_arch_features.h b/libc/sysdeps/linux/powerpc/bits/uClibc_arch_features.h index e2505ae04..1e994ec68 100644 --- a/libc/sysdeps/linux/powerpc/bits/uClibc_arch_features.h +++ b/libc/sysdeps/linux/powerpc/bits/uClibc_arch_features.h @@ -17,6 +17,9 @@ /* does your target have a broken create_module() ? */ #undef __UCLIBC_BROKEN_CREATE_MODULE__ +/* does your target have to worry about older [gs]etrlimit() ? */ +#define __UCLIBC_HANDLE_OLDER_RLIMIT__ + /* does your target prefix all symbols with an _ ? */ #define __UCLIBC_NO_UNDERSCORES__ diff --git a/libc/sysdeps/linux/sh/bits/uClibc_arch_features.h b/libc/sysdeps/linux/sh/bits/uClibc_arch_features.h index 350457979..7b9a0efbb 100644 --- a/libc/sysdeps/linux/sh/bits/uClibc_arch_features.h +++ b/libc/sysdeps/linux/sh/bits/uClibc_arch_features.h @@ -21,6 +21,9 @@ /* does your target have a broken create_module() ? */ #undef __UCLIBC_BROKEN_CREATE_MODULE__ +/* does your target have to worry about older [gs]etrlimit() ? */ +#define __UCLIBC_HANDLE_OLDER_RLIMIT__ + /* does your target prefix all symbols with an _ ? */ #define __UCLIBC_NO_UNDERSCORES__ -- cgit v1.2.3