blob: 49de4490972c4629503ca9643b7c068ecc7f255c [file] [log] [blame]
.TH XPAK 5 "Apr 2009" "Portage VERSION" "Portage"
.SH NAME
xpak \- The XPAK Data Format
.SH NOTES
.SS Data Types
.IP Integer
every offset or length(len) value in this documentation will be an unsigned
32bit integer in big endian byte order(32bit unsigned big int or uint32(big)
).
.IP String
All strings, mentioned in this documentation are ASCII encoded, and not
nullterminated
.IP Values
The actual values of the individual xpak entries are stored as Strings.
.P
.SS Vertical Bars
The vertical bars '|' are not part of the file format, they are merely used to
illustrate how the offset values apply to the data.
.SH SYNOPSIS
.IP tarball
|<-xpak_offset->|
.br
<tar>|< xpak >|<xpak_offset>"STOP"
.IP xpak
"XPAKPACK"<index_len><data_len><index><data>"XPAKSTOP"
.IP index
|<-------------index_len------------->|
.br
|<index1><index2><index3><index4><...>|
.IP indexN
|<-name_len->|
.br
<name_len>|< name >|<data_offset><data_len>
.IP data
|<--------------data_len------------->|
.br
|<-dataN_offset->|<-dataN_len->|
.br
|< data >|< data_N >|<data>|
.SH DETAILED
Every gentoo binary package has a xpak attached to it which contains build
time information like the use flags it was built with, the ebuild it was
built from, the environmental variables, CFLAGs, CXXFLAGs, ....
.SS xpak
If you look at a gentoo binary package (binpkg) with a hex-editor you'll
notice the behinf the data, which belongs to the tarball you find a binary
blob - the
.I xpak
, an offset which holds the bytes from the start of the
.I xpak
to the end of the file -
.I xpak_offset
and finally the String
.I "STOP".
|<xpak_offset>|
<tbz2>|<---xpak---->|<xpak_offset>"STOP"|
Here you see the
.I tbz2
archive, and the attached
.I xpak
blob, the
.I xpak-offset
and
the string
.I "STOP"
at the end.
If we read the offset value and count
.I offset
bytes backwards from the start of
.I xpak_offset
, we have found the start of the
.I xpak
Block which starts with the String
.I "XPAKPACK".
This xpak block consists of the string
.I "XPAKPACK"
, the length of the
.I index
block -
.I index-len
, the length of the data block -
.I data-len
, an
.I index-len
bytes long binary blob with the
.I index
, a
.I data-len
bytes long binary blob with the
.I data
and the string
.I "XPAKSTOP"
at the end:
|<index_len>|<data_len>|
"XPAKPACK"<index_len><data_len>|<--index-->|<--data-->|"XPAKSTOP"
To actually get the
.I index
and the
.I data
, we cut out
.I index_len
bytes after the end of
.I data_len
for the index block and then cut out the next
.I data_len
bytes for the data block. If we have done everything right up to this point,
the following bytes would be the ASCII formatted string
.I "XPAKSTOP"
.
The actual data is truncated into one big block - so if we want to read it we
need the actual positions of each information in this big data block, this
information can be obtained using the indices which are stored in the
.I index
block.
.SS Index block
The index block consists of several truncated index blocks:
|<-----------------------index_len---------------------->|
|<index1><index2><index3><index4><index5><index6><index7>|
The
.I index
block holds all information we need to find the data we want in the
.I data
block. It consists of truncated index elements with a length
.I index_len.
Each of those index elements stands for one information in the data block and
consists of the length of its name (
.I name_len>
), a
.I name_len
bytes long string (the Name of the data block), this index belongs to, the
offset of the
.I data
block (
.I data_offset
) and the length of that data block (
.I data_len
):
|<name_len>|
<name_len>|<--name-->|<dataN_offset><dataN_len>
.SS Data block
the data block contains truncated data blocks with a total length of
.I data_len
:
|<------------------------data_len------------------------>|
|<data1><data2><data3><data4><data5><data6><data7><data...>|
This binary block is
.I data_len
bytes long and consists of truncated data.
To select one data element, we need the
.I data_offset
and the
.I data_len
from
the
.I index
, if we have those we can count
.I data_offset
bytes from the start of the
.I data
block, and then cut out the next
.I data_len
bytes. there we got our data block:
|<-----dataN_offset----->|<--dataN_len->|
|<data1data2data3data...>|<data-we-want>|
.SH AUTHORS
Lars Hartmann <lars@chaotika.org>
.SH "SEE ALSO"
.BR qtbz2 (1),
.BR quickpkg (1),
.BR qxpak (1)