Repaso de los 11 shims restantes buscando métodos que devolvían éxito
sin hacer el trabajo (como los dos setters de localed). Resultado:
timedated — tres setters arreglados de verdad:
- SetTime: aplica el reloj con clock_settime(CLOCK_REALTIME) en vez de
sólo loggear; si falla (sin CAP_SYS_TIME) devuelve error honesto.
- SetLocalRTC: escribe la tercera línea de /etc/adjtime (UTC|LOCAL),
conservando las dos primeras.
- SetNTP: arje no gestiona un daemon NTP — en vez de fingir éxito,
rechaza honestamente; `CanNTP` pasa a `false` para que GNOME deje el
toggle deshabilitado y ni llegue a llamarlo.
systemd1 — StopUnit/RestartUnit/KillUnit dejaban creer que habían
detenido la unit; ahora devuelven NotSupported honesto (como StartUnit).
Lo demás del repaso ya era honesto: resolved/machined devuelven
NotSupported de frente; polkit/tmpfiles/notify/binfmt/journald no
mienten. timer-compat queda como hueco conocido y autodocumentado (sus
timers disparan pero el spawn es un no-op a la espera del bus).
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
`Inhibit` dejó de ser un stub que devolvía NotSupported. Ahora cumple
el contrato de systemd-logind:
- Crea un pipe; el cliente recibe el extremo de escritura, el shim
conserva el de lectura. Mientras el cliente no cierre su fd, el
inhibidor sigue activo; al cerrarlo —o morir— el shim ve EOF y una
tarea guardiana lo retira de la tabla.
- Tabla de inhibidores activos + método `ListInhibitors`.
- Las propiedades `BlockInhibited` / `DelayInhibited` ahora reflejan
los inhibidores reales (tokens únicos del modo, unidos por `:`),
en vez de devolver siempre vacío.
Es lo que GNOME/KDE usan para frenar la suspensión automática durante
una presentación o una descarga. 1 test (`inhibited_what`).
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
El hallazgo del repaso del monorepo: la capa compat (14 shims D-Bus de
systemd) era lo más incompleto relativo a su peso — load-bearing para
correr GNOME/KDE sobre arje, y con CERO tests. Cada shim copiaba su
propio `atomic_write`, su parseo `KEY=value` y sus validadores.
Primer golpe:
- `arje-compat-common`: crate nuevo con la lógica pura compartida
(atomic_write, parse_kv, merge_kv, conf_entries, is_valid_hostname),
cubierta con 8 tests. Antes esa lógica vivía duplicada y sin un test.
- `arje-hostnamed-compat` y `arje-localed-compat` migrados al núcleo —
quedan más finos y su lógica pasa a estar cubierta.
- localed: los dos setters que eran stub (sólo loggeaban) ahora
escriben de verdad — `SetVConsoleKeymap` → /etc/vconsole.conf,
`SetX11Keyboard` → 00-keyboard.conf. + 2 tests propios.
- Bug corregido de paso: el parser xorg de localed devolvía el NOMBRE
de la opción en vez del valor (tomaba la 1ª comilla); ahora toma la
2ª cadena, la correcta.
Compat: de 0 a 10 tests. Quedan 12 shims con la misma migración
mecánica pendiente; el plato fuerte real es `Inhibit` en logind.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>