15.3.3 Чтение хэдера

Информация, заключенная в хэдере, содержит имя пакета, версию, пост- и пре-инсталляционные скрипты, и тому подобные данные. Для чтения содержания хэдера вызывается headerRead. В случае успеха функция возвращает так называемый объект хэдера. Из объекта можно читать значения переменных.

Header headerRead(FD_t fd,

enum hMagic magicp);

Наиболее сложным в вызове headerRead является необходимость передачи в функцию флага "магического" числа. Этот флаг должен иметь значение HEADER_MAGIC_YES если хэдер имеет набор магических чисел, или HEADER_MAGIC_NO - если не имеет. Если предположение о нужном значении флага было неверным, функция вернет ошибку. Для обхода этой проблемы можно получить старший номер версии RPM из начального идентификатора для сравнения:

Header header = headerRead(fd, (lead.major >= 3) ?

HEADER_MAGIC_YES : HEADER_MAGIC_NO);

Для чтения значений переменных из хэдера используют headerGetEntry. В ее вызове нужно передать объект хэдера и идентификатор поля. В результате функция вернет тип поля, указатель на значения поля, и счетчик значений в этом поле.

nt headerGetEntry(Header header,

int_32 tag,

hTYP_t type,

void **pointer,

hCNT_t data_size);

headerGetEntry возвращает 1 в случае успеха и 0 в случае ошибки. В случае успеха указатель будет указывать на полученные данные с типом параметра, установленным в одно из значений:

enum rpmTagType_e {

RPM_NULL_TYPE = 0,

RPM_CHAR_TYPE = 1,

RPM_INT8_TYPE = 2,

RPM_INT16_TYPE = 3,

RPM_INT32_TYPE = 4,

RPM_STRING_TYPE = 6,

RPM_BIN_TYPE = 7,

RPM_STRING_ARRAY_TYPE = 8,

RPM_I18NSTRING_TYPE

}

Если тип оказался RPM_STRING_ARRAY_TYPE или RPM_BIN_TYPE, потребуется освободить указатель, для чего вызывается headerFreeData:

void* headerFreeData(const void *pointer,

rpmTagType type);

Для передачи нам нужны указатель на данные и флаг типа. Можно вызвать headerFreeData для обоих. Функция не делает ничего, если тип не требует освобождения указателя.

Вызывая headerGetEntry, мы должны знать имя поля, из которого хотим получить значения. Это имя является идентификатором для --queryformat. Заголовочный файл rpmlib.h содержит список имен полей.

Пример ниже показывает, как можно получить запись строкового типа из хэдера:

/* Function to read a string header entry. */

char* readHeaderString(Header header, int_32 tag_id) {

int_32 type;

void* pointer;

int_32 data_size;

int header_status = headerGetEntry(header,

tag_id,

&type,

&pointer,

&data_size);

if (header_status) {

if (type == RPM_STRING_TYPE) {

return pointer;

}

}

return NULL;

}

Для чтения значений из поля передаем объект хэдера и ID поля. Например:

char* name = readHeaderString(header, RPMTAG_NAME);

char* version = readHeaderString(header, RPMTAG_VERSION);

char* release = readHeaderString(header, RPMTAG_RELEASE);

Для получения имени, версии и релиза можно вызвать функцию headerNVR:

int headerNVR(Header header,

const char **nameptr,

const char **versionptr,

const char **releaseptr);

Когда все нужные значения считаны, следует освободить память, занимаемую объектом хэдера:

Header headerFree(Header header);

Вызов headerFree возвращает NULL, это можно использовать для установки исходного указателя в NULL во избежании случайного использования. Например:

header = headerFree(header);

Далее - Короткий путь к информации хэдера
Назад - Чтение начального идентификатора rpm и сигнатуры
Содержание