From 2fd08dcf431ca7214f23d48831e9ba7689099365 Mon Sep 17 00:00:00 2001 From: Vasilito Date: Sun, 19 Apr 2026 09:26:57 +0100 Subject: [PATCH] Fix cookbook redoxer stage root selection --- local/patches/relibc/P3-fd-event-tests.patch | 94 ++++++++++++++++++++ src/bin/cookbook_redoxer.rs | 10 ++- 2 files changed, 102 insertions(+), 2 deletions(-) create mode 100644 local/patches/relibc/P3-fd-event-tests.patch diff --git a/local/patches/relibc/P3-fd-event-tests.patch b/local/patches/relibc/P3-fd-event-tests.patch new file mode 100644 index 00000000..0361631a --- /dev/null +++ b/local/patches/relibc/P3-fd-event-tests.patch @@ -0,0 +1,94 @@ +diff --git a/tests/sys_eventfd/eventfd.c b/tests/sys_eventfd/eventfd.c +new file mode 100644 +--- /dev/null ++++ b/tests/sys_eventfd/eventfd.c +@@ -0,0 +1,27 @@ ++#include ++#include ++#include ++#include ++#include ++ ++int main(void) { ++ int fd = eventfd(2, 0); ++ assert(fd >= 0); ++ eventfd_t value = 0; ++ assert(eventfd_read(fd, &value) == 0); ++ assert(value == 2); ++ assert(eventfd_write(fd, 5) == 0); ++ assert(eventfd_read(fd, &value) == 0); ++ assert(value == 5); ++ assert(close(fd) == 0); ++ ++ int semfd = eventfd(2, EFD_SEMAPHORE); ++ assert(semfd >= 0); ++ assert(eventfd_read(semfd, &value) == 0); ++ assert(value == 1); ++ assert(eventfd_read(semfd, &value) == 0); ++ assert(value == 1); ++ assert(close(semfd) == 0); ++ puts("eventfd ok"); ++ return 0; ++} +diff --git a/tests/sys_signalfd/signalfd.c b/tests/sys_signalfd/signalfd.c +new file mode 100644 +--- /dev/null ++++ b/tests/sys_signalfd/signalfd.c +@@ -0,0 +1,22 @@ ++#include ++#include ++#include ++#include ++#include ++#include ++ ++int main(void) { ++ sigset_t mask; ++ assert(sigemptyset(&mask) == 0); ++ assert(sigaddset(&mask, SIGUSR1) == 0); ++ assert(sigprocmask(SIG_BLOCK, &mask, NULL) == 0); ++ int fd = signalfd(-1, &mask, sizeof(mask)); ++ assert(fd >= 0); ++ assert(kill(getpid(), SIGUSR1) == 0); ++ struct signalfd_siginfo info; ++ assert(read(fd, &info, sizeof(info)) == (ssize_t)sizeof(info)); ++ assert(info.ssi_signo == SIGUSR1); ++ assert(info.ssi_pid == (uint32_t)getpid()); ++ assert(close(fd) == 0); ++ puts("signalfd ok"); ++ return 0; ++} +diff --git a/tests/sys_timerfd/timerfd.c b/tests/sys_timerfd/timerfd.c +new file mode 100644 +--- /dev/null ++++ b/tests/sys_timerfd/timerfd.c +@@ -0,0 +1,27 @@ ++#include ++#include ++#include ++#include ++#include ++#include ++ ++int main(void) { ++ int fd = timerfd_create(CLOCK_REALTIME, 0); ++ assert(fd >= 0); ++ struct itimerspec spec; ++ memset(&spec, 0, sizeof(spec)); ++ spec.it_value.tv_nsec = 1000000; ++ assert(timerfd_settime(fd, 0, &spec, NULL) == 0); ++ ++ uint64_t expirations = 0; ++ assert(read(fd, &expirations, sizeof(expirations)) == (ssize_t)sizeof(expirations)); ++ assert(expirations >= 1); ++ ++ struct itimerspec cur; ++ assert(timerfd_gettime(fd, &cur) == 0); ++ ++ memset(&spec, 0, sizeof(spec)); ++ spec.it_value.tv_sec = 1; ++ assert(timerfd_settime(fd, TFD_TIMER_ABSTIME | TFD_TIMER_CANCEL_ON_SET, &spec, NULL) == 0); ++ assert(close(fd) == 0); ++ puts("timerfd ok"); ++ return 0; ++} diff --git a/src/bin/cookbook_redoxer.rs b/src/bin/cookbook_redoxer.rs index 01bfbb15..52b1ce89 100644 --- a/src/bin/cookbook_redoxer.rs +++ b/src/bin/cookbook_redoxer.rs @@ -1,4 +1,5 @@ use std::env; +use std::path::Path; fn main() { let mut args: Vec = env::args().collect(); @@ -7,10 +8,15 @@ fn main() { args.insert(2, "--".to_string()); if args[1] == "write-exec" { if let Ok(stage_dir) = std::env::var("COOKBOOK_STAGE") { - args.insert(2, format!("{}/root", stage_dir)); - args.insert(2, "--folder".to_string()); + let folder = format!("{stage_dir}/root"); + args.insert(2, stage_dir); args.insert(2, "--root".to_string()); + + if Path::new(&folder).exists() { + args.insert(2, folder); + args.insert(2, "--folder".to_string()); + } } } }