From 46fadf4bf14360be046b9b770ddf205fad96a0a7 Mon Sep 17 00:00:00 2001 From: Kacper Date: Mon, 22 Dec 2025 23:49:08 +0100 Subject: Add sys/resource.h implementation and nice(3) --- include/sys/resource.h | 42 +++++++++++++++++++++++++++---------- lib/libc/sys/resource/getpriority.c | 12 +++++++++++ lib/libc/sys/resource/getrlimit.c | 7 +++++++ lib/libc/sys/resource/getrusage.c | 7 +++++++ lib/libc/sys/resource/setpriority.c | 7 +++++++ lib/libc/sys/resource/setrlimit.c | 7 +++++++ lib/libc/unistd/nice.c | 28 +++++++++++++++++++++---- 7 files changed, 95 insertions(+), 15 deletions(-) create mode 100644 lib/libc/sys/resource/getpriority.c create mode 100644 lib/libc/sys/resource/getrlimit.c create mode 100644 lib/libc/sys/resource/getrusage.c create mode 100644 lib/libc/sys/resource/setpriority.c create mode 100644 lib/libc/sys/resource/setrlimit.c 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 + +#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 +#include + +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 +#include + +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 +#include + +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 +#include + +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 +#include + +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 // for nice +#include +#include +#include +#include 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; } -- cgit v1.2.3