XPAK

НАЗВАНИЕ

xpak - формат данных XPAK, используемый в бинарных пакетах Portage

КРАТКОЕ ОПИСАНИЕ

К каждому бинарному пакету Gentoo прилагаются данные xpak, которые содержат различную информацию времени сборки - например, USE-флаги, с которыми пакет был скомпилирован, исходный ебилд, переменные окружения, значения переменных CFLAGS и CXXFLAGS и т.д.

ПРИМЕЧАНИЯ

Типы данных

Ниже описаны все рассматриваемые в данной документации случаи.

Целое число

Все отступы/длины являются беззнаковыми 32-разрядными целыми числами, с порядком следования байт от старшего к младшему.

Строка

Все строки в кодировке ASCII и не оканчиваются на NUL (кавычки - только для иллюстрации)

Значение

Текущие значения отдельных записей xpak хранятся как строки.

Вертикальная черта

Вертикальная черта '|' не является частью формата файла; она используется лишь для иллюстрации того, как значения отступа применяются к данным.

СИНТАКСИС

бинарный пакет (tbz2)

     |<-отступ_xpak->| 
<tar>|<    xpak     >|<отступ_xpak>"STOP" 

xpak

"XPAKPACK"<строка_индекса><строка_данных><индекс><данные>"XPAKSTOP" 

индекс

|<-------------строка_индекса------------->| 
|<индекс1><индекс2><индекс3><индекс4><...>| 

индексN

          |<-строка_имени->| 
<строка_имени>|<   имя   >|<отступ_данных><строка_данных> 

данные

|<--------------строка_данных------------->| 
|<-отступ_данныхN->|<-строка_данныхN->| 
|<     данные     >|<  данные_N   >|<данные>| 

ПОДРОБНОЕ ОПИСАНИЕ

xpak

Если вы рассмотрите любой бинарный пакет Gentoo с помощью шестнадцатиричного редактора, вы обнаружите, что он содержит собственно архив файлов, а далее бинарный блоб - xpak, отступ, содержащий байты от начала xpak'а до конца файла - отступ_xpak и, наконец, строку "STOP".

     |<отступ_xpak>| 
<tar>|<---xpak---->|<отступ_xpak>"STOP" 

В приведенном примере вы можете видеть архив tar, связанный с ним блоб_xpak, отступ_xpak и, в конце, строку "STOP". Эти метаданные не рассматриваются как часть xpak, а скорее как часть бинарного пакета.

Если мы возьмем значение оступа и отчитаем соответствующее ему количество байтов назад от начала отступа_xpak, то придем к блоку xpak, который начинается со строки "XPAKPACK".

Блок xpak состоит из строки "XPAKPACK", длины блока индекса (строка_индекса), длины блока данных (строка_данных), бинарный блоб строки_индекса, содержащий индекс, бинарный блоб строки_данных, содержащий данные, и строки "XPAKSTOP" в конце:

                               |<строка_индекса>|<строка_данных>| 
"XPAKPACK"<строка_индекса><строка_данных>|<--индекс-->|<--данные-->|"XPAKSTOP" 

Чтобы получить индекс и данные, мы отсекаем с конца строки_данных количество байт, соответствующее строке_индекса (блок индекса), а затем - байты, соответствующие следующей строке_данных (блок данных). Если мы всё сделали правильно, следующие байты будут представлять собой строку "XPAKSTOP" в формате ASCII.

Все данные сведены в один большой блок; таким образом, чтобы их считать, необходимо знать фактическое положение каждого фрагмента информации в этом блоке. Эту информацию можно получить с помощью индексов, хранящихся в блоке индекса.

Блок _индекса

Блок _индекса включает ряд индексов:

|<-----------------------строка_индексов---------------------->| 
|<индекс1><индекс2><индекс3><индекс4><индекс5><индекс6><индекс7>| 

Блок индекса содержит всю необходимую нам информацию для блока данных. Он содержит ряд отдельных индексов, которые все вместе составляют строку_индексов. Здесь нет разделения нулем или тому подобного.

Каждый из этих элементов соответствует фрагменту данных в блоке данных: строка имени этого блока (строка_имени), длина _строки_имени в байтах, оступ блока (отступ_данныхN) и длина блока (_строка_данныхN):

          |<строка_имени>| 
<строка_имени>|<--имя-->|<отступ_данныхN><строка_данныхN> 

Блок_данных

Блок_данных содержит ряд фрагментов данных, которые в сумме образуют строку_данных:

|<------------------------строка_данных------------------------>| 
|<данные1><данные2><данные3><данные4><данные5><данные6><данные7><данные...>| 

Для выбора одного элемента данных нам понадобится отступ_данных и строка_данных из индекса. Опираясь на них, мы можем рассчитать количество байтов в строке_данных от начала блока_данных, а затем отнять от них байты ближайшей следующей строки_данных. Тем самым мы получаем наш исходный блок данных:

|<-----отступ_данныхN----->|<--строка_данныхN->| 
|<данные1данные2данные3данные...>|<нужные_нам_данные>| 

ПРИМЕРЫ

Предположим, что у нас есть xpak, содержащий два фрагмента данных. Один из них именуется "file1" и содержит строку "ddDddDdd", а другой - "file2" и содержит строку "jjJjjJjj". Данные не содержат "STOP" или отступ_xpak, поскольку данный xpak не является частью бинарного пакета.

Вот вывод шестнадцатиричных данных (построчно):

00  58 50 41 4b 50 41 43 4b  00 00 00 20 00 00 00 10  |XPAKPACK... ....| 
10  00 00 00 04 66 69 6c 31  00 00 00 00 00 00 00 08  |....файл1........| 
20  00 00 00 04 66 69 6c 32  00 00 00 08 00 00 00 08  |....файл2........| 
30  64 64 44 64 64 44 64 64  6a 6a 4a 6a 6a 4a 6a 6a  |ddDddDddjjJjjJjj| 
40  58 50 41 4b 53 54 4f 50                           |XPAKSTOP| 

Строка_индекса имеет значение 32, а строка_данных - 16 (поскольку данные содержат 16 байт: "ddDddDdd" и "jjJjjJjj").

   |<------"XPAKPACK"----->||    32     |    16     | 
00  58 50 41 4b 50 41 43 4b  00 00 00 20 00 00 00 10 

А вот первый элемент индекса, значение строки_имени которого составляет 4, за ней идет строка "файл1", далее - отступ данных1 со значением 0 и данные1 со значением 8 (поскольку данные1 содержат 8 байт: "ddDddDdd"):

   |     4     |<--"файл1"->||отступ_данных1:0|строка_данных1:8| 
10  00 00 00 04 66 69 6c 31  00 00 00 00 00 00 00 08 

Теперь рассмотрим второй элемент индекса, со значением строки_индекса 4; за ней идет строка индекса "файл2", отступ_данных2 со значением 8 и данные2 со значением 8 (поскольку данные2 содержат 8 байт: "jjJjjJjj").

   |     4     |<--"файл2"->||отступ_данных2:8|строка_данных2:8| 
20  00 00 00 04 66 69 6c 32  00 00 00 08 00 00 00 08 

   |<------"XPAKSTOP"----->| 
40  58 50 41 4b 53 54 4f 50 

АВТОРЫ

СМ. ТАКЖЕ

qtbz2(1), quickpkg(1), qxpak(1)

ПЕРЕВОД

 
 

Октябрь 2011

Спасибо!