#include #include #include "syscall.h" #include "libc.h" #ifdef __broken_RLIM_INFINITY #define FIX(x) ((x) >= -1UL/2 ? RLIM_INFINITY : (x)) #else #define FIX(x) (x) #endif int getrlimit(int resource, struct rlimit *rlim) { unsigned long k_rlim[2]; int ret = syscall(SYS_prlimit64, 0, resource, 0, rlim); rlim->rlim_cur = FIX(rlim->rlim_cur); rlim->rlim_max = FIX(rlim->rlim_max); if (!ret || errno != ENOSYS) return ret; if (syscall(SYS_getrlimit, resource, k_rlim) < 0) return -1; k_rlim[0] = FIX(k_rlim[0]); k_rlim[1] = FIX(k_rlim[1]); rlim->rlim_cur = k_rlim[0] == -1UL ? RLIM_INFINITY : k_rlim[0]; rlim->rlim_max = k_rlim[1] == -1UL ? RLIM_INFINITY : k_rlim[1]; return 0; } LFS64(getrlimit);