prlimit.c 623 B

1234567891011121314151617181920212223
  1. #define _GNU_SOURCE
  2. #include <sys/resource.h>
  3. #include "syscall.h"
  4. #define FIX(x) do{ if ((x)>=SYSCALL_RLIM_INFINITY) (x)=RLIM_INFINITY; }while(0)
  5. int prlimit(pid_t pid, int resource, const struct rlimit *new_limit, struct rlimit *old_limit)
  6. {
  7. struct rlimit tmp;
  8. int r;
  9. if (new_limit && SYSCALL_RLIM_INFINITY != RLIM_INFINITY) {
  10. tmp = *new_limit;
  11. FIX(tmp.rlim_cur);
  12. FIX(tmp.rlim_max);
  13. new_limit = &tmp;
  14. }
  15. r = syscall(SYS_prlimit64, pid, resource, new_limit, old_limit);
  16. if (!r && old_limit && SYSCALL_RLIM_INFINITY != RLIM_INFINITY) {
  17. FIX(old_limit->rlim_cur);
  18. FIX(old_limit->rlim_max);
  19. }
  20. return r;
  21. }