diff options
Diffstat (limited to 'src/misc')
| -rw-r--r-- | src/misc/setrlimit.c | 29 | 
1 files changed, 27 insertions, 2 deletions
diff --git a/src/misc/setrlimit.c b/src/misc/setrlimit.c index 68bd9d74..bf03fe6f 100644 --- a/src/misc/setrlimit.c +++ b/src/misc/setrlimit.c @@ -1,11 +1,36 @@  #include <sys/resource.h> +#include <errno.h>  #include "syscall.h"  #include "libc.h" -int setrlimit(int resource, const struct rlimit *rlim) +int __setrlimit(int resource, const struct rlimit *rlim)  {  	long k_rlim[2] = { rlim->rlim_cur, rlim->rlim_max }; -	return syscall(SYS_setrlimit, resource, k_rlim); +	return __syscall(SYS_setrlimit, resource, k_rlim); +} + +struct ctx { +	const struct rlimit *rlim; +	int res; +	int err; +}; + +static void do_setrlimit(void *p) +{ +	struct ctx *c = p; +	if (c->err) return; +	c->err = -__setrlimit(c->res, c->rlim); +} + +int setrlimit(int resource, const struct rlimit *rlim) +{ +	struct ctx c = { .res = resource, .rlim = rlim }; +	__synccall(do_setrlimit, &c); +	if (c.err) { +		errno = c.err; +		return -1; +	} +	return 0;  }  LFS64(setrlimit);  | 
