prlimit.c 675 B

123456789101112131415161718192021222324252627
  1. #define _GNU_SOURCE
  2. #include <sys/resource.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 prlimit(pid_t pid, int resource, const struct rlimit *new_limit, struct rlimit *old_limit)
  7. {
  8. struct rlimit tmp;
  9. int r;
  10. if (new_limit && SYSCALL_RLIM_INFINITY != RLIM_INFINITY) {
  11. tmp = *new_limit;
  12. FIX(tmp.rlim_cur);
  13. FIX(tmp.rlim_max);
  14. new_limit = &tmp;
  15. }
  16. r = syscall(SYS_prlimit64, pid, resource, new_limit, old_limit);
  17. if (!r && old_limit && SYSCALL_RLIM_INFINITY != RLIM_INFINITY) {
  18. FIX(old_limit->rlim_cur);
  19. FIX(old_limit->rlim_max);
  20. }
  21. return r;
  22. }
  23. #undef prlimit64
  24. LFS64(prlimit);