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 Definitions

🔌 portal-probe: activar el portal en vez de exigirlo presente

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) <noreply@anthropic.com>

ea210ba3cd40f20325eae1b7023db280814e734d · by sergio · (2 months ago) · parent b77cc68a9 · browse the tree at this commit

Semantic delta · 1

tools/portal-probe/portal-probe.c

  • body changed def main pub

1 files · +19 −2

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");