setrlimit.c 842 B

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. #include <sys/resource.h>
  2. #include <errno.h>
  3. #include "syscall.h"
  4. #include "libc.h"
  5. #define MIN(a, b) ((a)<(b) ? (a) : (b))
  6. int __setrlimit(int resource, const struct rlimit *rlim)
  7. {
  8. unsigned long k_rlim[2];
  9. int ret = __syscall(SYS_prlimit64, 0, resource, rlim, 0);
  10. if (ret != -ENOSYS) return ret;
  11. k_rlim[0] = MIN(rlim->rlim_cur, -1UL);
  12. k_rlim[1] = MIN(rlim->rlim_max, -1UL);
  13. return __syscall(SYS_setrlimit, resource, k_rlim);
  14. }
  15. struct ctx {
  16. const struct rlimit *rlim;
  17. int res;
  18. int err;
  19. };
  20. static void do_setrlimit(void *p)
  21. {
  22. struct ctx *c = p;
  23. if (c->err) return;
  24. c->err = -__setrlimit(c->res, c->rlim);
  25. }
  26. int setrlimit(int resource, const struct rlimit *rlim)
  27. {
  28. struct ctx c = { .res = resource, .rlim = rlim };
  29. __synccall(do_setrlimit, &c);
  30. if (c.err) {
  31. errno = c.err;
  32. return -1;
  33. }
  34. return 0;
  35. }
  36. LFS64(setrlimit);