#define _GNU_SOURCE #include #include "syscall.h" #include "libc.h" #ifdef __broken_RLIM_INFINITY #define FIX(x) ((x) >= -1UL/2 ? RLIM_INFINITY : (x)) int prlimit(pid_t pid, int resource, const struct rlimit *new_limit, struct rlimit *old_limit) { struct rlimit tmp; int r; if (new_limit) { tmp.rlim_cur = FIX(new_limit->rlim_cur); tmp.rlim_max = FIX(new_limit->rlim_max); new_limit = &tmp; } r = syscall(SYS_prlimit64, pid, resource, new_limit, old_limit); if (old_limit) { old_limit->rlim_cur = FIX(old_limit->rlim_cur); old_limit->rlim_max = FIX(old_limit->rlim_max); } return r; } #else int prlimit(pid_t pid, int resource, const struct rlimit *new_limit, struct rlimit *old_limit) { return syscall(SYS_prlimit64, pid, resource, new_limit, old_limit); } #endif #undef prlimit64 LFS64(prlimit);