Lines Matching defs:tar

52  * Layout of POSIX 'ustar' tar header.
74 * Structure of GNU tar header
120 struct tar {
163 static int gnu_add_sparse_entry(struct archive_read *, struct tar *,
166 static void gnu_clear_sparse_list(struct tar *);
167 static int gnu_sparse_old_read(struct archive_read *, struct tar *,
169 static int gnu_sparse_old_parse(struct archive_read *, struct tar *,
171 static int gnu_sparse_01_parse(struct archive_read *, struct tar *,
173 static ssize_t gnu_sparse_10_read(struct archive_read *, struct tar *,
175 static int header_Solaris_ACL(struct archive_read *, struct tar *,
177 static int header_common(struct archive_read *, struct tar *,
179 static int header_old_tar(struct archive_read *, struct tar *,
181 static int header_pax_extensions(struct archive_read *, struct tar *,
183 static int header_pax_global(struct archive_read *, struct tar *,
185 static int header_longlink(struct archive_read *, struct tar *,
187 static int header_longname(struct archive_read *, struct tar *,
189 static int read_mac_metadata_blob(struct archive_read *, struct tar *,
191 static int header_volume(struct archive_read *, struct tar *,
193 static int header_ustar(struct archive_read *, struct tar *,
195 static int header_gnutar(struct archive_read *, struct tar *,
207 static int pax_attribute(struct archive_read *, struct tar *,
210 static int pax_attribute_acl(struct archive_read *, struct tar *,
214 static int pax_header(struct archive_read *, struct tar *,
217 static ssize_t readline(struct archive_read *, struct tar *, const char **,
219 static int read_body_to_string(struct archive_read *, struct tar *,
221 static int solaris_sparse_parse(struct archive_read *, struct tar *,
227 static int tar_read_header(struct archive_read *, struct tar *,
247 struct tar *tar;
253 tar = (struct tar *)calloc(1, sizeof(*tar));
254 if (tar == NULL) {
256 "Can't allocate tar data");
261 tar->process_mac_extensions = 1;
264 r = __archive_read_register_format(a, tar, "tar",
276 free(tar);
283 struct tar *tar;
285 tar = (struct tar *)(a->format->data);
286 gnu_clear_sparse_list(tar);
287 archive_string_free(&tar->acl_text);
288 archive_string_free(&tar->entry_pathname);
289 archive_string_free(&tar->entry_pathname_override);
290 archive_string_free(&tar->entry_linkpath);
291 archive_string_free(&tar->entry_uname);
292 archive_string_free(&tar->entry_gname);
293 archive_string_free(&tar->line);
294 archive_string_free(&tar->pax_global);
295 archive_string_free(&tar->pax_header);
296 archive_string_free(&tar->longname);
297 archive_string_free(&tar->longlink);
298 archive_string_free(&tar->localname);
299 free(tar);
308 * variety of tar writers in the world:
314 * = GNU tar and star write base-256 values if numbers are too
317 * Examples of specific tar headers that we should support:
394 /* Recognize GNU tar format. */
428 struct tar *tar;
431 tar = (struct tar *)(a->format->data);
434 tar->compat_2x = (val != NULL && val[0] != 0);
435 tar->init_default_conversion = tar->compat_2x;
440 "tar: hdrcharset option needs a character-set name");
442 tar->opt_sconv =
445 if (tar->opt_sconv != NULL)
452 tar->process_mac_extensions = (val != NULL && val[0] != 0);
455 tar->read_concatenated_archives = (val != NULL && val[0] != 0);
497 * When converting tar archives to cpio archives, it is
500 * assign fake dev/inode numbers to each tar entry. Note that
508 * obscure tar->cpio conversion case.
512 struct tar *tar;
527 tar = (struct tar *)(a->format->data);
528 tar->entry_offset = 0;
529 gnu_clear_sparse_list(tar);
530 tar->realsize = -1; /* Mark this as "unset" */
531 tar->realsize_override = 0;
534 tar->sconv = tar->opt_sconv;
535 if (tar->sconv == NULL) {
536 if (!tar->init_default_conversion) {
537 tar->sconv_default =
539 tar->init_default_conversion = 1;
541 tar->sconv = tar->sconv_default;
544 r = tar_read_header(a, tar, entry, &unconsumed);
552 if (tar->sparse_list == NULL) {
553 if (gnu_add_sparse_entry(a, tar, 0, tar->entry_bytes_remaining)
559 for (sb = tar->sparse_list; sb != NULL; sb = sb->next) {
569 * directory: This is needed for certain old tar
592 struct tar *tar;
595 tar = (struct tar *)(a->format->data);
599 while (tar->sparse_list != NULL &&
600 tar->sparse_list->remaining == 0) {
601 p = tar->sparse_list;
602 tar->sparse_list = p->next;
606 if (tar->entry_bytes_unconsumed) {
607 __archive_read_consume(a, tar->entry_bytes_unconsumed);
608 tar->entry_bytes_unconsumed = 0;
612 if (tar->sparse_list == NULL ||
613 tar->entry_bytes_remaining == 0) {
614 if (__archive_read_consume(a, tar->entry_padding) < 0)
616 tar->entry_padding = 0;
619 *offset = tar->realsize;
628 "Truncated tar archive");
631 if (bytes_read > tar->entry_bytes_remaining)
632 bytes_read = (ssize_t)tar->entry_bytes_remaining;
635 if (tar->sparse_list->remaining < bytes_read)
636 bytes_read = (ssize_t)tar->sparse_list->remaining;
638 *offset = tar->sparse_list->offset;
639 tar->sparse_list->remaining -= bytes_read;
640 tar->sparse_list->offset += bytes_read;
641 tar->entry_bytes_remaining -= bytes_read;
642 tar->entry_bytes_unconsumed = bytes_read;
644 if (!tar->sparse_list->hole)
656 struct tar* tar;
658 tar = (struct tar *)(a->format->data);
662 for (p = tar->sparse_list; p != NULL; p = p->next) {
670 if (request > tar->entry_bytes_remaining)
671 request = tar->entry_bytes_remaining;
672 request += tar->entry_padding + tar->entry_bytes_unconsumed;
678 tar->entry_bytes_remaining = 0;
679 tar->entry_bytes_unconsumed = 0;
680 tar->entry_padding = 0;
683 gnu_clear_sparse_list(tar);
693 tar_read_header(struct archive_read *a, struct tar *tar,
719 "Truncated tar archive");
731 a->archive.archive_format_name = "tar";
734 if (!tar->read_concatenated_archives) {
759 archive_set_error(&a->archive, EINVAL, "Damaged tar archive");
763 if (++tar->header_recursion_depth > 32) {
773 case 'A': /* Solaris tar ACL */
775 a->archive.archive_format_name = "Solaris tar";
776 err = header_Solaris_ACL(a, tar, entry, h, unconsumed);
781 err = header_pax_global(a, tar, entry, h, unconsumed);
785 case 'K': /* Long link name (GNU tar, others) */
786 err = header_longlink(a, tar, entry, h, unconsumed);
788 case 'L': /* Long filename (GNU tar, others) */
789 err = header_longname(a, tar, entry, h, unconsumed);
792 err = header_volume(a, tar, entry, h, unconsumed);
796 case 'X': /* Used by SUN tar; same as 'x'. */
800 err = header_pax_extensions(a, tar, entry, h, unconsumed);
805 err = header_pax_extensions(a, tar, entry, h, unconsumed);
811 a->archive.archive_format_name = "GNU tar format";
812 err = header_gnutar(a, tar, entry, h, unconsumed);
818 err = header_ustar(a, tar, entry, h);
821 a->archive.archive_format_name = "tar (non-POSIX)";
822 err = header_old_tar(a, tar, entry, h);
833 --tar->header_recursion_depth;
839 tar->header_recursion_depth == 0 &&
840 tar->process_mac_extensions) {
841 int err2 = read_mac_metadata_blob(a, tar, entry, h, unconsumed);
848 if (tar->sparse_gnu_pending) {
849 if (tar->sparse_gnu_major == 1 &&
850 tar->sparse_gnu_minor == 0) {
853 tar->sparse_gnu_pending = 0;
855 bytes_read = gnu_sparse_10_read(a, tar, unconsumed);
858 tar->entry_bytes_remaining -= bytes_read;
865 tar->sparse_gnu_pending = 0;
873 "Damaged tar archive");
922 * was created by an old BSD, Solaris, or HP-UX tar with a
956 header_Solaris_ACL(struct archive_read *a, struct tar *tar,
971 err = read_body_to_string(a, tar, &(tar->acl_text), h, unconsumed);
976 err = tar_read_header(a, tar, entry, unconsumed);
986 p = acl = tar->acl_text.s;
1033 if (tar->sconv_acl == NULL) {
1034 tar->sconv_acl = archive_string_conversion_from_charset(
1036 if (tar->sconv_acl == NULL)
1039 archive_strncpy(&(tar->localname), acl, p - acl);
1041 tar->localname.s, acl_type, tar->sconv_acl);
1057 header_longlink(struct archive_read *a, struct tar *tar,
1062 err = read_body_to_string(a, tar, &(tar->longlink), h, unconsumed);
1065 err = tar_read_header(a, tar, entry, unconsumed);
1069 archive_entry_copy_link(entry, tar->longlink.s);
1092 header_longname(struct archive_read *a, struct tar *tar,
1097 err = read_body_to_string(a, tar, &(tar->longname), h, unconsumed);
1101 err = tar_read_header(a, tar, entry, unconsumed);
1104 if (archive_entry_copy_pathname_l(entry, tar->longname.s,
1105 archive_strlen(&(tar->longname)), tar->sconv) != 0)
1106 err = set_conversion_failed_error(a, tar->sconv, "Pathname");
1112 * Interpret 'V' GNU tar volume header.
1115 header_volume(struct archive_read *a, struct tar *tar,
1121 return (tar_read_header(a, tar, entry, unconsumed));
1128 read_body_to_string(struct archive_read *a, struct tar *tar,
1135 (void)tar; /* UNUSED */
1177 header_common(struct archive_read *a, struct tar *tar,
1186 archive_strncpy(&(tar->entry_linkpath),
1189 archive_string_empty(&(tar->entry_linkpath));
1196 tar->entry_bytes_remaining = tar_atol(header->size, sizeof(header->size));
1197 if (tar->entry_bytes_remaining < 0) {
1198 tar->entry_bytes_remaining = 0;
1203 if (tar->entry_bytes_remaining == INT64_MAX) {
1205 tar->entry_bytes_remaining = 0;
1210 tar->realsize = tar->entry_bytes_remaining;
1211 archive_entry_set_size(entry, tar->entry_bytes_remaining);
1214 /* Handle the tar type flag appropriately. */
1219 if (archive_entry_copy_hardlink_l(entry, tar->entry_linkpath.s,
1220 archive_strlen(&(tar->entry_linkpath)), tar->sconv) != 0) {
1221 err = set_conversion_failed_error(a, tar->sconv,
1227 * The following may seem odd, but: Technically, tar
1239 * A tricky point: Traditionally, tar readers have
1259 /* Old-style or GNU tar: we must ignore the size. */
1261 tar->entry_bytes_remaining = 0;
1270 tar->entry_bytes_remaining = 0;
1278 * a body containing an uncompressed tar archive.
1286 tar->entry_bytes_remaining = 0;
1287 if (archive_entry_copy_symlink_l(entry, tar->entry_linkpath.s,
1288 archive_strlen(&(tar->entry_linkpath)), tar->sconv) != 0) {
1289 err = set_conversion_failed_error(a, tar->sconv,
1298 tar->entry_bytes_remaining = 0;
1303 tar->entry_bytes_remaining = 0;
1308 tar->entry_bytes_remaining = 0;
1313 tar->entry_bytes_remaining = 0;
1349 tar->sparse_allowed = 1;
1363 * Parse out header elements for "old-style" tar archives.
1366 header_old_tar(struct archive_read *a, struct tar *tar,
1375 header->name, sizeof(header->name), tar->sconv) != 0) {
1376 err = set_conversion_failed_error(a, tar->sconv, "Pathname");
1382 err2 = header_common(a, tar, entry, h);
1386 tar->entry_padding = 0x1ff & (-tar->entry_bytes_remaining);
1395 read_mac_metadata_blob(struct archive_read *a, struct tar *tar,
1458 return (tar_read_header(a, tar, entry, unconsumed));
1465 header_pax_global(struct archive_read *a, struct tar *tar,
1470 err = read_body_to_string(a, tar, &(tar->pax_global), h, unconsumed);
1473 err = tar_read_header(a, tar, entry, unconsumed);
1478 header_pax_extensions(struct archive_read *a, struct tar *tar,
1483 err = read_body_to_string(a, tar, &(tar->pax_header), h, unconsumed);
1488 err = tar_read_header(a, tar, entry, unconsumed);
1502 err2 = pax_header(a, tar, entry, &tar->pax_header);
1504 tar->entry_padding = 0x1ff & (-tar->entry_bytes_remaining);
1514 header_ustar(struct archive_read *a, struct tar *tar,
1524 as = &(tar->entry_pathname);
1534 tar->sconv) != 0) {
1535 err = set_conversion_failed_error(a, tar->sconv, "Pathname");
1541 r = header_common(a, tar, entry, h);
1549 header->uname, sizeof(header->uname), tar->sconv) != 0) {
1550 err = set_conversion_failed_error(a, tar->sconv, "Uname");
1556 header->gname, sizeof(header->gname), tar->sconv) != 0) {
1557 err = set_conversion_failed_error(a, tar->sconv, "Gname");
1570 tar->entry_padding = 0x1ff & (-tar->entry_bytes_remaining);
1582 pax_header(struct archive_read *a, struct tar *tar,
1594 tar->pax_hdrcharset_binary = 0;
1595 archive_string_empty(&(tar->entry_gname));
1596 archive_string_empty(&(tar->entry_linkpath));
1597 archive_string_empty(&(tar->entry_pathname));
1598 archive_string_empty(&(tar->entry_pathname_override));
1599 archive_string_empty(&(tar->entry_uname));
1664 err2 = pax_attribute(a, tar, entry, key, value, value_length);
1683 if (tar->pax_hdrcharset_binary)
1684 sconv = tar->opt_sconv;
1690 if (tar->compat_2x)
1695 if (archive_strlen(&(tar->entry_gname)) > 0) {
1696 if (archive_entry_copy_gname_l(entry, tar->entry_gname.s,
1697 archive_strlen(&(tar->entry_gname)), sconv) != 0) {
1702 archive_entry_copy_gname(entry, tar->entry_gname.s);
1705 if (archive_strlen(&(tar->entry_linkpath)) > 0) {
1706 if (archive_entry_copy_link_l(entry, tar->entry_linkpath.s,
1707 archive_strlen(&(tar->entry_linkpath)), sconv) != 0) {
1712 archive_entry_copy_link(entry, tar->entry_linkpath.s);
1725 if (archive_strlen(&(tar->entry_pathname_override)) > 0)
1726 as = &(tar->entry_pathname_override);
1727 else if (archive_strlen(&(tar->entry_pathname)) > 0)
1728 as = &(tar->entry_pathname);
1739 if (archive_strlen(&(tar->entry_uname)) > 0) {
1740 if (archive_entry_copy_uname_l(entry, tar->entry_uname.s,
1741 archive_strlen(&(tar->entry_uname)), sconv) != 0) {
1746 archive_entry_copy_uname(entry, tar->entry_uname.s);
1810 pax_attribute_acl(struct archive_read *a, struct tar *tar,
1832 if (tar->sconv_acl == NULL) {
1833 tar->sconv_acl =
1836 if (tar->sconv_acl == NULL)
1841 tar->sconv_acl);
1869 pax_attribute(struct archive_read *a, struct tar *tar,
1885 !tar->sparse_allowed) {
1893 tar->sparse_offset = -1;
1894 tar->sparse_numbytes = -1;
1895 tar->sparse_gnu_major = 0;
1896 tar->sparse_gnu_minor = 0;
1899 tar->sparse_offset = tar_atol10(value, strlen(value));
1900 if (tar->sparse_numbytes != -1) {
1901 if (gnu_add_sparse_entry(a, tar,
1902 tar->sparse_offset, tar->sparse_numbytes)
1905 tar->sparse_offset = -1;
1906 tar->sparse_numbytes = -1;
1910 tar->sparse_numbytes = tar_atol10(value, strlen(value));
1911 if (tar->sparse_numbytes != -1) {
1912 if (gnu_add_sparse_entry(a, tar,
1913 tar->sparse_offset, tar->sparse_numbytes)
1916 tar->sparse_offset = -1;
1917 tar->sparse_numbytes = -1;
1921 tar->realsize = tar_atol10(value, strlen(value));
1922 archive_entry_set_size(entry, tar->realsize);
1923 tar->realsize_override = 1;
1928 tar->sparse_gnu_major = 0;
1929 tar->sparse_gnu_minor = 1;
1930 if (gnu_sparse_01_parse(a, tar, value) != ARCHIVE_OK)
1936 tar->sparse_gnu_major = (int)tar_atol10(value, strlen(value));
1937 tar->sparse_gnu_pending = 1;
1940 tar->sparse_gnu_minor = (int)tar_atol10(value, strlen(value));
1941 tar->sparse_gnu_pending = 1;
1946 * files, GNU tar puts a synthesized name into
1950 archive_strcpy(&(tar->entry_pathname_override), value);
1953 tar->realsize = tar_atol10(value, strlen(value));
1954 archive_entry_set_size(entry, tar->realsize);
1955 tar->realsize_override = 1;
1982 /* GNU tar uses RHT.security header to store SELinux xattrs
1992 r = pax_attribute_acl(a, tar, entry, value,
1997 r = pax_attribute_acl(a, tar, entry, value,
2002 r = pax_attribute_acl(a, tar, entry, value,
2024 tar->realsize = tar_atol10(value, strlen(value));
2025 tar->realsize_override = 1;
2026 archive_entry_set_size(entry, tar->realsize);
2032 r = solaris_sparse_parse(a, tar, entry, value);
2064 archive_strcpy(&(tar->entry_gname), value);
2071 tar->pax_hdrcharset_binary = 1;
2073 tar->pax_hdrcharset_binary = 0;
2079 archive_strcpy(&(tar->entry_linkpath), value);
2090 archive_strcpy(&(tar->entry_pathname), value);
2101 tar->entry_bytes_remaining
2105 * "size" field in the tar header.
2109 if (!tar->realsize_override) {
2111 tar->entry_bytes_remaining);
2112 tar->realsize
2113 = tar->entry_bytes_remaining;
2122 archive_strcpy(&(tar->entry_uname), value);
2182 * Parse GNU tar header
2185 header_gnutar(struct archive_read *a, struct tar *tar,
2198 /* Grab fields common to all tar variants. */
2199 err = header_common(a, tar, entry, h);
2206 header->name, sizeof(header->name), tar->sconv) != 0) {
2207 err = set_conversion_failed_error(a, tar->sconv, "Pathname");
2214 * to ustar and gnu tar? Is it okay to move it down into
2217 header->uname, sizeof(header->uname), tar->sconv) != 0) {
2218 err = set_conversion_failed_error(a, tar->sconv, "Uname");
2224 header->gname, sizeof(header->gname), tar->sconv) != 0) {
2225 err = set_conversion_failed_error(a, tar->sconv, "Gname");
2239 tar->entry_padding = 0x1ff & (-tar->entry_bytes_remaining);
2250 tar->realsize
2252 archive_entry_set_size(entry, tar->realsize);
2253 tar->realsize_override = 1;
2257 if (gnu_sparse_old_read(a, tar, header, unconsumed)
2270 gnu_add_sparse_entry(struct archive_read *a, struct tar *tar,
2280 if (tar->sparse_last != NULL)
2281 tar->sparse_last->next = p;
2283 tar->sparse_list = p;
2284 tar->sparse_last = p;
2295 gnu_clear_sparse_list(struct tar *tar)
2299 while (tar->sparse_list != NULL) {
2300 p = tar->sparse_list;
2301 tar->sparse_list = p->next;
2304 tar->sparse_last = NULL;
2308 * GNU tar old-format sparse data.
2315 * severe POSIX violation; this design has earned GNU tar a
2320 gnu_sparse_old_read(struct archive_read *a, struct tar *tar,
2332 if (gnu_sparse_old_parse(a, tar, header->sparse, 4) != ARCHIVE_OK)
2344 "Truncated tar archive "
2350 if (gnu_sparse_old_parse(a, tar, ext->sparse, 21) != ARCHIVE_OK)
2353 if (tar->sparse_list != NULL)
2354 tar->entry_offset = tar->sparse_list->offset;
2359 gnu_sparse_old_parse(struct archive_read *a, struct tar *tar,
2363 if (gnu_add_sparse_entry(a, tar,
2375 * GNU tar sparse format 0.0
2377 * Beginning with GNU tar 1.15, sparse files are stored using
2378 * information in the pax extended header. The GNU tar maintainers
2390 * GNU tar sparse format 0.1
2401 gnu_sparse_01_parse(struct archive_read *a, struct tar *tar, const char *p)
2421 if (gnu_add_sparse_entry(a, tar, offset, size)
2433 * GNU tar sparse format 1.0
2440 * Unfortunately, GNU tar 1.16 had a bug that added unnecessary
2441 * padding to the body of the file when using this format. GNU tar
2456 gnu_sparse_10_atol(struct archive_read *a, struct tar *tar,
2469 * Skip any lines starting with '#'; GNU tar specs
2473 bytes_read = readline(a, tar, &p,
2503 gnu_sparse_10_read(struct archive_read *a, struct tar *tar, size_t *unconsumed)
2510 gnu_clear_sparse_list(tar);
2512 remaining = tar->entry_bytes_remaining;
2515 entries = (int)gnu_sparse_10_atol(a, tar, &remaining, unconsumed);
2521 offset = gnu_sparse_10_atol(a, tar, &remaining, unconsumed);
2524 size = gnu_sparse_10_atol(a, tar, &remaining, unconsumed);
2528 if (gnu_add_sparse_entry(a, tar, offset, size) != ARCHIVE_OK)
2533 bytes_read = (ssize_t)(tar->entry_bytes_remaining - remaining);
2535 /* Fail if tar->entry_bytes_remaing would get negative */
2550 solaris_sparse_parse(struct archive_read *a, struct tar *tar,
2576 if (gnu_add_sparse_entry(a, tar, start,
2579 tar->sparse_last->hole = hole;
2591 * Traditional tar formats (including POSIX) specify base-8 for
2600 * = GNU tar and STAR both allow either base-8 or base-256 in
2609 * Technically, GNU tar considers a field to be in base-256
2738 readline(struct archive_read *a, struct tar *tar, const char **start,
2776 if (archive_string_ensure(&tar->line, total_size + bytes_read) == NULL) {
2781 memcpy(tar->line.s + total_size, t, bytes_read);
2786 *start = tar->line.s;