Index: fusl/src/linux/prlimit.c |
diff --git a/fusl/src/linux/prlimit.c b/fusl/src/linux/prlimit.c |
new file mode 100644 |
index 0000000000000000000000000000000000000000..0fe28e10664e9047b1ca1a75bdab78c3e0407723 |
--- /dev/null |
+++ b/fusl/src/linux/prlimit.c |
@@ -0,0 +1,27 @@ |
+#define _GNU_SOURCE |
+#include <sys/resource.h> |
+#include "syscall.h" |
+#include "libc.h" |
+ |
+#define FIX(x) do{ if ((x)>=SYSCALL_RLIM_INFINITY) (x)=RLIM_INFINITY; }while(0) |
+ |
+int prlimit(pid_t pid, int resource, const struct rlimit *new_limit, struct rlimit *old_limit) |
+{ |
+ struct rlimit tmp; |
+ int r; |
+ if (new_limit && SYSCALL_RLIM_INFINITY != RLIM_INFINITY) { |
+ tmp = *new_limit; |
+ FIX(tmp.rlim_cur); |
+ FIX(tmp.rlim_max); |
+ new_limit = &tmp; |
+ } |
+ r = syscall(SYS_prlimit64, pid, resource, new_limit, old_limit); |
+ if (!r && old_limit && SYSCALL_RLIM_INFINITY != RLIM_INFINITY) { |
+ FIX(old_limit->rlim_cur); |
+ FIX(old_limit->rlim_max); |
+ } |
+ return r; |
+} |
+ |
+#undef prlimit64 |
+LFS64(prlimit); |