From ea210ba3cd40f20325eae1b7023db280814e734d Mon Sep 17 00:00:00 2001 From: sergio Date: Wed, 5 Aug 2026 10:25:55 -0400 Subject: [PATCH] =?UTF-8?q?=F0=9F=94=8C=20portal-probe:=20activar=20el=20p?= =?UTF-8?q?ortal=20en=20vez=20de=20exigirlo=20presente?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bug que la propia sonda destapó al usarla: los portales son servicios ACTIVABLES por D-Bus, no demonios siempre presentes — el bus los arranca cuando alguien los pide, leyendo su `.service`. `NameHasOwner` NO dispara esa activación, sólo pregunta. Costó una corrida entera de diagnóstico: la sonda dijo "nadie posee org.freedesktop.portal.Desktop — no hay frontend de portal en el bus" sobre un sistema donde el portal andaba perfecto, sólo que dormido. Ahora pide `StartServiceByName` y deja que el bus decida. Si de verdad falta el `.service`, falla con ServiceUnknown y ahí el diagnóstico sí es real; y distingue "arrancado ahora" de "ya estaba corriendo", que no es lo mismo cuando lo que se investiga es una carrera de arranque. Co-Authored-By: Claude Opus 5 (1M context) --- tools/portal-probe/portal-probe.c | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/tools/portal-probe/portal-probe.c b/tools/portal-probe/portal-probe.c index 2b843525..3fc08c96 100644 --- a/tools/portal-probe/portal-probe.c +++ b/tools/portal-probe/portal-probe.c @@ -418,9 +418,26 @@ int main(int argc, char **argv) printf("bus de sesión OK · nombre único %s · sender para el path del Request: %s\n", uniq ? uniq : "?", g_sender); + /* Los portales son servicios ACTIVABLES por D-Bus, no demonios siempre presentes: el bus los + * arranca cuando alguien los pide, leyendo su fichero `.service`. `NameHasOwner` NO dispara esa + * activación — sólo pregunta— así que rechazar ahí es un falso negativo cada vez que el portal + * está simplemente dormido. Costó una corrida entera de diagnóstico: la sonda dijo «no hay + * frontend de portal en el bus» sobre un sistema donde el portal andaba perfecto. + * + * Lo correcto es pedir la activación y dejar que el bus decida. Si de verdad no hay `.service`, + * StartServiceByName falla con ServiceUnknown y ahí sí el diagnóstico es real. */ if (!dbus_bus_name_has_owner(bus, PORTAL_BUS, &err)) { - printf("!! nadie posee %s — no hay frontend de portal en el bus\n", PORTAL_BUS); - return 3; + printf("%s dormido — pidiendo activación por D-Bus…\n", PORTAL_BUS); + dbus_error_free(&err); + dbus_error_init(&err); + dbus_uint32_t res = 0; + if (!dbus_bus_start_service_by_name(bus, PORTAL_BUS, 0, &res, &err)) { + printf("!! no se pudo activar %s: %s: %s\n", PORTAL_BUS, + err.name ? err.name : "?", err.message ? err.message : "?"); + return 3; + } + printf(" activado (%s)\n", + res == DBUS_START_REPLY_SUCCESS ? "arrancado ahora" : "ya estaba corriendo"); } puts("portal presente en el bus\n");