🔌 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>
This commit is contained in:
@@ -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");
|
||||
|
||||
|
||||
Reference in New Issue
Block a user