From 5ababec1a51551f1117c87e901b0377e385a7dcc Mon Sep 17 00:00:00 2001 From: sergio Date: Thu, 6 Aug 2026 12:24:38 -0400 Subject: [PATCH] =?UTF-8?q?=F0=9F=94=AD=20portal-probe:=20el=20plazo=20de?= =?UTF-8?q?=20los=20pasos=20que=20esperan=20a=20una=20PERSONA=20ahora=20es?= =?UTF-8?q?=20ajustable?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `Start` de ScreenCast y el `Screenshot` interactivo ABREN UN SELECTOR: no terminan hasta que alguien elige una pantalla. Tenían 60s clavados, y en metal eso alcanza para que la sonda se rinda antes de que nadie llegue a hacer clic. El informe entonces dice «el portal aceptó la llamada y no contestó», que se lee como un fallo del portal cuando la cadena está simplemente esperando. Es el mismo error de método que ya nos costó tres diagnósticos falsos en esta campaña (initramfs 5s, cosmic-diag 50s, wifi-up 6s): medir contra el reloj en vez de contra el hecho. Acá el hecho depende de un humano, así que el reloj tiene que ser AJUSTABLE, no adivinado. Los plazos de CreateSession/SelectSources siguen en 15s a propósito: esos pasos no le piden nada a nadie, y si tardan es que algo anda mal de verdad. Co-Authored-By: Claude Opus 5 (1M context) --- tools/portal-probe/portal-probe.c | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/tools/portal-probe/portal-probe.c b/tools/portal-probe/portal-probe.c index 3fc08c96..7dbb080f 100644 --- a/tools/portal-probe/portal-probe.c +++ b/tools/portal-probe/portal-probe.c @@ -26,10 +26,19 @@ * el path para recién ahí hacer `AddMatch`, el portal puede haber emitido ya la señal y se pierde * para siempre. Es una carrera real, no teórica. * - * Uso: portal-probe screencast [--multiple] [--window] + * Uso: portal-probe screencast [--multiple] [--window] [--wait N] * portal-probe filechooser [--save] - * portal-probe screenshot + * portal-probe screenshot [--wait N] * portal-probe version (qué interfaces sirve el portal, y en qué versión) + * + * `--wait N` (por defecto 60s) es el plazo de los pasos que ABREN UN SELECTOR y por lo tanto + * esperan a una PERSONA: el `Start` de ScreenCast y el `Screenshot` interactivo. Medido en metal + * el 2026-08-06: con 60s clavados la sonda se rinde antes de que nadie llegue a elegir pantalla, y + * el informe sale «el portal aceptó la llamada y no contestó» — que se lee como un fallo del portal + * cuando en realidad la cadena está esperando un clic. Es el mismo error de método que ya nos costó + * tres diagnósticos falsos: medir contra el reloj en vez de contra el hecho. Aquí el hecho depende + * de un humano, así que el reloj tiene que ser AJUSTABLE — no adivinado. + * Los otros plazos (CreateSession/SelectSources) siguen en 15s a propósito: ésos no piden a nadie. */ #include @@ -232,6 +241,9 @@ static void probe_version(DBusConnection *bus, const char *iface) dbus_message_unref(r); } +/* Plazo de los pasos que esperan a una PERSONA (ver cabecera). Ajustable con --wait N. */ +static int g_wait_s = 60; + /* ── ScreenCast: el handshake de CUATRO pasos ─────────────────────────────────────────────────── */ static int do_screencast(DBusConnection *bus, int multiple, int window) @@ -297,7 +309,7 @@ static int do_screencast(DBusConnection *bus, int multiple, int window) dbus_message_iter_close_container(&it, &arr); if (!call_request(bus, m, "Start")) return 1; } - if (wait_response(bus, path, 60, NULL, 0) != 0) return 1; + if (wait_response(bus, path, g_wait_s, NULL, 0) != 0) return 1; /* 4. OpenPipeWireRemote — devuelve un FD, no un path. Es la prueba final de que hay demonio: * sin pipewire corriendo, el backend no tiene remoto que abrir. */ @@ -387,7 +399,7 @@ static int do_screenshot(DBusConnection *bus) opt_bool(&arr, "interactive", FALSE); dbus_message_iter_close_container(&it, &arr); if (!call_request(bus, m, "Screenshot")) return 1; - return wait_response(bus, path, 60, NULL, 0) == 0 ? 0 : 1; + return wait_response(bus, path, g_wait_s, NULL, 0) == 0 ? 0 : 1; } int main(int argc, char **argv) @@ -398,6 +410,7 @@ int main(int argc, char **argv) if (!strcmp(argv[i], "--multiple")) multiple = 1; else if (!strcmp(argv[i], "--window")) window = 1; else if (!strcmp(argv[i], "--save")) save = 1; + else if (!strcmp(argv[i], "--wait") && i + 1 < argc) g_wait_s = atoi(argv[++i]); } DBusError err; dbus_error_init(&err); @@ -455,7 +468,7 @@ int main(int argc, char **argv) else if (!strcmp(cmd, "filechooser")) rc = do_filechooser(bus, save); else if (!strcmp(cmd, "screenshot")) rc = do_screenshot(bus); else { - fprintf(stderr, "uso: portal-probe {version|screencast|filechooser|screenshot} [--multiple|--window|--save]\n"); + fprintf(stderr, "uso: portal-probe {version|screencast|filechooser|screenshot} [--multiple|--window|--save] [--wait N]\n"); rc = 2; } printf("\n== portal-probe %s: %s ==\n", cmd, rc == 0 ? "OK" : "FALLÓ");