getrlimit.c 676 B

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