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 1572Shell 203Rust 109Markdown 993728 Definiciones

⎇ 7c794568a963b18b68d747959e6bbd07cf2ebff7 recipes/wayland-scanner-dup2-output.patch 42 líneas · 1.7 KB Historia crudo

Etapa G: wayland + wayland-protocols CONSTRUIDAS (scanner desbloqueado) 6fb7fd36d · sergio ·

1Redirige la salida del scanner al @OUTPUT@ a nivel de descriptor (dup2) en vez de freopen(stdout).
2
3En hammer el wayland-scanner se compila ENLAZADO DINÁMICO contra la musl del sandbox (zig cc
4nativo no produce estático aquí), y bajo musl-dinámico `freopen(argv[2], "w", stdout)` queda roto
5por la copy-relocation de `stdout`: trunca/crea el archivo de salida PERO no redirige el fd que usa
6`printf()`, así que el header generado sale por stdout y el @OUTPUT@ queda VACÍO. Resultado: al
7compilar libwayland, `WL_SHM_FORMAT_*` / `wl_*_interface` / `wl_callback_*` aparecen «undeclared»
8(headers de protocolo vacíos). Verificado a fondo: el binario ESTÁTICO escribe bien al archivo; el
9DINÁMICO no — mismo source, flags y config.h.
10
11`dup2(outfd, STDOUT_FILENO)` redirige el descriptor 1 a nivel de kernel: TODAS las escrituras a
12stdout (cualquiera sea el objeto FILE por la copy-reloc) terminan en el archivo. Robusto frente al
13modo de enlace. La salida queda idéntica byte-a-byte a la del scanner estático.
14
15--- a/src/scanner.c
16+++ b/src/scanner.c
17@@ -36,6 +36,8 @@
18 #include <getopt.h>
19 #include <limits.h>
20 #include <unistd.h>
21+#include <fcntl.h>
22+#include <sys/stat.h>
23
24 #if HAVE_LIBXML
25 #include <libxml/parser.h>
26@@ -2138,11 +2140,14 @@ int main(int argc, char *argv[])
27 				strerror(errno));
28 			exit(EXIT_FAILURE);
29 		}
30-		if (freopen(argv[2], "w", stdout) == NULL) {
31+		int outfd = open(argv[2], O_WRONLY | O_CREAT | O_TRUNC, 0644);
32+		if (outfd < 0 || dup2(outfd, STDOUT_FILENO) < 0) {
33 			fprintf(stderr, "Could not open output file: %s\n",
34 				strerror(errno));
35 			fclose(input);
36 			exit(EXIT_FAILURE);
37 		}
38+		if (outfd != STDOUT_FILENO)
39+			close(outfd);
40 	}
41
42 	/* initialize protocol structure */