imanlib — Rust-библиотека локального IPC для iman, IGUI и других процессов
Linux: ограниченный JSON-протокол, неблокирующие Unix-сокеты, клиент, сервер,
общие GUI- и диагностические типы, опциональные примитивы дисплея и ввода.
Библиотека не запускает процессы, не опрашивает устройства в фоне и не определяет
политику записи на SD.
protocol,transport,clientиserver— обмен сообщениями;igui— состояния, параметры и результаты GUI-команд;igui_iman_stub— частичная тестовая заглушка, не замена менеджеру сеанса iman;input— логические кнопки и операции над их состоянием, без открытия устройств и дополнительных зависимостей;metricsиfilesystem— ограниченное чтение procfs и запрос сведений о файловой системе по дескриптору;evdev— метаданные устройств, разбор input_event и расчёт индексов кнопок RetroArch; read-only Linux-источники доступны с featureinput;display_metricsиinput_metrics— типы и накопители показателей.
Опциональные модули:
graphics—surface, пиксельный буфер для рендеринга;drm—kms, DRM/KMS backend, выбор маршрута, framebuffer, переключение кадров и освобождение ресурсов;rgb565включает формат RGB565,drm-diagnostics— измерения операций;- feature
input—controls,gamepad,hidиinput_probe: профили, read-only источники, арбитраж приёмников и модель теста контроллеров. Эта feature включаетgraphicsдля экрана теста.
По умолчанию эти features выключены. Библиотека не открывает устройства
автоматически и не содержит каталог игр, навигацию меню или менеджер процессов.
Приложение явно открывает ресурсы, вызывает опрос и выбирает момент освобождения.
Одноимённый модуль input доступен и без feature input: переключатель относится
к профилям и источникам устройств, а не к базовому состоянию кнопок.
Требуются Linux, Rust 1.85 или новее и Cargo. Серверу нужен существующий каталог
в tmpfs и доступный /proc/self/fd.
Подключите исходный каталог в Cargo.toml своего приложения; путь относителен
этому файлу. serde_json нужен для примера ниже:
[dependencies]
imanlib = { path = "../imanlib" }
serde_json = "1"Пример запроса к работающему iman или тестовой заглушке:
use imanlib::client::Client;
use serde_json::json;
use std::{io, path::Path};
fn capabilities(socket: &Path) -> io::Result<serde_json::Value> {
let mut client = Client::connect(socket)?;
client.value("core.capabilities", json!({}))
}call и value ожидают ответ до пяти секунд; value возвращает только результат
done. В неблокирующем цикле используйте send и poll.
Сервер также требует регулярного poll: приложение обрабатывает incoming
и errors, проверяет Request::valid и параметры конкретной команды.
- Кадр — четырёхбайтовая длина в big-endian и UTF-8 JSON. Запрос ограничен 16 КиБ, ответ или событие — 128 КиБ; учитывается всё тело JSON.
- Поля версии протокола нет. Неизвестные поля игнорируются; обязательные поля, типы и значения перечислений проверяются.
- ID запроса — положительный
u64, возрастающий в пределах соединения; повторные и меньшие ID отклоняются без повторного выполнения. - Сервер создаёт приватный сокет в tmpfs, проверяет UID клиента через
SO_PEERCREDи допускает до восьми соединений. Это не изоляция от других процессов того же пользователя. Исходящая очередь — до четырёх сообщений на соединение. acceptedподтверждает принятие операции, не завершение. Приdelivery_unknownдействие могло выполниться; автоматического повтора запросов и переподключения нет.
Из каталога библиотеки:
cargo test --locked
cargo test --locked --all-featuresGitHub Actions запускает тот же набор
на Ubuntu с Rust 1.85.0 и текущей stable при push, pull request и ручном запуске.
Тесты используют /proc, tmpfs в /dev/shm и локальные Unix-сокеты, без
оборудования и соседних приложений. Профили тестов локальные; сохранённые HID-записи
отдельно описаны в происхождении образцов.
Проверки evdev receiver,
валидации профилей и Surface
используют собственные синтетические данные, без ресурсов IGUI.
Проверки не подтверждают работу на ARM-устройстве.
Зависимости зафиксированы в Cargo.lock; автоматической публикации нет.