Skip to content
idleboxedPublic

About

Bounded local IPC and shared Linux types for iman and IGUI

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Latest commit

 

History

7 Commits

Folders and files

Repository files navigation

imanlib

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-источники доступны с feature input;
  • 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 и параметры конкретной команды.

Контракт IPC

  • Кадр — четырёхбайтовая длина в 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-features

GitHub Actions запускает тот же набор на Ubuntu с Rust 1.85.0 и текущей stable при push, pull request и ручном запуске. Тесты используют /proc, tmpfs в /dev/shm и локальные Unix-сокеты, без оборудования и соседних приложений. Профили тестов локальные; сохранённые HID-записи отдельно описаны в происхождении образцов. Проверки evdev receiver, валидации профилей и Surface используют собственные синтетические данные, без ресурсов IGUI. Проверки не подтверждают работу на ARM-устройстве. Зависимости зафиксированы в Cargo.lock; автоматической публикации нет.

Лицензия

BSD-3-Clause.

About

Bounded local IPC and shared Linux types for iman and IGUI

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages