summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKacper <kacper@mail.openlinux.dev>2025-12-22 23:49:08 +0100
committerKacper <kacper@mail.openlinux.dev>2025-12-22 23:49:08 +0100
commit46fadf4bf14360be046b9b770ddf205fad96a0a7 (patch)
tree6e88bf6050e4f0cab877760e80f64bd708dd7400
parent0f30d227497418c6d3bef7d52244407e30454504 (diff)
Add sys/resource.h implementation and nice(3)
-rw-r--r--include/sys/resource.h42
-rw-r--r--lib/libc/sys/resource/getpriority.c12
-rw-r--r--lib/libc/sys/resource/getrlimit.c7
-rw-r--r--lib/libc/sys/resource/getrusage.c7
-rw-r--r--lib/libc/sys/resource/setpriority.c7
-rw-r--r--lib/libc/sys/resource/setrlimit.c7
-rw-r--r--lib/libc/unistd/nice.c28
7 files changed, 95 insertions, 15 deletions
diff --git a/include/sys/resource.h b/include/sys/resource.h
index 086d8cd8..eb596700 100644
--- a/include/sys/resource.h
+++ b/include/sys/resource.h
@@ -2,19 +2,39 @@
#define __SYS_RESOURCE_H
#include <time.h>
+
+#define RUSAGE_SELF 0
+#define RUSAGE_CHILDREN (-1)
+#define RUSAGE_BOTH (-2)
+#define RUSAGE_THREAD 1
+
+#define PRIO_MIN (-20)
+#define PRIO_MAX 20
+
+#define PRIO_PROCESS 0
+#define PRIO_PGRP 1
+#define PRIO_USER 2
+
+#define RLIMIT_CPU 0
+#define RLIMIT_FSIZE 1
+#define RLIMIT_DATA 2
+#define RLIMIT_STACK 3
+#define RLIMIT_CORE 4
+#define RLIMIT_RSS 5
+#define RLIMIT_NPROC 6
+#define RLIMIT_NOFILE 7
+#define RLIMIT_MEMLOCK 8
+#define RLIMIT_AS 9
+
typedef __INT64_TYPE__ time_t;
typedef __INT64_TYPE__ suseconds_t;
+typedef __UINT64_TYPE__ rlim_t;
struct __timeval {
time_t tv_sec;
suseconds_t tv_usec;
};
-#define RUSAGE_SELF 0
-#define RUSAGE_CHILDREN (-1)
-#define RUSAGE_BOTH (-2)
-#define RUSAGE_THREAD 1
-
struct rusage {
struct __timeval ru_utime;
struct __timeval ru_stime;
@@ -34,14 +54,14 @@ struct rusage {
long ru_nivcsw;
};
-#define PRIO_MIN (-20)
-#define PRIO_MAX 20
-
-#define PRIO_PROCESS 0
-#define PRIO_PGRP 1
-#define PRIO_USER 2
+struct rlimit {
+ rlim_t rlim_cur;
+ rlim_t rlim_max;
+};
int getpriority(int, int);
+int getrlimit(int, struct rlimit *);
+int setrlimit(int, const struct rlimit *);
int setpriority(int, int, int);
int getrusage(int, struct rusage *);
diff --git a/lib/libc/sys/resource/getpriority.c b/lib/libc/sys/resource/getpriority.c
new file mode 100644
index 00000000..3df9eb30
--- /dev/null
+++ b/lib/libc/sys/resource/getpriority.c
@@ -0,0 +1,12 @@
+#include <sys/resource.h>
+#include <syscall.h>
+
+int getpriority(int which, int who)
+{
+ int r = syscall(getpriority, which, who);
+
+ if (r < 0)
+ return r;
+
+ return 20 - r;
+}
diff --git a/lib/libc/sys/resource/getrlimit.c b/lib/libc/sys/resource/getrlimit.c
new file mode 100644
index 00000000..7b7c8269
--- /dev/null
+++ b/lib/libc/sys/resource/getrlimit.c
@@ -0,0 +1,7 @@
+#include <sys/resource.h>
+#include <syscall.h>
+
+int getrlimit(int resource, struct rlimit *rlp)
+{
+ return syscall(getrlimit, resource, rlp);
+}
diff --git a/lib/libc/sys/resource/getrusage.c b/lib/libc/sys/resource/getrusage.c
new file mode 100644
index 00000000..a91ded16
--- /dev/null
+++ b/lib/libc/sys/resource/getrusage.c
@@ -0,0 +1,7 @@
+#include <sys/resource.h>
+#include <syscall.h>
+
+int getrusage(int who, struct rusage *r_usage)
+{
+ return syscall(getrusage, who, r_usage);
+}
diff --git a/lib/libc/sys/resource/setpriority.c b/lib/libc/sys/resource/setpriority.c
new file mode 100644
index 00000000..96bebbf2
--- /dev/null
+++ b/lib/libc/sys/resource/setpriority.c
@@ -0,0 +1,7 @@
+#include <sys/resource.h>
+#include <syscall.h>
+
+int setpriority(int which, int who, int value)
+{
+ return syscall(setpriority, which, who, value);
+}
diff --git a/lib/libc/sys/resource/setrlimit.c b/lib/libc/sys/resource/setrlimit.c
new file mode 100644
index 00000000..39148bc3
--- /dev/null
+++ b/lib/libc/sys/resource/setrlimit.c
@@ -0,0 +1,7 @@
+#include <sys/resource.h>
+#include <syscall.h>
+
+int setrlimit(int resource, const struct rlimit *rlp)
+{
+ return syscall(setrlimit, resource, rlp);
+}
diff --git a/lib/libc/unistd/nice.c b/lib/libc/unistd/nice.c
index 78dccbb0..29ac8487 100644
--- a/lib/libc/unistd/nice.c
+++ b/lib/libc/unistd/nice.c
@@ -1,8 +1,28 @@
-#include <unistd.h> // for nice
+#include <errno.h>
+#include <limits.h>
+#include <sys/resource.h>
+#include <unistd.h>
int nice(int incr)
{
- (void)incr;
- // TODO: needs getpriority and setpriority from sys/resouce.h
- return 0;
+ int priority = incr;
+
+ if (incr > NZERO * -2 && incr < NZERO * 2) {
+ priority += getpriority(PRIO_PROCESS, 0);
+ }
+
+ if (priority > NZERO - 1)
+ priority = NZERO - 1;
+
+ if (priority < -NZERO)
+ priority = -NZERO;
+
+ if (setpriority(PRIO_PROCESS, 0, priority)) {
+ if (errno == EACCES)
+ errno = EPERM;
+
+ return -1;
+ }
+
+ return priority;
}