xref: /aosp_15_r20/external/musl/src/misc/setrlimit.c (revision c9945492fdd68bbe62686c5b452b4dc1be3f8453)
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