1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
| | #define _GNU_SOURCE
#include <sys/resource.h>
#include "syscall.h"
#include "libc.h"
#ifdef __broken_RLIM_INFINITY
#define FIX(x) ((x) >= -1UL/2 ? RLIM_INFINITY : (x))
int prlimit(pid_t pid, int resource, const struct rlimit *new_limit, struct rlimit *old_limit)
{
struct rlimit tmp;
int r;
if (new_limit) {
tmp.rlim_cur = FIX(new_limit->rlim_cur);
tmp.rlim_max = FIX(new_limit->rlim_max);
new_limit = &tmp;
}
r = syscall(SYS_prlimit64, pid, resource, new_limit, old_limit);
if (old_limit) {
old_limit->rlim_cur = FIX(old_limit->rlim_cur);
old_limit->rlim_max = FIX(old_limit->rlim_max);
}
return r;
}
#else
int prlimit(pid_t pid, int resource, const struct rlimit *new_limit, struct rlimit *old_limit)
{
return syscall(SYS_prlimit64, pid, resource, new_limit, old_limit);
}
#endif
#undef prlimit64
LFS64(prlimit);
|