gioser

sergio/takana

> Una distribución Linux construida con un laboratorio funcional y hermético en el > sótano, y una terminal mutable, clásica y anárquica en el piso de arriba — diseñada > desde el suelo para que una IA programadora entienda, modifique y co…

TOML 815Rust 56Shell 37Markdown 291229 Sutichaykuna

base-system-2: promover 7 tier-2 a canónicas + repo firmado

shadow (useradd/passwd), kbd (loadkeys/setfont), procps-ng (ps/top/free), pciutils (lspci),
lsof, strace, mandoc (man) → recipes/ canónicas + índice firmado. usbutils (falta libusb) y
gnupg (falta libassuan/libksba/npth) quedan staged/bloqueados; foot diferido (Wayland).
Segunda tanda del userland foundational: usuarios + teclado + proceso + hardware + docs + debug.

8d37d4576fc4f43803eef2d8770e291fa9d69f27 · ruwaq sergio · (3 killa ñawpaq) · tayta d4cdd64f9 · kay commitpi sach'ata qhaway

Semántico sayk'uy

Mana ima sutichaypas t'ikrakurqanchu: qillqalla, yachachiylla utaq willaylla t'ikrakurqan.

28 qillqakuna · +1135 −401

diff --git a/recipes/busybox.patch b/recipes/busybox.patch
new file mode 100644
index 00000000..d638ebfb
--- /dev/null
+++ b/recipes/busybox.patch
@@ -0,0 +1,33 @@
+Fixes for busybox
+
+--- a/tests/status-detached.expected
++++ b/tests/status-detached.expected
+@@ -1 +1 @@
+-nanosleep\({tv_sec=2, tv_nsec=0} <detached \.\.\.>
++nanosleep\(\{tv_sec=2, tv_nsec=0\},  <detached \.\.\.>
+--- a/tests/strace--tips.test
++++ b/tests/strace--tips.test
+@@ -13,7 +13,7 @@ tips_fmt_opt=""
+ 
+ grep_ere_escape()
+ {
+-	printf "%s" "$*" | sed 's/[].*&^$()|[\/]/\\&/g'
++	printf "%s" "$*" | sed 's/[].*&^$(){}|[\\/]/\\&/g'
+ }
+ 
+ # Check that simple "strace --tips=0" works as expected
+--- a/tests/strace-k.test
++++ b/tests/strace-k.test
+@@ -26,10 +26,9 @@ check_prog sed
+ check_prog tr
+ 
+ path_to_sed="$(command -v sed)"
+-if [ -x "$path_to_sed" ] &&
+-   path_to_sed="$(readlink -ev -- "$path_to_sed")"; then
++if [ -x "$path_to_sed" ]; then
+ 	"$path_to_sed" -n 's/^[^/]\+[[:space:]]\(\/.*\)$/\1/p' /proc/self/maps |
+-	grep -F -x -e "$path_to_sed" > /dev/null || {
++	grep -F -x -e "$(readlink -fv -- "$path_to_sed")" > /dev/null || {
+ 		cat >&2 /proc/self/maps
+ 		framework_skip_ '/proc/self/maps is invalid'
+ 	}
diff --git a/recipes/disable-test_pids-check.patch b/recipes/disable-test_pids-check.patch
new file mode 100644
index 00000000..55c544ff
--- /dev/null
+++ b/recipes/disable-test_pids-check.patch
@@ -0,0 +1,10 @@
+--- a/Makefile.am	2025-11-25 18:32:31.829279209 +0000
++++ b/Makefile.am	2025-11-25 18:33:52.519524988 +0000
+@@ -411,7 +411,6 @@
+ # Test programs not used by dejagnu but run directly
+ TESTS = \
+ 	library/tests/test_escape \
+-	library/tests/test_pids \
+ 	library/tests/test_uptime \
+ 	library/tests/test_sysinfo \
+ 	library/tests/test_version \
diff --git a/recipes/dynamic-tagfile-support.patch b/recipes/dynamic-tagfile-support.patch
new file mode 100644
index 00000000..7294d558
--- /dev/null
+++ b/recipes/dynamic-tagfile-support.patch
@@ -0,0 +1,131 @@
+BusyBox less doesn't support tag files (-T option), hence we previously
+disabled tag file support in mandoc at compile-time (HAVE_LESS_T).
+However, on Alpine it is entirely possible to replace BusyBox less with
+an implementation that supports tag files (e.g. main/less). In order to
+support tag files when such an implementation is installed, we need to
+detect at runtime whether -T is supported.
+
+This patch achieves this by invoking the pager once with -T beforehand
+and checking if it terminates with a non-zero exit status.
+
+diff -upr mandoc-1.14.6.orig/configure mandoc-1.14.6/configure
+--- mandoc-1.14.6.orig/configure	2023-07-02 19:38:31.011639507 +0200
++++ mandoc-1.14.6/configure	2023-07-02 19:38:41.794998501 +0200
+@@ -67,7 +67,6 @@ HAVE_FTS_COMPARE_CONST=
+ HAVE_GETLINE=
+ HAVE_GETSUBOPT=
+ HAVE_ISBLANK=
+-HAVE_LESS_T=
+ HAVE_MKDTEMP=
+ HAVE_MKSTEMPS=
+ HAVE_NANOSLEEP=
+@@ -363,21 +362,6 @@ fi
+ echo "selected BINM_PAGER=${BINM_PAGER}${manual}" 1>&2
+ echo "selected BINM_PAGER=${BINM_PAGER}${manual}" 1>&3
+ 
+-# --- tagging support in the pager ---
+-if ismanual "${BINM_PAGER} -T" LESS_T ${HAVE_LESS_T}; then
+-	:
+-elif ${BINM_PAGER} -T /dev/null test-noop.c 1>/dev/null 2>&3; then
+-	HAVE_LESS_T=1
+-	echo "tested ${BINM_PAGER} -T: yes" 1>&2
+-	echo "tested ${BINM_PAGER} -T: yes" 1>&3
+-	echo 1>&3
+-else
+-	HAVE_LESS_T=0
+-	echo "tested ${BINM_PAGER} -T: no" 1>&2
+-	echo "tested ${BINM_PAGER} -T: no" 1>&3
+-	echo 1>&3
+-fi
+-
+ # --- wide character and locale support ---
+ if get_locale; then
+ 	runtest wchar WCHAR "-DUTF8_LOCALE=\"${UTF8_LOCALE}\"" \
+@@ -484,7 +468,6 @@ cat << __HEREDOC__
+ #define HAVE_GETLINE ${HAVE_GETLINE}
+ #define HAVE_GETSUBOPT ${HAVE_GETSUBOPT}
+ #define HAVE_ISBLANK ${HAVE_ISBLANK}
+-#define HAVE_LESS_T ${HAVE_LESS_T}
+ #define HAVE_MKDTEMP ${HAVE_MKDTEMP}
+ #define HAVE_MKSTEMPS ${HAVE_MKSTEMPS}
+ #define HAVE_NTOHL ${HAVE_NTOHL}
+diff -upr mandoc-1.14.6.orig/main.c mandoc-1.14.6/main.c
+--- mandoc-1.14.6.orig/main.c	2023-07-02 19:38:31.011639507 +0200
++++ mandoc-1.14.6/main.c	2023-07-02 19:38:50.635019538 +0200
+@@ -1271,6 +1271,44 @@ run_pager(struct outstate *outst, char *
+ 	}
+ }
+ 
++static int
++supports_tags(const char *pager, char *tagfile)
++{
++	int	fd;
++	pid_t	pid;
++	int	wstatus;
++
++	if (strcmp(pager, "less") != 0)
++		return 0;
++
++	pid = fork();
++	switch (pid) {
++	case -1:
++		err(1, "fork");
++	case 0:
++		close(STDIN_FILENO);
++		fd = open("/dev/null", O_RDWR);
++		if (fd == -1)
++			err(1, "open");
++		assert(fd == STDIN_FILENO);
++
++		close(STDOUT_FILENO);
++		dup2(fd, STDOUT_FILENO);
++		close(STDERR_FILENO);
++		dup2(fd, STDERR_FILENO);
++
++		/* If the pager doesn't support -T we expect a non-zero exit code */
++		execlp(pager, pager, "-T", tagfile, "-", (char *)NULL);
++		exit(EXIT_FAILURE);
++	default:
++		if (waitpid(pid, &wstatus, 0) == -1)
++			err(1, "waitpid");
++		break;
++	}
++
++	return wstatus == EXIT_SUCCESS;
++}
++
+ static pid_t
+ spawn_pager(struct outstate *outst, char *tag_target)
+ {
+@@ -1279,9 +1317,7 @@ spawn_pager(struct outstate *outst, char
+ 	char		*argv[MAX_PAGER_ARGS];
+ 	const char	*pager;
+ 	char		*cp;
+-#if HAVE_LESS_T
+ 	size_t		 cmdlen;
+-#endif
+ 	int		 argc, use_ofn;
+ 	pid_t		 pager_pid;
+ 
+@@ -1316,11 +1352,10 @@ spawn_pager(struct outstate *outst, char
+ 	/* For less(1), use the tag file. */
+ 
+ 	use_ofn = 1;
+-#if HAVE_LESS_T
+ 	if (*outst->tag_files->tfn != '\0' &&
+ 	    (cmdlen = strlen(argv[0])) >= 4) {
+ 		cp = argv[0] + cmdlen - 4;
+-		if (strcmp(cp, "less") == 0) {
++		if (supports_tags(pager, outst->tag_files->tfn)) {
+ 			argv[argc++] = mandoc_strdup("-T");
+ 			argv[argc++] = outst->tag_files->tfn;
+ 			if (tag_target != NULL) {
+@@ -1330,7 +1365,7 @@ spawn_pager(struct outstate *outst, char
+ 			}
+ 		}
+ 	}
+-#endif
++
+ 	if (use_ofn) {
+ 		if (outst->outtype == OUTT_HTML && tag_target != NULL)
+ 			mandoc_asprintf(&argv[argc], "file://%s#%s",
diff --git a/recipes/empty-title.patch b/recipes/empty-title.patch
new file mode 100644
index 00000000..4fd46eb2
--- /dev/null
+++ b/recipes/empty-title.patch
@@ -0,0 +1,47 @@
+Patch-Source: https://marc.info/?l=mandoc-discuss&m=175200050325256&w=2
+
+--- a/man_validate.c
++++ b/man_validate.c
+@@ -481,7 +481,7 @@ post_TH(CHKARGS)
+ 	/* ->TITLE<- MSEC DATE OS VOL */
+ 
+ 	n = n->child;
+-	if (n != NULL && n->string != NULL) {
++	if (n != NULL && n->string != NULL && *n->string != '\0') {
+ 		for (p = n->string; *p != '\0'; p++) {
+ 			/* Only warn about this once... */
+ 			if (isalpha((unsigned char)*p) &&
+@@ -494,8 +494,8 @@ post_TH(CHKARGS)
+ 		}
+ 		man->meta.title = mandoc_strdup(n->string);
+ 	} else {
+-		man->meta.title = mandoc_strdup("");
+-		mandoc_msg(MANDOCERR_TH_NOTITLE, nb->line, nb->pos, "TH");
++		man->meta.title = mandoc_strdup("UNTITLED");
++		mandoc_msg(MANDOCERR_DT_NOTITLE, nb->line, nb->pos, "TH");
+ 	}
+ 
+ 	/* TITLE ->MSEC<- DATE OS VOL */
+--- a/regress/man/TH/noarg.out_ascii
++++ b/regress/man/TH/noarg.out_ascii
+@@ -1,4 +1,4 @@
+-()                                                                          ()
++UNTITLED()                                                          UNTITLED()
+ 
+ NNAAMMEE
+        TH-noarg - no arguments to the TH macro
+@@ -6,4 +6,4 @@ NNAAMMEE
+ DDEESSCCRRIIPPTTIIOONN
+        some text
+ 
+-OpenBSD                                                                     ()
++OpenBSD                                                             UNTITLED()
+--- a/regress/man/TH/noarg.out_lint
++++ b/regress/man/TH/noarg.out_lint
+@@ -1,3 +1,3 @@
+-mandoc: noarg.in:2:2: WARNING: missing manual title, using "": TH
+-mandoc: noarg.in:2:2: WARNING: missing manual section, using "": TH 
++mandoc: noarg.in:2:2: WARNING: missing manual title, using UNTITLED: TH
++mandoc: noarg.in:2:2: WARNING: missing manual section, using "": TH UNTITLED
+ mandoc: noarg.in:2:2: WARNING: missing date, using "": TH
+
diff --git a/recipes/fix-core-dump-tag-put-assertion.patch b/recipes/fix-core-dump-tag-put-assertion.patch
new file mode 100644
index 00000000..d9922f93
--- /dev/null
+++ b/recipes/fix-core-dump-tag-put-assertion.patch
@@ -0,0 +1,56 @@
+Patch-Source: https://cvsweb.bsd.lv/mandoc/tag.c.diff?r1=1.36&r2=1.37
+---
+===================================================================
+RCS file: /cvs/mandoc/tag.c,v
+retrieving revision 1.36
+retrieving revision 1.37
+diff -u -p -r1.36 -r1.37
+--- mandoc/tag.c	2020/04/19 16:36:16	1.36
++++ mandoc/tag.c	2022/04/26 11:38:38	1.37
+@@ -1,6 +1,7 @@
+-/* $Id: tag.c,v 1.36 2020/04/19 16:36:16 schwarze Exp $ */
++/* $Id: tag.c,v 1.37 2022/04/26 11:38:38 schwarze Exp $ */
+ /*
+- * Copyright (c) 2015,2016,2018,2019,2020 Ingo Schwarze <schwarze@openbsd.org>
++ * Copyright (c) 2015, 2016, 2018, 2019, 2020, 2022
++ *               Ingo Schwarze <schwarze@openbsd.org>
+  *
+  * Permission to use, copy, modify, and distribute this software for any
+  * purpose with or without fee is hereby granted, provided that the above
+@@ -80,7 +81,7 @@ tag_free(void)
+ 
+ /*
+  * Set a node where a term is defined,
+- * unless it is already defined at a lower priority.
++ * unless the term is already defined at a lower priority.
+  */
+ void
+ tag_put(const char *s, int prio, struct roff_node *n)
+@@ -93,6 +94,18 @@ tag_put(const char *s, int prio, struct roff_node *n)
+ 
+ 	assert(prio <= TAG_FALLBACK);
+ 
++	/*
++	 * If the node is already tagged, the existing tag is
++	 * explicit and we are now about to add an implicit tag.
++	 * Don't do that; just skip implicit tagging if the author
++	 * specified an explicit tag.
++	 */
++
++	if (n->flags & NODE_ID)
++		return;
++
++	/* Determine the implicit tag. */
++
+ 	if (s == NULL) {
+ 		if (n->child == NULL || n->child->type != ROFFT_TEXT)
+ 			return;
+@@ -150,7 +163,7 @@ tag_put(const char *s, int prio, struct roff_node *n)
+ 	 */
+ 
+ 	else if (entry->prio < prio)
+-			return;
++		return;
+ 
+ 	/*
+ 	 * If the existing entry is worse, clear it.
diff --git a/recipes/hassecurity.patch b/recipes/hassecurity.patch
new file mode 100644
index 00000000..5e758d8a
--- /dev/null
+++ b/recipes/hassecurity.patch
@@ -0,0 +1,11 @@
+--- a/lib/dialects/linux/machine.h
++++ b/lib/dialects/linux/machine.h
+@@ -390,7 +390,7 @@
+  * (the one that its user logged on with) of the lsof process.
+  */
+ 
+-/* #define	HASSECURITY	1 */
++#define	HASSECURITY	1
+ 
+ /*
+  * If HASSECURITY is defined, define HASNOSOCKSECURITY to allow users
diff --git a/recipes/incoming-clib/kbd.toml b/recipes/kbd.toml
similarity index 100%
rename from recipes/incoming-clib/kbd.toml
rename to recipes/kbd.toml
diff --git a/recipes/lex.patch b/recipes/lex.patch
new file mode 100644
index 00000000..a30f2b06
--- /dev/null
+++ b/recipes/lex.patch
@@ -0,0 +1,15 @@
+Lexer is never run so don't bother
+
+--- a/configure
++++ b/configure
+@@ -7131,10 +7131,6 @@
+ rm -f conftest.l $LEX_OUTPUT_ROOT.c
+ 
+ fi
+-if test "x$LEX" != xflex
+-then :
+-  as_fn_error $? "kbd depends on flex features, but found '$LEX'." "$LINENO" 5
+-fi
+ 
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -std=gnu11" >&5
+ printf %s "checking whether C compiler accepts -std=gnu11... " >&6; }
diff --git a/recipes/linux-headers-7.0.patch b/recipes/linux-headers-7.0.patch
new file mode 100644
index 00000000..0dc6ccb5
--- /dev/null
+++ b/recipes/linux-headers-7.0.patch
@@ -0,0 +1,274 @@
+From 619b1e60da171d573481d2fbfea7645c8a80d1ae Mon Sep 17 00:00:00 2001
+From: "Dmitry V. Levin" <ldv@strace.io>
+Date: Tue, 10 Mar 2026 08:00:00 +0000
+Subject: [PATCH] bundled: update linux/io_uring.h to v7.0-rc3
+
+* bundled/linux/include/uapi/linux/io_uring.h: Update to
+headers_install'ed Linux kernel v7.0-rc3.
+* src/io_uring.c (print_io_uring_zcrx_ifq_reg): Follow the rename
+of __resv2 field of struct io_uring_zcrx_ifq_reg to rx_buf_len.
+* tests/io_uring_register.c (test_IORING_REGISTER_ZCRX_IFQ): Update
+expected output.
+---
+ bundled/linux/include/uapi/linux/io_uring.h | 35 +++++++++++++++++++--
+ src/io_uring.c                              |  7 ++---
+ tests/io_uring_register.c                   |  8 ++---
+ 3 files changed, 39 insertions(+), 11 deletions(-)
+
+diff --git a/bundled/linux/include/uapi/linux/io_uring.h b/bundled/linux/include/uapi/linux/io_uring.h
+index b5b23c0d52..1ff16141c8 100644
+--- a/bundled/linux/include/uapi/linux/io_uring.h
++++ b/bundled/linux/include/uapi/linux/io_uring.h
+@@ -188,7 +188,8 @@ enum io_uring_sqe_flags_bit {
+ /*
+  * If COOP_TASKRUN is set, get notified if task work is available for
+  * running and a kernel transition would be needed to run it. This sets
+- * IORING_SQ_TASKRUN in the sq ring flags. Not valid with COOP_TASKRUN.
++ * IORING_SQ_TASKRUN in the sq ring flags. Not valid without COOP_TASKRUN
++ * or DEFER_TASKRUN.
+  */
+ #define IORING_SETUP_TASKRUN_FLAG	(1U << 9)
+ #define IORING_SETUP_SQE128		(1U << 10) /* SQEs are 128 byte */
+@@ -237,6 +238,18 @@ enum io_uring_sqe_flags_bit {
+  */
+ #define IORING_SETUP_SQE_MIXED		(1U << 19)
+ 
++/*
++ * When set, io_uring ignores SQ head and tail and fetches SQEs to submit
++ * starting from index 0 instead from the index stored in the head pointer.
++ * IOW, the user should place all SQE at the beginning of the SQ memory
++ * before issuing a submission syscall.
++ *
++ * It requires IORING_SETUP_NO_SQARRAY and is incompatible with
++ * IORING_SETUP_SQPOLL. The user must also never change the SQ head and tail
++ * values and keep it set to 0. Any other value is undefined behaviour.
++ */
++#define IORING_SETUP_SQ_REWIND		(1U << 20)
++
+ enum io_uring_op {
+ 	IORING_OP_NOP,
+ 	IORING_OP_READV,
+@@ -700,6 +713,9 @@ enum io_uring_register_op {
+ 	/* auxiliary zcrx configuration, see enum zcrx_ctrl_op */
+ 	IORING_REGISTER_ZCRX_CTRL		= 36,
+ 
++	/* register bpf filtering programs */
++	IORING_REGISTER_BPF_FILTER		= 37,
++
+ 	/* this goes last */
+ 	IORING_REGISTER_LAST,
+ 
+@@ -805,6 +821,13 @@ struct io_uring_restriction {
+ 	__u32 resv2[3];
+ };
+ 
++struct io_uring_task_restriction {
++	__u16 flags;
++	__u16 nr_res;
++	__u32 resv[3];
++	__DECLARE_FLEX_ARRAY(struct io_uring_restriction, restrictions);
++};
++
+ struct io_uring_clock_register {
+ 	__u32	clockid;
+ 	__u32	__resv[3];
+@@ -1068,6 +1091,14 @@ enum zcrx_reg_flags {
+ 	ZCRX_REG_IMPORT	= 1,
+ };
+ 
++enum zcrx_features {
++	/*
++	 * The user can ask for the desired rx page size by passing the
++	 * value in struct io_uring_zcrx_ifq_reg::rx_buf_len.
++	 */
++	ZCRX_FEATURE_RX_PAGE_SIZE	= 1 << 0,
++};
++
+ /*
+  * Argument for IORING_REGISTER_ZCRX_IFQ
+  */
+@@ -1082,7 +1113,7 @@ struct io_uring_zcrx_ifq_reg {
+ 
+ 	struct io_uring_zcrx_offsets offsets;
+ 	__u32	zcrx_id;
+-	__u32	__resv2;
++	__u32	rx_buf_len;
+ 	__u64	__resv[3];
+ };
+ 
+diff --git a/src/io_uring.c b/src/io_uring.c
+index a479c9570a..04de316513 100644
+--- a/src/io_uring.c
++++ b/src/io_uring.c
+@@ -1254,11 +1254,8 @@ print_io_uring_zcrx_ifq_reg(struct tcb *tcp, const kernel_ulong_t addr)
+ 	print_io_uring_zcrx_offsets(tcp, &arg.offsets);
+ 	tprint_struct_next();
+ 	PRINT_FIELD_U(arg, zcrx_id);
+-
+-	if (arg.__resv2) {
+-		tprint_struct_next();
+-		PRINT_FIELD_X(arg, __resv2);
+-	}
++	tprint_struct_next();
++	PRINT_FIELD_U(arg, rx_buf_len);
+ 
+ 	if (!IS_ARRAY_ZERO(arg.__resv)) {
+ 		tprint_struct_next();
+diff --git a/tests/io_uring_register.c b/tests/io_uring_register.c
+index cfaa93d208..9952f0370e 100644
+--- a/tests/io_uring_register.c
++++ b/tests/io_uring_register.c
+@@ -2058,7 +2058,7 @@ test_IORING_REGISTER_ZCRX_IFQ(int fd_null)
+ 	       ", flags=" XLAT_FMT
+ 	       ", area_ptr=%#llx, region_ptr=%#llx"
+ 	       ", offsets={head=%u, tail=%u, rqes=%u}"
+-	       ", zcrx_id=%u}, 1) = %s\n",
++	       ", zcrx_id=%u, rx_buf_len=0}, 1) = %s\n",
+ 	       fd_null, path_null,
+ 	       XLAT_SEL(zcrx_ifq_ops.val, zcrx_ifq_ops.str),
+ 	       zcrx_ifq->if_idx, zcrx_ifq->if_rxq, zcrx_ifq->rq_entries,
+@@ -2073,9 +2073,9 @@ test_IORING_REGISTER_ZCRX_IFQ(int fd_null)
+ 	memset(zcrx_ifq, 0, sizeof(*zcrx_ifq));
+ 	zcrx_ifq->if_idx = 0xaaaa;
+ 	zcrx_ifq->offsets.__resv2 = 0xbbbb;
+-	zcrx_ifq->__resv2 = 0xcccc;
+ 	zcrx_ifq->offsets.__resv[0] = 0xddddddddddddddddULL;
+ 	zcrx_ifq->offsets.__resv[1] = 0xeeeeeeeeeeeeeeeeULL;
++	zcrx_ifq->rx_buf_len = 0xcccc;
+ 	zcrx_ifq->__resv[0] = 0x1111111111111111ULL;
+ 	zcrx_ifq->__resv[1] = 0x2222222222222222ULL;
+ 	zcrx_ifq->__resv[2] = 0x3333333333333333ULL;
+@@ -2086,7 +2086,7 @@ test_IORING_REGISTER_ZCRX_IFQ(int fd_null)
+ 	       ", area_ptr=NULL, region_ptr=NULL"
+ 	       ", offsets={head=0, tail=0, rqes=0, __resv2=%#x"
+ 	       ", __resv=[%#llx, %#llx]}"
+-	       ", zcrx_id=0, __resv2=%#x"
++	       ", zcrx_id=0, rx_buf_len=%u"
+ 	       ", __resv=[%#llx, %#llx, %#llx]}, 1) = %s\n",
+ 	       fd_null, path_null,
+ 	       XLAT_SEL(zcrx_ifq_ops.val, zcrx_ifq_ops.str),
+@@ -2094,7 +2094,7 @@ test_IORING_REGISTER_ZCRX_IFQ(int fd_null)
+ 	       zcrx_ifq->offsets.__resv2,
+ 	       (unsigned long long) zcrx_ifq->offsets.__resv[0],
+ 	       (unsigned long long) zcrx_ifq->offsets.__resv[1],
+-	       zcrx_ifq->__resv2,
++	       zcrx_ifq->rx_buf_len,
+ 	       (unsigned long long) zcrx_ifq->__resv[0],
+ 	       (unsigned long long) zcrx_ifq->__resv[1],
+ 	       (unsigned long long) zcrx_ifq->__resv[2],
+From 81fb4e6cd8b22acc51b8f7226a60a75825087d7b Mon Sep 17 00:00:00 2001
+From: "Dmitry V. Levin" <ldv@strace.io>
+Date: Wed, 11 Mar 2026 08:00:00 +0000
+Subject: [PATCH] bundled: update linux/io_uring/query.h to v7.0-rc3
+
+* bundled/linux/include/uapi/linux/io_uring/query.h: Update to
+headers_install'ed Linux kernel v7.0-rc3.
+* src/io_uring.c (print_io_uring_query_zcrx): Follow the rename
+of "__resv1" field of struct io_uring_query_zcrx to "features".
+* tests/io_uring_register.c (test_IORING_REGISTER_QUERY): Update
+expected output.
+---
+ .../linux/include/uapi/linux/io_uring/query.h    |  6 +++++-
+ src/io_uring.c                                   |  7 ++-----
+ tests/io_uring_register.c                        | 16 ++++++++--------
+ 3 files changed, 15 insertions(+), 14 deletions(-)
+
+diff --git a/bundled/linux/include/uapi/linux/io_uring/query.h b/bundled/linux/include/uapi/linux/io_uring/query.h
+index 2456e6c5e..95500759c 100644
+--- a/bundled/linux/include/uapi/linux/io_uring/query.h
++++ b/bundled/linux/include/uapi/linux/io_uring/query.h
+@@ -1,6 +1,9 @@
+ /* SPDX-License-Identifier: (GPL-2.0 WITH Linux-syscall-note) OR MIT */
+ /*
+  * Header file for the io_uring query interface.
++ *
++ * Copyright (C) 2026 Pavel Begunkov <asml.silence@gmail.com>
++ * Copyright (C) Meta Platforms, Inc.
+  */
+ #ifndef LINUX_IO_URING_QUERY_H
+ #define LINUX_IO_URING_QUERY_H
+@@ -50,7 +53,8 @@ struct io_uring_query_zcrx {
+ 	__u64 area_flags;
+ 	/* The number of supported ZCRX_CTRL_* opcodes */
+ 	__u32 nr_ctrl_opcodes;
+-	__u32 __resv1;
++	/* Bitmask of ZCRX_FEATURE_* indicating which features are available */
++	__u32 features;
+ 	/* The refill ring header size */
+ 	__u32 rq_hdr_size;
+ 	/* The alignment for the header */
+diff --git a/src/io_uring.c b/src/io_uring.c
+index 04de31651..d6eb63ffe 100644
+--- a/src/io_uring.c
++++ b/src/io_uring.c
+@@ -1538,15 +1538,12 @@ print_io_uring_query_zcrx(struct tcb *tcp, const kernel_ulong_t addr)
+ 	tprint_struct_next();
+ 	PRINT_FIELD_U(zcrx, nr_ctrl_opcodes);
+ 	tprint_struct_next();
++	PRINT_FIELD_X(zcrx, features);
++	tprint_struct_next();
+ 	PRINT_FIELD_U(zcrx, rq_hdr_size);
+ 	tprint_struct_next();
+ 	PRINT_FIELD_U(zcrx, rq_hdr_alignment);
+ 
+-	if (zcrx.__resv1) {
+-		tprint_struct_next();
+-		PRINT_FIELD_X(zcrx, __resv1);
+-	}
+-
+ 	if (zcrx.__resv2) {
+ 		tprint_struct_next();
+ 		PRINT_FIELD_X(zcrx, __resv2);
+diff --git a/tests/io_uring_register.c b/tests/io_uring_register.c
+index 9952f0370..158c714a0 100644
+--- a/tests/io_uring_register.c
++++ b/tests/io_uring_register.c
+@@ -2373,8 +2373,8 @@ test_IORING_REGISTER_QUERY(int fd_null)
+ 	printf("io_uring_register(%u<%s>, " XLAT_FMT
+ 	       ", {query_data=%p, query_op=" XLAT_FMT ", size=%u, result=0"
+ 	       ", query_data={register_flags=" XLAT_FMT ", area_flags=" XLAT_FMT
+-	       ", nr_ctrl_opcodes=%u, rq_hdr_size=%u, rq_hdr_alignment=%u}"
+-	       ", next_entry=NULL}, 0) = %s\n",
++	       ", nr_ctrl_opcodes=%u, features=0, rq_hdr_size=%u"
++	       ", rq_hdr_alignment=%u}, next_entry=NULL}, 0) = %s\n",
+ 	       fd_null, path_null,
+ 	       XLAT_SEL(query_ops.val, query_ops.str),
+ 	       zcrx_data,
+@@ -2490,8 +2490,8 @@ test_IORING_REGISTER_QUERY(int fd_null)
+ 	       ", sqe_flags=0, nr_query_opcodes=0}, next_entry="
+ 	       "{query_data=%p, query_op=" XLAT_FMT ", size=%u, result=0"
+ 	       ", query_data={register_flags=0, area_flags=0"
+-	       ", nr_ctrl_opcodes=%u, rq_hdr_size=0, rq_hdr_alignment=0}"
+-	       ", next_entry=NULL}}, 0) = %s\n",
++	       ", nr_ctrl_opcodes=%u, features=0, rq_hdr_size=0"
++	       ", rq_hdr_alignment=0}, next_entry=NULL}}, 0) = %s\n",
+ 	       fd_null, path_null,
+ 	       XLAT_SEL(query_ops.val, query_ops.str),
+ 	       opcode_data2,
+@@ -2570,22 +2570,22 @@ test_IORING_REGISTER_QUERY(int fd_null)
+ 	hdr->result = 0;
+ 
+ 	memset(zcrx_data, 0, sizeof(*zcrx_data));
+-	zcrx_data->__resv1 = 0xdeadbeef;
++	zcrx_data->features = 0xdeadbeef;
+ 	zcrx_data->__resv2 = 0xcafebabe12345678ULL;
+ 
+ 	sys_io_uring_register(fd_null, query_ops.val, hdr, 0);
+ 	printf("io_uring_register(%u<%s>, " XLAT_FMT
+ 	       ", {query_data=%p, query_op=" XLAT_FMT ", size=%u, result=0"
+ 	       ", query_data={register_flags=0, area_flags=0"
+-	       ", nr_ctrl_opcodes=0, rq_hdr_size=0"
+-	       ", rq_hdr_alignment=0, __resv1=%#x, __resv2=%#llx}"
++	       ", nr_ctrl_opcodes=0, features=%#x, rq_hdr_size=0"
++	       ", rq_hdr_alignment=0, __resv2=%#llx}"
+ 	       ", next_entry=NULL}, 0) = %s\n",
+ 	       fd_null, path_null,
+ 	       XLAT_SEL(query_ops.val, query_ops.str),
+ 	       zcrx_data,
+ 	       XLAT_ARGS(IO_URING_QUERY_ZCRX),
+ 	       (unsigned int) sizeof(*zcrx_data),
+-	       zcrx_data->__resv1,
++	       zcrx_data->features,
+ 	       (unsigned long long) zcrx_data->__resv2,
+ 	       errstr);
+ 
diff --git a/recipes/incoming-clib/lsof.toml b/recipes/lsof.toml
similarity index 100%
rename from recipes/incoming-clib/lsof.toml
rename to recipes/lsof.toml
diff --git a/recipes/incoming-clib/mandoc.toml b/recipes/mandoc.toml
similarity index 100%
rename from recipes/incoming-clib/mandoc.toml
rename to recipes/mandoc.toml
diff --git a/recipes/nlattr-fix.patch b/recipes/nlattr-fix.patch
new file mode 100644
index 00000000..6d480fab
--- /dev/null
+++ b/recipes/nlattr-fix.patch
@@ -0,0 +1,21 @@
+--- strace-4.18/tests/nlattr.c.old        2017-07-05 07:08:09.000000000 +0000
++++ strace-4.18/tests/nlattr.c    2017-08-17 00:25:26.734218699 +0000
+@@ -61,7 +61,7 @@
+ 	};
+ 	struct msg *msg;
+ 	struct nlattr *nla;
+-	unsigned int msg_len;
++	uint32_t msg_len;
+ 	long rc;
+ 
+ 	/* fetch fail: len < sizeof(struct nlattr) */
+@@ -259,7 +259,7 @@
+ 	};
+ 	struct msg *msg;
+ 	struct nlattr *nla;
+-	unsigned int msg_len;
++	uint32_t msg_len;
+ 	long rc;
+ 
+ 	msg_len = NLMSG_SPACE(sizeof(msg->udm)) + sizeof(*nla);
+
diff --git a/recipes/off64.patch b/recipes/off64.patch
new file mode 100644
index 00000000..9ac41c35
--- /dev/null
+++ b/recipes/off64.patch
@@ -0,0 +1,39 @@
+off_t is always 64-bit with musl
+
+--- a/tests/readahead.c
++++ b/tests/readahead.c
+@@ -42,7 +42,7 @@ static const int fds[] = {
+ 	0x7fffffff,
+ };
+ 
+-static const off64_t offsets[] = {
++static const off_t offsets[] = {
+ 	-0x8000000000000000LL,
+ 	-0x5060708090a0b0c0LL,
+ 	-1LL,
+--- a/tests/sync_file_range.c
++++ b/tests/sync_file_range.c
+@@ -20,8 +20,8 @@ int
+ main(void)
+ {
+ 	const int fd = -1;
+-	const off64_t offset = 0xdeadbeefbadc0dedULL;
+-	const off64_t nbytes = 0xfacefeedcafef00dULL;
++	const off_t offset = 0xdeadbeefbadc0dedULL;
++	const off_t nbytes = 0xfacefeedcafef00dULL;
+ 	const unsigned int flags = -1;
+ 
+ 	int rc = sync_file_range(fd, offset, nbytes, flags);
+--- a/tests/sync_file_range2.c
++++ b/tests/sync_file_range2.c
+@@ -20,8 +20,8 @@ int
+ main(void)
+ {
+ 	const int fd = -1;
+-	const off64_t offset = 0xdeadbeefbadc0ded;
+-	const off64_t nbytes = 0xfacefeedcafef00d;
++	const off_t offset = 0xdeadbeefbadc0ded;
++	const off_t nbytes = 0xfacefeedcafef00d;
+ 	const unsigned int flags = -1;
+ 
+ 	int rc = sync_file_range(fd, offset, nbytes, flags);
diff --git a/recipes/outdated-warn-disable.patch b/recipes/outdated-warn-disable.patch
new file mode 100644
index 00000000..6c58d841
--- /dev/null
+++ b/recipes/outdated-warn-disable.patch
@@ -0,0 +1,17 @@
+On Alpine, apropos(1) is available in a separate subpackages and not
+installed by default. For this reason, having this warning enabled by
+default does not make much sense since we don't use mandoc.db by
+default.
+
+diff -upr a/main.c b/main.c
+--- a/main.c	2021-09-19 18:21:40.000000000 +0200
++++ b/main.c	2021-09-19 19:40:28.711594083 +0200
+@@ -822,8 +822,6 @@ fs_lookup(const struct manpaths *paths,
+ 	return globres;
+ 
+ found:
+-	warnx("outdated mandoc.db lacks %s(%s) entry, run %s %s",
+-	    name, sec, BINM_MAKEWHATIS, paths->paths[ipath]);
+ 	if (res == NULL)
+ 		free(file);
+ 	else if (file == NULL)
diff --git a/recipes/incoming-clib/pciutils.toml b/recipes/pciutils.toml
similarity index 100%
rename from recipes/incoming-clib/pciutils.toml
rename to recipes/pciutils.toml
diff --git a/recipes/incoming-clib/procps-ng.toml b/recipes/procps-ng.toml
similarity index 100%
rename from recipes/incoming-clib/procps-ng.toml
rename to recipes/procps-ng.toml
diff --git a/recipes/incoming-clib/shadow.toml b/recipes/shadow.toml
similarity index 100%
rename from recipes/incoming-clib/shadow.toml
rename to recipes/shadow.toml
diff --git a/recipes/incoming-clib/strace.toml b/recipes/strace.toml
similarity index 100%
rename from recipes/incoming-clib/strace.toml
rename to recipes/strace.toml
diff --git a/recipes/tv_usec.patch b/recipes/tv_usec.patch
new file mode 100644
index 00000000..51b30730
--- /dev/null
+++ b/recipes/tv_usec.patch
@@ -0,0 +1,46 @@
+Fix types on 32-bit
+
+--- a/tests/futimesat.c
++++ b/tests/futimesat.c
+@@ -100,7 +100,7 @@ main(void)
+ 	tv[0].tv_sec = 0xdeadbeefU;
+ 	tv[0].tv_usec = 0xfacefeedU;
+ 	tv[1].tv_sec = (typeof(tv[1].tv_sec)) 0xcafef00ddeadbeefLL;
+-	tv[1].tv_usec = (suseconds_t) 0xbadc0dedfacefeedLL;
++	tv[1].tv_usec = (typeof(tv[1].tv_usec)) 0xbadc0dedfacefeedLL;
+ 
+ 	k_futimesat(kfdcwd, kfname, (uintptr_t) tv);
+ 	printf("futimesat(AT_FDCWD, %s, [", qname);
+--- a/tests/xettimeofday.c
++++ b/tests/xettimeofday.c
+@@ -58,7 +58,7 @@ main(void)
+ 	       tz->tz_minuteswest, tz->tz_dsttime, sprintrc(-1));
+ 
+ 	tv->tv_sec = (typeof(tv->tv_sec)) 0xcafef00ddeadbeefLL;
+-	tv->tv_usec = (suseconds_t) 0xbadc0dedfacefeedLL;
++	tv->tv_usec = (typeof(tv->tv_usec)) 0xbadc0dedfacefeedLL;
+ 	assert(syscall(__NR_settimeofday, tv, tz) == -1);
+ 	printf("settimeofday({tv_sec=%lld, tv_usec=%llu}"
+ 	       ", {tz_minuteswest=%d, tz_dsttime=%d}) = %s\n",
+--- a/tests/xselect.c
++++ b/tests/xselect.c
+@@ -214,7 +214,7 @@ main(void)
+ 	 */
+ 	*l_rs = (1UL << fds[0]) | (1UL << fds[1]);
+ 	tv_in.tv_sec = (typeof(tv_in.tv_sec)) 0xcafef00ddeadbeefLL;
+-	tv_in.tv_usec = (suseconds_t) 0xbadc0dedfacefeedLL;
++	tv_in.tv_usec = (typeof(tv_in.tv_usec)) 0xbadc0dedfacefeedLL;
+ 	memcpy(tv, &tv_in, sizeof(tv_in));
+ 	rc = xselect(nfds, a_rs, a_rs, a_rs, a_tv);
+ 	if (rc < 0) {
+--- a/tests/xutimes.c
++++ b/tests/xutimes.c
+@@ -87,7 +87,7 @@ main(void)
+ 	tv[0].tv_sec = 0xdeadbeefU;
+ 	tv[0].tv_usec = 0xfacefeedU;
+ 	tv[1].tv_sec = (typeof(tv[1].tv_sec)) 0xcafef00ddeadbeefLL;
+-	tv[1].tv_usec = (suseconds_t) 0xbadc0dedfacefeedLL;
++	tv[1].tv_usec = (typeof(tv[1].tv_usec)) 0xbadc0dedfacefeedLL;
+ 
+ 	k_utimes(kfname, (uintptr_t) tv);
+ 	printf("%s(%s, [", TEST_SYSCALL_STR, qname);
diff --git a/recipes/useradd-defaults.patch b/recipes/useradd-defaults.patch
new file mode 100644
index 00000000..e10610c6
--- /dev/null
+++ b/recipes/useradd-defaults.patch
@@ -0,0 +1,24 @@
+From: Jakub Jirutka <jakub@jirutka.cz>
+Date: Sun, 19 Dec 2021 21:50:00 +0100
+Subject: [PATCH] Change some useradd defaults
+
+--- a/src/useradd.c
++++ b/src/useradd.c
+@@ -87,14 +87,14 @@
+ /*
+  * These defaults are used if there is no defaults file.
+  */
+-static gid_t def_group = 1000;
++static gid_t def_group = 100;
+ static const char *def_groups = "";
+ static const char *def_gname = "other";
+ static const char *def_home = "/home";
+-static const char *def_shell = "/bin/bash";
++static const char *def_shell = "/bin/ash";
+ static const char *def_template = SKEL_DIR;
+ static const char *def_usrtemplate = USRSKELDIR;
+-static const char *def_create_mail_spool = "yes";
++static const char *def_create_mail_spool = "no";
+ static const char *def_log_init = "yes";
+ 
+ static long def_inactive = -1;
diff --git a/tandas/base-system-2.txt b/tandas/base-system-2.txt
new file mode 100644
index 00000000..ed898ed1
--- /dev/null
+++ b/tandas/base-system-2.txt
@@ -0,0 +1,10 @@
+# base-system-2 — tier 2 del userland foundational (2026-07-10). Mismo patrón de de-Alpinización.
+shadow
+kbd
+procps-ng
+gnupg
+pciutils
+usbutils
+lsof
+strace
+mandoc