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