Обзор libapg

libapg — библиотека управления пакетами NurOS, написанная на C. Реализует полный жизненный цикл пакета: разбор, верификацию, установку и хранение в базе данных.

  • Версия: 1.1.0
  • Язык: C (C11)
  • Лицензия: GPL-3.0
  • Система сборки: Meson

Зависимости

БиблиотекаНазначение
libarchiveРаспаковка .tar.xz архивов
lmdbВстраиваемая база данных пакетов
yyjsonПарсинг и сериализация JSON
libgpgmeЦифровые подписи (предпочтительно)
libsodiumЦифровые подписи (fallback, Ed25519)

Архитектура

Библиотека состоит из независимых модулей:

libapg
├── package.h     — жизненный цикл объекта пакета
├── install.h     — установка файлов в систему
├── archive.h     — распаковка tar.xz через libarchive
├── db.h          — база данных установленных пакетов (LMDB)
├── json.h        — сериализация метаданных через yyjson
├── checksum.h    — проверка контрольных сумм
├── sha256.h      — хеширование SHA-256
├── md5.h         — хеширование MD5
├── crc32.h       — хеширование CRC32
├── sign.h        — цифровые подписи (GPGME / libsodium)
├── scripts.h     — выполнение install-скриптов
├── copy.h        — рекурсивное копирование файлов
├── config.h      — конфигурация системы
└── util.h        — вспомогательные функции

Процесс установки пакета

Вызов install_package выполняет следующую цепочку:

parse_package()
  └── unarchive_package()       # libarchive
  └── verify_checksums()        # sha256 / crc32 / md5
  └── run_script("pre-install") # scripts
  └── install_data_dir()        # copy → /
  └── install_home_dir()        # copy → $HOME
  └── run_script("post-install")
  └── add_package()             # lmdb

Структура пакета

Файл .tar.xz должен содержать:

package.tar.xz
├── meta.json          # метаданные (обязательно)
├── sha256sums         # или crc32sums, или md5sums
├── data/              # файлы → /
├── home/              # файлы → $HOME
└── scripts/
    ├── pre-install
    └── post-install

Компиляция программы с libapg

gcc -o myapp myapp.c $(pkg-config --cflags --libs libapg)

Соглашения об ошибках

Библиотека использует возвращаемые значения:

  • NULL — ошибка аллокации или объект не найден
  • false — ошибка выполнения операции
  • true — успех

Функции не бросают исключений и не завершают процесс при ошибках — вся обработка на стороне вызывающего кода.