X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=src%2Fmisc%2Fsetrlimit.c;h=8a1b8cc63d3428cda6654b23742dadbe7f740678;hb=3f65494a4cb2544eb16af3fa64a161bd8142f487;hp=bf03fe6f4e9e32c2bd45a32d35de598539ea766e;hpb=544ee752cd38febfa3aa3798b4dfb6fabd13846b;p=musl diff --git a/src/misc/setrlimit.c b/src/misc/setrlimit.c index bf03fe6f..8a1b8cc6 100644 --- a/src/misc/setrlimit.c +++ b/src/misc/setrlimit.c @@ -3,9 +3,23 @@ #include "syscall.h" #include "libc.h" +#define MIN(a, b) ((a)<(b) ? (a) : (b)) +#define FIX(x) do{ if ((x)>=SYSCALL_RLIM_INFINITY) (x)=RLIM_INFINITY; }while(0) + int __setrlimit(int resource, const struct rlimit *rlim) { - long k_rlim[2] = { rlim->rlim_cur, rlim->rlim_max }; + unsigned long k_rlim[2]; + struct rlimit tmp; + if (SYSCALL_RLIM_INFINITY != RLIM_INFINITY) { + tmp = *rlim; + FIX(tmp.rlim_cur); + FIX(tmp.rlim_max); + rlim = &tmp; + } + int ret = __syscall(SYS_prlimit64, 0, resource, rlim, 0); + if (ret != -ENOSYS) return ret; + k_rlim[0] = MIN(rlim->rlim_cur, MIN(-1UL, SYSCALL_RLIM_INFINITY)); + k_rlim[1] = MIN(rlim->rlim_max, MIN(-1UL, SYSCALL_RLIM_INFINITY)); return __syscall(SYS_setrlimit, resource, k_rlim); }