Lines Matching defs:tar

51  * Layout of POSIX 'ustar' tar header.
73 * Structure of GNU tar header
119 struct tar {
159 static int gnu_add_sparse_entry(struct archive_read *, struct tar *,
162 static void gnu_clear_sparse_list(struct tar *);
163 static int gnu_sparse_old_read(struct archive_read *, struct tar *,
165 static int gnu_sparse_old_parse(struct archive_read *, struct tar *,
167 static int gnu_sparse_01_parse(struct archive_read *, struct tar *,
169 static ssize_t gnu_sparse_10_read(struct archive_read *, struct tar *,
171 static int header_Solaris_ACL(struct archive_read *, struct tar *,
173 static int header_common(struct archive_read *, struct tar *,
175 static int header_old_tar(struct archive_read *, struct tar *,
177 static int header_pax_extensions(struct archive_read *, struct tar *,
179 static int header_pax_global(struct archive_read *, struct tar *,
181 static int header_longlink(struct archive_read *, struct tar *,
183 static int header_longname(struct archive_read *, struct tar *,
185 static int read_mac_metadata_blob(struct archive_read *, struct tar *,
187 static int header_volume(struct archive_read *, struct tar *,
189 static int header_ustar(struct archive_read *, struct tar *,
191 static int header_gnutar(struct archive_read *, struct tar *,
203 static int pax_attribute(struct archive_read *, struct tar *,
205 static int pax_header(struct archive_read *, struct tar *,
208 static ssize_t readline(struct archive_read *, struct tar *, const char **,
210 static int read_body_to_string(struct archive_read *, struct tar *,
212 static int solaris_sparse_parse(struct archive_read *, struct tar *,
218 static int tar_read_header(struct archive_read *, struct tar *,
238 struct tar *tar;
244 tar = (struct tar *)calloc(1, sizeof(*tar));
245 if (tar == NULL) {
247 "Can't allocate tar data");
251 r = __archive_read_register_format(a, tar, "tar",
261 free(tar);
268 struct tar *tar;
270 tar = (struct tar *)(a->format->data);
271 gnu_clear_sparse_list(tar);
272 archive_string_free(&tar->acl_text);
273 archive_string_free(&tar->entry_pathname);
274 archive_string_free(&tar->entry_pathname_override);
275 archive_string_free(&tar->entry_linkpath);
276 archive_string_free(&tar->entry_uname);
277 archive_string_free(&tar->entry_gname);
278 archive_string_free(&tar->line);
279 archive_string_free(&tar->pax_global);
280 archive_string_free(&tar->pax_header);
281 archive_string_free(&tar->longname);
282 archive_string_free(&tar->longlink);
283 archive_string_free(&tar->localname);
284 free(tar);
328 /* Recognize GNU tar format. */
366 struct tar *tar;
369 tar = (struct tar *)(a->format->data);
372 tar->compat_2x = (val != NULL)?1:0;
373 tar->init_default_conversion = tar->compat_2x;
378 "tar: hdrcharset option needs a character-set name");
380 tar->opt_sconv =
383 if (tar->opt_sconv != NULL)
429 * When converting tar archives to cpio archives, it is
432 * assign fake dev/inode numbers to each tar entry. Note that
440 * obscure tar->cpio conversion case.
444 struct tar *tar;
458 tar = (struct tar *)(a->format->data);
459 tar->entry_offset = 0;
460 gnu_clear_sparse_list(tar);
461 tar->realsize = -1; /* Mark this as "unset" */
464 tar->sconv = tar->opt_sconv;
465 if (tar->sconv == NULL) {
466 if (!tar->init_default_conversion) {
467 tar->sconv_default =
469 tar->init_default_conversion = 1;
471 tar->sconv = tar->sconv_default;
474 r = tar_read_header(a, tar, entry, &unconsumed);
482 if (tar->sparse_list == NULL) {
483 if (gnu_add_sparse_entry(a, tar, 0, tar->entry_bytes_remaining)
489 for (sb = tar->sparse_list; sb != NULL; sb = sb->next) {
499 * directory: This is needed for certain old tar
527 struct tar *tar;
530 tar = (struct tar *)(a->format->data);
534 while (tar->sparse_list != NULL &&
535 tar->sparse_list->remaining == 0) {
536 p = tar->sparse_list;
537 tar->sparse_list = p->next;
541 if (tar->entry_bytes_unconsumed) {
542 __archive_read_consume(a, tar->entry_bytes_unconsumed);
543 tar->entry_bytes_unconsumed = 0;
547 if (tar->sparse_list == NULL ||
548 tar->entry_bytes_remaining == 0) {
549 if (__archive_read_consume(a, tar->entry_padding) < 0)
551 tar->entry_padding = 0;
554 *offset = tar->realsize;
563 "Truncated tar archive");
566 if (bytes_read > tar->entry_bytes_remaining)
567 bytes_read = (ssize_t)tar->entry_bytes_remaining;
570 if (tar->sparse_list->remaining < bytes_read)
571 bytes_read = (ssize_t)tar->sparse_list->remaining;
573 *offset = tar->sparse_list->offset;
574 tar->sparse_list->remaining -= bytes_read;
575 tar->sparse_list->offset += bytes_read;
576 tar->entry_bytes_remaining -= bytes_read;
577 tar->entry_bytes_unconsumed = bytes_read;
579 if (!tar->sparse_list->hole)
591 struct tar* tar;
593 tar = (struct tar *)(a->format->data);
597 for (p = tar->sparse_list; p != NULL; p = p->next) {
601 if (request > tar->entry_bytes_remaining)
602 request = tar->entry_bytes_remaining;
603 request += tar->entry_padding + tar->entry_bytes_unconsumed;
609 tar->entry_bytes_remaining = 0;
610 tar->entry_bytes_unconsumed = 0;
611 tar->entry_padding = 0;
614 gnu_clear_sparse_list(tar);
624 tar_read_header(struct archive_read *a, struct tar *tar,
645 "Truncated tar archive");
660 a->archive.archive_format_name = "tar";
674 archive_set_error(&a->archive, EINVAL, "Damaged tar archive");
678 if (++tar->header_recursion_depth > 32) {
688 case 'A': /* Solaris tar ACL */
690 a->archive.archive_format_name = "Solaris tar";
691 err = header_Solaris_ACL(a, tar, entry, h, unconsumed);
696 err = header_pax_global(a, tar, entry, h, unconsumed);
698 case 'K': /* Long link name (GNU tar, others) */
699 err = header_longlink(a, tar, entry, h, unconsumed);
701 case 'L': /* Long filename (GNU tar, others) */
702 err = header_longname(a, tar, entry, h, unconsumed);
705 err = header_volume(a, tar, entry, h, unconsumed);
707 case 'X': /* Used by SUN tar; same as 'x'. */
711 err = header_pax_extensions(a, tar, entry, h, unconsumed);
716 err = header_pax_extensions(a, tar, entry, h, unconsumed);
722 a->archive.archive_format_name = "GNU tar format";
723 err = header_gnutar(a, tar, entry, h, unconsumed);
729 err = header_ustar(a, tar, entry, h);
732 a->archive.archive_format_name = "tar (non-POSIX)";
733 err = header_old_tar(a, tar, entry, h);
744 --tar->header_recursion_depth;
751 tar->header_recursion_depth == 0) {
752 int err2 = read_mac_metadata_blob(a, tar, entry, h, unconsumed);
759 if (tar->sparse_gnu_pending) {
760 if (tar->sparse_gnu_major == 1 &&
761 tar->sparse_gnu_minor == 0) {
764 tar->sparse_gnu_pending = 0;
766 bytes_read = gnu_sparse_10_read(a, tar, unconsumed);
767 tar->entry_bytes_remaining -= bytes_read;
776 tar->sparse_gnu_pending = 0;
782 archive_set_error(&a->archive, EINVAL, "Damaged tar archive");
817 * was created by an old BSD, Solaris, or HP-UX tar with a
851 header_Solaris_ACL(struct archive_read *a, struct tar *tar,
866 err = read_body_to_string(a, tar, &(tar->acl_text), h, unconsumed);
871 err = tar_read_header(a, tar, entry, unconsumed);
881 p = acl = tar->acl_text.s;
927 if (tar->sconv_acl == NULL) {
928 tar->sconv_acl = archive_string_conversion_from_charset(
930 if (tar->sconv_acl == NULL)
933 archive_strncpy(&(tar->localname), acl, p - acl);
935 tar->localname.s, ARCHIVE_ENTRY_ACL_TYPE_ACCESS, tar->sconv_acl);
951 header_longlink(struct archive_read *a, struct tar *tar,
956 err = read_body_to_string(a, tar, &(tar->longlink), h, unconsumed);
959 err = tar_read_header(a, tar, entry, unconsumed);
963 archive_entry_copy_link(entry, tar->longlink.s);
986 header_longname(struct archive_read *a, struct tar *tar,
991 err = read_body_to_string(a, tar, &(tar->longname), h, unconsumed);
995 err = tar_read_header(a, tar, entry, unconsumed);
998 if (archive_entry_copy_pathname_l(entry, tar->longname.s,
999 archive_strlen(&(tar->longname)), tar->sconv) != 0)
1000 err = set_conversion_failed_error(a, tar->sconv, "Pathname");
1006 * Interpret 'V' GNU tar volume header.
1009 header_volume(struct archive_read *a, struct tar *tar,
1015 return (tar_read_header(a, tar, entry, unconsumed));
1022 read_body_to_string(struct archive_read *a, struct tar *tar,
1029 (void)tar; /* UNUSED */
1071 header_common(struct archive_read *a, struct tar *tar,
1080 archive_strncpy(&(tar->entry_linkpath),
1083 archive_string_empty(&(tar->entry_linkpath));
1090 tar->entry_bytes_remaining = tar_atol(header->size, sizeof(header->size));
1091 if (tar->entry_bytes_remaining < 0) {
1092 tar->entry_bytes_remaining = 0;
1097 tar->realsize = tar->entry_bytes_remaining;
1098 archive_entry_set_size(entry, tar->entry_bytes_remaining);
1101 /* Handle the tar type flag appropriately. */
1106 if (archive_entry_copy_hardlink_l(entry, tar->entry_linkpath.s,
1107 archive_strlen(&(tar->entry_linkpath)), tar->sconv) != 0) {
1108 err = set_conversion_failed_error(a, tar->sconv,
1114 * The following may seem odd, but: Technically, tar
1126 * A tricky point: Traditionally, tar readers have
1146 /* Old-style or GNU tar: we must ignore the size. */
1148 tar->entry_bytes_remaining = 0;
1157 tar->entry_bytes_remaining = 0;
1165 * a body containing an uncompressed tar archive.
1173 tar->entry_bytes_remaining = 0;
1174 if (archive_entry_copy_symlink_l(entry, tar->entry_linkpath.s,
1175 archive_strlen(&(tar->entry_linkpath)), tar->sconv) != 0) {
1176 err = set_conversion_failed_error(a, tar->sconv,
1185 tar->entry_bytes_remaining = 0;
1190 tar->entry_bytes_remaining = 0;
1195 tar->entry_bytes_remaining = 0;
1200 tar->entry_bytes_remaining = 0;
1236 tar->sparse_allowed = 1;
1250 * Parse out header elements for "old-style" tar archives.
1253 header_old_tar(struct archive_read *a, struct tar *tar,
1262 header->name, sizeof(header->name), tar->sconv) != 0) {
1263 err = set_conversion_failed_error(a, tar->sconv, "Pathname");
1269 err2 = header_common(a, tar, entry, h);
1273 tar->entry_padding = 0x1ff & (-tar->entry_bytes_remaining);
1282 read_mac_metadata_blob(struct archive_read *a, struct tar *tar,
1345 return (tar_read_header(a, tar, entry, unconsumed));
1352 header_pax_global(struct archive_read *a, struct tar *tar,
1357 err = read_body_to_string(a, tar, &(tar->pax_global), h, unconsumed);
1360 err = tar_read_header(a, tar, entry, unconsumed);
1365 header_pax_extensions(struct archive_read *a, struct tar *tar,
1370 err = read_body_to_string(a, tar, &(tar->pax_header), h, unconsumed);
1375 err = tar_read_header(a, tar, entry, unconsumed);
1389 err2 = pax_header(a, tar, entry, tar->pax_header.s);
1391 tar->entry_padding = 0x1ff & (-tar->entry_bytes_remaining);
1401 header_ustar(struct archive_read *a, struct tar *tar,
1411 as = &(tar->entry_pathname);
1421 tar->sconv) != 0) {
1422 err = set_conversion_failed_error(a, tar->sconv, "Pathname");
1428 r = header_common(a, tar, entry, h);
1436 header->uname, sizeof(header->uname), tar->sconv) != 0) {
1437 err = set_conversion_failed_error(a, tar->sconv, "Uname");
1443 header->gname, sizeof(header->gname), tar->sconv) != 0) {
1444 err = set_conversion_failed_error(a, tar->sconv, "Gname");
1457 tar->entry_padding = 0x1ff & (-tar->entry_bytes_remaining);
1469 pax_header(struct archive_read *a, struct tar *tar,
1480 tar->pax_hdrcharset_binary = 0;
1481 archive_string_empty(&(tar->entry_gname));
1482 archive_string_empty(&(tar->entry_linkpath));
1483 archive_string_empty(&(tar->entry_pathname));
1484 archive_string_empty(&(tar->entry_pathname_override));
1485 archive_string_empty(&(tar->entry_uname));
1548 err2 = pax_attribute(a, tar, entry, key, value);
1567 if (tar->pax_hdrcharset_binary)
1568 sconv = tar->opt_sconv;
1574 if (tar->compat_2x)
1579 if (archive_strlen(&(tar->entry_gname)) > 0) {
1580 if (archive_entry_copy_gname_l(entry, tar->entry_gname.s,
1581 archive_strlen(&(tar->entry_gname)), sconv) != 0) {
1586 archive_entry_copy_gname(entry, tar->entry_gname.s);
1589 if (archive_strlen(&(tar->entry_linkpath)) > 0) {
1590 if (archive_entry_copy_link_l(entry, tar->entry_linkpath.s,
1591 archive_strlen(&(tar->entry_linkpath)), sconv) != 0) {
1596 archive_entry_copy_link(entry, tar->entry_linkpath.s);
1609 if (archive_strlen(&(tar->entry_pathname_override)) > 0)
1610 as = &(tar->entry_pathname_override);
1611 else if (archive_strlen(&(tar->entry_pathname)) > 0)
1612 as = &(tar->entry_pathname);
1623 if (archive_strlen(&(tar->entry_uname)) > 0) {
1624 if (archive_entry_copy_uname_l(entry, tar->entry_uname.s,
1625 archive_strlen(&(tar->entry_uname)), sconv) != 0) {
1630 archive_entry_copy_uname(entry, tar->entry_uname.s);
1683 pax_attribute(struct archive_read *a, struct tar *tar,
1699 !tar->sparse_allowed) {
1707 tar->sparse_offset = -1;
1708 tar->sparse_numbytes = -1;
1709 tar->sparse_gnu_major = 0;
1710 tar->sparse_gnu_minor = 0;
1713 tar->sparse_offset = tar_atol10(value, strlen(value));
1714 if (tar->sparse_numbytes != -1) {
1715 if (gnu_add_sparse_entry(a, tar,
1716 tar->sparse_offset, tar->sparse_numbytes)
1719 tar->sparse_offset = -1;
1720 tar->sparse_numbytes = -1;
1724 tar->sparse_numbytes = tar_atol10(value, strlen(value));
1725 if (tar->sparse_numbytes != -1) {
1726 if (gnu_add_sparse_entry(a, tar,
1727 tar->sparse_offset, tar->sparse_numbytes)
1730 tar->sparse_offset = -1;
1731 tar->sparse_numbytes = -1;
1735 tar->realsize = tar_atol10(value, strlen(value));
1736 archive_entry_set_size(entry, tar->realsize);
1741 tar->sparse_gnu_major = 0;
1742 tar->sparse_gnu_minor = 1;
1743 if (gnu_sparse_01_parse(a, tar, value) != ARCHIVE_OK)
1749 tar->sparse_gnu_major = (int)tar_atol10(value, strlen(value));
1750 tar->sparse_gnu_pending = 1;
1753 tar->sparse_gnu_minor = (int)tar_atol10(value, strlen(value));
1754 tar->sparse_gnu_pending = 1;
1759 * files, GNU tar puts a synthesized name into
1763 archive_strcpy(&(tar->entry_pathname_override), value);
1766 tar->realsize = tar_atol10(value, strlen(value));
1767 archive_entry_set_size(entry, tar->realsize);
1787 if (tar->sconv_acl == NULL) {
1788 tar->sconv_acl =
1791 if (tar->sconv_acl == NULL)
1797 tar->sconv_acl);
1811 if (tar->sconv_acl == NULL) {
1812 tar->sconv_acl =
1815 if (tar->sconv_acl == NULL)
1821 tar->sconv_acl);
1852 tar->realsize = tar_atol10(value, strlen(value));
1853 archive_entry_set_size(entry, tar->realsize);
1856 r = solaris_sparse_parse(a, tar, entry, value);
1888 archive_strcpy(&(tar->entry_gname), value);
1895 tar->pax_hdrcharset_binary = 1;
1897 tar->pax_hdrcharset_binary = 0;
1903 archive_strcpy(&(tar->entry_linkpath), value);
1914 archive_strcpy(&(tar->entry_pathname), value);
1925 tar->entry_bytes_remaining
1935 if (tar->realsize < 0) {
1937 tar->entry_bytes_remaining);
1938 tar->realsize
1939 = tar->entry_bytes_remaining;
1948 archive_strcpy(&(tar->entry_uname), value);
2008 * Parse GNU tar header
2011 header_gnutar(struct archive_read *a, struct tar *tar,
2024 /* Grab fields common to all tar variants. */
2025 err = header_common(a, tar, entry, h);
2032 header->name, sizeof(header->name), tar->sconv) != 0) {
2033 err = set_conversion_failed_error(a, tar->sconv, "Pathname");
2040 * to ustar and gnu tar? Is it okay to move it down into
2043 header->uname, sizeof(header->uname), tar->sconv) != 0) {
2044 err = set_conversion_failed_error(a, tar->sconv, "Uname");
2050 header->gname, sizeof(header->gname), tar->sconv) != 0) {
2051 err = set_conversion_failed_error(a, tar->sconv, "Gname");
2065 tar->entry_padding = 0x1ff & (-tar->entry_bytes_remaining);
2076 tar->realsize
2078 archive_entry_set_size(entry, tar->realsize);
2082 if (gnu_sparse_old_read(a, tar, header, unconsumed)
2095 gnu_add_sparse_entry(struct archive_read *a, struct tar *tar,
2106 if (tar->sparse_last != NULL)
2107 tar->sparse_last->next = p;
2109 tar->sparse_list = p;
2110 tar->sparse_last = p;
2117 gnu_clear_sparse_list(struct tar *tar)
2121 while (tar->sparse_list != NULL) {
2122 p = tar->sparse_list;
2123 tar->sparse_list = p->next;
2126 tar->sparse_last = NULL;
2130 * GNU tar old-format sparse data.
2137 * severe POSIX violation; this design has earned GNU tar a
2142 gnu_sparse_old_read(struct archive_read *a, struct tar *tar,
2154 if (gnu_sparse_old_parse(a, tar, header->sparse, 4) != ARCHIVE_OK)
2166 "Truncated tar archive "
2172 if (gnu_sparse_old_parse(a, tar, ext->sparse, 21) != ARCHIVE_OK)
2175 if (tar->sparse_list != NULL)
2176 tar->entry_offset = tar->sparse_list->offset;
2181 gnu_sparse_old_parse(struct archive_read *a, struct tar *tar,
2185 if (gnu_add_sparse_entry(a, tar,
2197 * GNU tar sparse format 0.0
2199 * Beginning with GNU tar 1.15, sparse files are stored using
2200 * information in the pax extended header. The GNU tar maintainers
2212 * GNU tar sparse format 0.1
2223 gnu_sparse_01_parse(struct archive_read *a, struct tar *tar, const char *p)
2243 if (gnu_add_sparse_entry(a, tar, offset, size)
2255 * GNU tar sparse format 1.0
2262 * Unfortunately, GNU tar 1.16 had a bug that added unnecessary
2263 * padding to the body of the file when using this format. GNU tar
2278 gnu_sparse_10_atol(struct archive_read *a, struct tar *tar,
2291 * Skip any lines starting with '#'; GNU tar specs
2295 bytes_read = readline(a, tar, &p,
2325 gnu_sparse_10_read(struct archive_read *a, struct tar *tar, size_t *unconsumed)
2332 gnu_clear_sparse_list(tar);
2334 remaining = tar->entry_bytes_remaining;
2337 entries = (int)gnu_sparse_10_atol(a, tar, &remaining, unconsumed);
2343 offset = gnu_sparse_10_atol(a, tar, &remaining, unconsumed);
2346 size = gnu_sparse_10_atol(a, tar, &remaining, unconsumed);
2350 if (gnu_add_sparse_entry(a, tar, offset, size) != ARCHIVE_OK)
2355 bytes_read = (ssize_t)(tar->entry_bytes_remaining - remaining);
2369 solaris_sparse_parse(struct archive_read *a, struct tar *tar,
2395 if (gnu_add_sparse_entry(a, tar, start,
2398 tar->sparse_last->hole = hole;
2410 * Traditional tar formats (including POSIX) specify base-8 for
2419 * = GNU tar and STAR both allow either base-8 or base-256 in
2428 * Technically, GNU tar considers a field to be in base-256
2533 readline(struct archive_read *a, struct tar *tar, const char **start,
2571 if (archive_string_ensure(&tar->line, total_size + bytes_read) == NULL) {
2576 memcpy(tar->line.s + total_size, t, bytes_read);
2581 *start = tar->line.s;