1#include <sys/resource.h> 2#include <errno.h> 3#include "syscall.h" 4#include "libc.h" 5 6#define FIX(x) do{ if ((x)>=SYSCALL_RLIM_INFINITY) (x)=RLIM_INFINITY; }while(0) 7 8int getrlimit(int resource, struct rlimit *rlim) 9{ 10 unsigned long k_rlim[2]; 11 int ret = syscall(SYS_prlimit64, 0, resource, 0, rlim); 12 if (!ret) { 13 FIX(rlim->rlim_cur); 14 FIX(rlim->rlim_max); 15 } 16 if (!ret || errno != ENOSYS) 17 return ret; 18 if (syscall(SYS_getrlimit, resource, k_rlim) < 0) 19 return -1; 20 rlim->rlim_cur = k_rlim[0] == -1UL ? RLIM_INFINITY : k_rlim[0]; 21 rlim->rlim_max = k_rlim[1] == -1UL ? RLIM_INFINITY : k_rlim[1]; 22 FIX(rlim->rlim_cur); 23 FIX(rlim->rlim_max); 24 return 0; 25} 26 27LFS64(getrlimit); 28