1*c9945492SAndroid Build Coastguard Worker #include <sys/resource.h>
2*c9945492SAndroid Build Coastguard Worker #include <errno.h>
3*c9945492SAndroid Build Coastguard Worker #include "syscall.h"
4*c9945492SAndroid Build Coastguard Worker #include "libc.h"
5*c9945492SAndroid Build Coastguard Worker
6*c9945492SAndroid Build Coastguard Worker #define MIN(a, b) ((a)<(b) ? (a) : (b))
7*c9945492SAndroid Build Coastguard Worker #define FIX(x) do{ if ((x)>=SYSCALL_RLIM_INFINITY) (x)=RLIM_INFINITY; }while(0)
8*c9945492SAndroid Build Coastguard Worker
9*c9945492SAndroid Build Coastguard Worker struct ctx {
10*c9945492SAndroid Build Coastguard Worker unsigned long lim[2];
11*c9945492SAndroid Build Coastguard Worker int res;
12*c9945492SAndroid Build Coastguard Worker int err;
13*c9945492SAndroid Build Coastguard Worker };
14*c9945492SAndroid Build Coastguard Worker
15*c9945492SAndroid Build Coastguard Worker #ifdef SYS_setrlimit
do_setrlimit(void * p)16*c9945492SAndroid Build Coastguard Worker static void do_setrlimit(void *p)
17*c9945492SAndroid Build Coastguard Worker {
18*c9945492SAndroid Build Coastguard Worker struct ctx *c = p;
19*c9945492SAndroid Build Coastguard Worker if (c->err>0) return;
20*c9945492SAndroid Build Coastguard Worker c->err = -__syscall(SYS_setrlimit, c->res, c->lim);
21*c9945492SAndroid Build Coastguard Worker }
22*c9945492SAndroid Build Coastguard Worker #endif
23*c9945492SAndroid Build Coastguard Worker
setrlimit(int resource,const struct rlimit * rlim)24*c9945492SAndroid Build Coastguard Worker int setrlimit(int resource, const struct rlimit *rlim)
25*c9945492SAndroid Build Coastguard Worker {
26*c9945492SAndroid Build Coastguard Worker struct rlimit tmp;
27*c9945492SAndroid Build Coastguard Worker if (SYSCALL_RLIM_INFINITY != RLIM_INFINITY) {
28*c9945492SAndroid Build Coastguard Worker tmp = *rlim;
29*c9945492SAndroid Build Coastguard Worker FIX(tmp.rlim_cur);
30*c9945492SAndroid Build Coastguard Worker FIX(tmp.rlim_max);
31*c9945492SAndroid Build Coastguard Worker rlim = &tmp;
32*c9945492SAndroid Build Coastguard Worker }
33*c9945492SAndroid Build Coastguard Worker int ret = __syscall(SYS_prlimit64, 0, resource, rlim, 0);
34*c9945492SAndroid Build Coastguard Worker #ifdef SYS_setrlimit
35*c9945492SAndroid Build Coastguard Worker if (ret != -ENOSYS) return __syscall_ret(ret);
36*c9945492SAndroid Build Coastguard Worker
37*c9945492SAndroid Build Coastguard Worker struct ctx c = {
38*c9945492SAndroid Build Coastguard Worker .lim[0] = MIN(rlim->rlim_cur, MIN(-1UL, SYSCALL_RLIM_INFINITY)),
39*c9945492SAndroid Build Coastguard Worker .lim[1] = MIN(rlim->rlim_max, MIN(-1UL, SYSCALL_RLIM_INFINITY)),
40*c9945492SAndroid Build Coastguard Worker .res = resource, .err = -1
41*c9945492SAndroid Build Coastguard Worker };
42*c9945492SAndroid Build Coastguard Worker __synccall(do_setrlimit, &c);
43*c9945492SAndroid Build Coastguard Worker if (c.err) {
44*c9945492SAndroid Build Coastguard Worker if (c.err>0) errno = c.err;
45*c9945492SAndroid Build Coastguard Worker return -1;
46*c9945492SAndroid Build Coastguard Worker }
47*c9945492SAndroid Build Coastguard Worker return 0;
48*c9945492SAndroid Build Coastguard Worker #else
49*c9945492SAndroid Build Coastguard Worker return __syscall_ret(ret);
50*c9945492SAndroid Build Coastguard Worker #endif
51*c9945492SAndroid Build Coastguard Worker }
52