15.1.5 Получение информации о RPM окружении

Значительная часть конструкции системы RPM лежит в области системно-зависимых конфигураций. К системно-зависимым параметрам относится, например, информация о платформе, о совместимых платформах, о расположении различных файлов. Файлы настройки RPM - rc и macros поддерживают сотни опций, настраивающих RPM на определенную систему, и многие настройки не могут быть оставлены в значениях по умолчанию.

RPM программы на C нуждаются в доступе к системным настройкам RPM для проверки правильности установок, адекватных системной архитектуре и текущей инсталляции. Для запуска программы, системные установки должны быть считаны (возможно, из всех конфигурационных файлов). Для выполнения этой операции вызывается rpmReadConfigFiles :

int rpmReadConfigFiles(const char *files, const char *target);

Параметр files содержит разделенный двоеточиями список файлов, которые отвечают за системную конфигурацию. Параметр target содержит целевую платформу. Для использования установок по умолчанию достаточно, чтобы оба параметра имели значение NULL .

Функция rpmReadConfigFiles возвращает 0 в случае успеха и -1 в случае ошибки.

Единожды считав конфигурационные файлы, мы можем получить доступ к значениям переменных конфигурации, или, например, распечатать их.

15.1.5.1. Вывод конфигурации
Для вывода конфигурации используется rpmShowRC :

int rpmShowRC(FILE* output);

Чтобы задать выходной файл, устанавливается значение единственного параметра, например, для стандартного вывода:

rpmShowRC( stdout );

Функция rpmShowRC всегда возвращает 0.

Для контролирования вывода rpmShowRC и других библиотечных функций используют установку уровня многословности вывода с помощью функции rpmSetVerbosity :

rpmSetVerbosity(RPMMESS_NORMAL);

Возможные варианты многословности вывода:

Уровень

Что означает

RPMMESS_FATALERROR

Сообщения о критических ошибках и все не менее значимое

RPMMESS_ERROR

Сообщения об ошибках вообще и все не менее значимое

RPMMESS_WARNING

Все предупреждения и все не менее значимое

RPMMESS_QUIET

То же, что и RPMMESS_WARNING

RPMMESS_NORMAL

Только существенные сообщения

RPMMESS_VERBOSE

Все информационные сообщения

RPMMESS_DEBUG

Вся отладочная информация и все не менее значимое

Пример программы, использующей вышеописанные функции:

/* Show the rpmrc settings. */

#include <stdio.h>

#include <stdlib.h>

#include <rpmlib.h>

int main(int argc, char * argv[]) {

int status = rpmReadConfigFiles( (const char*) NULL,

(const char*) NULL);

if (status != 0) {

printf("Error reading RC files.\n");

exit(-1);

}

else {

printf("Read RC OK\n");

}

rpmSetVerbosity(RPMMESS_NORMAL);

rpmShowRC( stdout );

exit(0);
}

Скомпилируйте программу с помощью команды:

$ cc -I/usr/include/rpm -o rpm1 rpm1.c -lrpm -lrpmdb -lrpmio –lpopt

После запуска программы мы должны увидеть содержимое файлов конфигурации, выводимое на консоль.

15.1.5.2. Разворачивание значений макросов
В совокупности rc-файлы и файлы макросов содержат множество определений, которые можно использовать для обращения к значениям установок. Термин макроопределение или макрос используются потому, что значение может быть не просто строкой. Может быть макрос, ссылающийся на другие макросы, возможны и другие сложноподчиненные случаи. Базовый синтаксис макросов:

%name_of_macro

Например:

%_target

Множество макросов начинаются с нижнего подчеркивания.

Всегда можно раскрыть макрос с помощью команды rpm --eval :

$ rpm --eval %_target

i386-linux

Обратиться к значению макроса можно так:

%{_target}

Такой синтаксис облегчает задачу включения макросов в комбинации с обычным текстом и другими макросами.

15.1.5.2. Разворачивание макросов внутри кода
Для получения значения макроса в C-программе используют rpmExpand. Функция rpmExpand может развернуть один или несколько макросов, возвращая развернутое значение. Функции можно передать различное число параметров. Список должен быть инициализирован значением NULL .

char* rpmExpand (const char *arg,...);

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

Программа в примере ниже забирает из командной строки первый параметр и пытается его развернуть как макрос:

/* Show some macro settings. */

#include <stdio.h>

#include <stdlib.h>

#include <rpmlib.h>

#include <rpmmacro.h>

int main(int argc, char * argv[]) {

int status = rpmReadConfigFiles( (const char*) NULL,

(const char*) NULL);

if (status != 0) {

printf("Error reading RC files.\n");

exit(-1);

}

char* value = rpmExpand(argv[1], (const char*) NULL);

printf("Value of macro is [%s]\n", value);

exit(0);

}

Скомпилируйте программу как показано выше. При запуске после имени исполняемого файла введите имя макроса для разворачивания. Например:

$ ./rpmexpand %_target

Value of macro is [i386-linux]

Можно задать несколько имен макросов в связке:

$ ./rpmexpand %_builddir/%_target

Value of macro is [/usr/src/redhat/BUILD/i386-linux]

Для проверки работы программы можно использовать rpm --eval :

$ rpm --eval %_builddir/%_target

/usr/src/redhat/BUILD/i386-linux

Далее - Мощь popt
Назад - Компиляция и линковка RPM программ
Содержание