I'm doing a tar
like in C, and I've got a problem.
I just want to archive and unarchive files and diretories, so I operate this command: tar -cvf NAME.tar FILE1 [FILE2...]
Now I'm trying to get the header POSIX
of this archive :
struct posix_header
{ /* byte offset */
char name[100]; /* 0 */
char mode[8]; /* 100 */
char uid[8]; /* 108 */
char gid[8]; /* 116 */
char size[12]; /* 124 */
char mtime[12]; /* 136 */
char chksum[8]; /* 148 */
char typeflag; /* 156 */
char linkname[100]; /* 157 */
char magic[6]; /* 257 */
char version[2]; /* 263 */
char uname[32]; /* 265 */
char gname[32]; /* 297 */
char devmajor[8]; /* 329 */
char devminor[8]; /* 337 */
char prefix[155]; /* 345 */
/* 500 */
};
int main()
{
struct posix_header header;
int fd;
if ((fd = open("./obj.tar", O_RDONLY)) < 2) //open tarball
return (1);
read(fd, &header, 500); //fill struct
printf("%s\n", header.name);
close(fd);
}
but the output is always as ./PaxHeaders.NUMBER/FILE_NAME
.
When I try to open the archive in an editor, it shows a PaxHeader before each file.
What is PaxHeaders
? Is there a header added to be fully compatible with Pax? If there is, is it possible to remove them?
I'm a bit lost, do I have to parse them or jump after these headers?
POSIX.1 2008 defines an extension to the ustar format called the pax format. It's new features are introduced using special files with typeflag
set to x
for an extended pax header (affects the next file) or g
for a global pax header (affects all further files). These headers allow archiving programs to store additional attributes in tar files, like access time or extended length (to store file too large for conventional tar).
Space in this answer is too restricted to replicate the full specification, read POSIX for more details.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With