Структуры данных

str_list

Динамический список строк. Используется для всех массивных полей метаданных.

struct str_list {
    char **items;   // массив строк
    int count;      // количество элементов
};

Память каждого элемента принадлежит структуре. Освобождать через str_list_free. Массив не является null-terminated — для итерации использовать count.

for (int i = 0; i < meta->dependencies.count; i++) {
    printf("%s\n", meta->dependencies.items[i]);
}

package_metadata

Метаданные пакета. Соответствует содержимому meta.json.

struct package_metadata {
    char *name;
    char *version;
    char *type;
    char *architecture;
    char *description;
    char *maintainer;
    char *license;
    char *homepage;
    struct str_list tags;
    struct str_list dependencies;
    struct str_list conflicts;
    struct str_list provides;
    struct str_list replaces;
    struct str_list conf;
};

Соответствие полям meta.json

Поле структурыКлюч JSONОбязательное
namepackage.nameДа
versionpackage.versionДа
architecturepackage.architectureДа
typepackage.typeНет
descriptionpackage.descriptionНет
maintainerpackage.maintainerНет
licensepackage.licenseНет
homepagepackage.homepageНет
dependenciespackage.dependenciesНет
conflictspackage.conflictsНет
providespackage.providesНет
replacespackage.replacesНет
tagspackage.tagsНет
confpackage.confНет

package

Полное представление пакета APG.

struct package {
    struct package_metadata *meta;
    char *pkg_path;
    struct str_list package_files;
    bool installed_by_hand;
};
  • meta — метаданные из meta.json
  • pkg_path — путь к файлу .tar.xz
  • package_files — список всех файлов в архиве
  • installed_by_handtrue если пакет установлен пользователем напрямую, false если как зависимость

config

Конфигурация системы управления пакетами.

typedef enum {
    HTTP,
    FTP,
    RSYNC,
} repo_type;

typedef struct {
    const char *url;
    repo_type type;
} repo;

typedef struct {
    int db_size;
    char *tmp_dir;
    int repo_count;
    repo *repos;
} config;
  • db_size — размер базы данных в байтах
  • tmp_dir — директория для временных файлов (по умолчанию /tmp/apg/)
  • repos — массив из repo_count репозиториев

Контексты хеширования

Используются внутри функций вычисления хешей. Обычно не нужны напрямую — вместо них удобнее compute_sha256, compute_md5.

struct sha256_ctx {
    uint32_t state[8];
    uint64_t count;
    uint8_t buf[64];
};

struct md5_ctx {
    uint32_t state[4];
    uint32_t count[2];
    uint8_t buf[64];
};