Обзор 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— успех
Функции не бросают исключений и не завершают процесс при ошибках — вся обработка на стороне вызывающего кода.