• Home
  • History
  • Annotate
  • Raw
  • Download
  • only in /freebsd-12-stable/contrib/libarchive/libarchive/

Lines Matching defs:iso9660

679 struct iso9660 {
766 * Copy a compressed file to iso9660.zisofs.temp_fd
768 * iso9660.temp_fd . If the number of logical block
794 #define wb_remaining(a) (((struct iso9660 *)(a)->format_data)->wbuff_remaining)
795 #define wb_offset(a) (((struct iso9660 *)(a)->format_data)->wbuff_offset \
935 struct isoent *, struct iso9660 *, enum dir_rec_type);
937 struct isoent *, struct iso9660 *, enum dir_rec_type,
939 static inline int get_dir_rec_size(struct iso9660 *, struct isoent *,
964 static void isofile_init_entry_list(struct iso9660 *);
965 static void isofile_add_entry(struct iso9660 *, struct isofile *);
966 static void isofile_free_all_entries(struct iso9660 *);
967 static void isofile_init_entry_data_file_list(struct iso9660 *);
968 static void isofile_add_data_file(struct iso9660 *, struct isofile *);
976 static void isofile_connect_hardlink_files(struct iso9660 *);
977 static void isofile_init_hardlinks(struct iso9660 *);
978 static void isofile_free_hardlinks(struct iso9660 *);
986 struct iso9660 *, const char *);
994 static void isoent_setup_directory_location(struct iso9660 *,
996 static void isoent_setup_file_location(struct iso9660 *, int);
1002 static void idr_init(struct iso9660 *, struct vdd *, struct idr *);
1054 struct iso9660 *iso9660;
1063 iso9660 = calloc(1, sizeof(*iso9660));
1064 if (iso9660 == NULL) {
1066 "Can't allocate iso9660 data");
1069 iso9660->birth_time = 0;
1070 iso9660->temp_fd = -1;
1071 iso9660->cur_file = NULL;
1072 iso9660->primary.max_depth = 0;
1073 iso9660->primary.vdd_type = VDD_PRIMARY;
1074 iso9660->primary.pathtbl = NULL;
1075 iso9660->joliet.rootent = NULL;
1076 iso9660->joliet.max_depth = 0;
1077 iso9660->joliet.vdd_type = VDD_JOLIET;
1078 iso9660->joliet.pathtbl = NULL;
1079 isofile_init_entry_list(iso9660);
1080 isofile_init_entry_data_file_list(iso9660);
1081 isofile_init_hardlinks(iso9660);
1082 iso9660->directories_too_deep = NULL;
1083 iso9660->dircnt_max = 1;
1084 iso9660->wbuff_remaining = wb_buffmax();
1085 iso9660->wbuff_type = WB_TO_TEMP;
1086 iso9660->wbuff_offset = 0;
1087 iso9660->wbuff_written = 0;
1088 iso9660->wbuff_tail = 0;
1089 archive_string_init(&(iso9660->utf16be));
1090 archive_string_init(&(iso9660->mbs));
1095 archive_string_init(&(iso9660->volume_identifier));
1096 archive_strcpy(&(iso9660->volume_identifier), "CDROM");
1097 archive_string_init(&(iso9660->publisher_identifier));
1098 archive_string_init(&(iso9660->data_preparer_identifier));
1099 archive_string_init(&(iso9660->application_identifier));
1100 archive_strcpy(&(iso9660->application_identifier),
1102 archive_string_init(&(iso9660->copyright_file_identifier));
1103 archive_string_init(&(iso9660->abstract_file_identifier));
1104 archive_string_init(&(iso9660->bibliographic_file_identifier));
1109 archive_string_init(&(iso9660->el_torito.catalog_filename));
1110 iso9660->el_torito.catalog = NULL;
1112 archive_strcpy(&(iso9660->el_torito.catalog_filename),
1114 archive_string_init(&(iso9660->el_torito.boot_filename));
1115 iso9660->el_torito.boot = NULL;
1116 iso9660->el_torito.platform_id = BOOT_PLATFORM_X86;
1117 archive_string_init(&(iso9660->el_torito.id));
1118 iso9660->el_torito.boot_load_seg = 0;
1119 iso9660->el_torito.boot_load_size = BOOT_LOAD_SIZE;
1125 iso9660->zisofs.block_pointers = NULL;
1126 iso9660->zisofs.block_pointers_allocated = 0;
1127 iso9660->zisofs.stream_valid = 0;
1128 iso9660->zisofs.compression_level = 9;
1129 memset(&(iso9660->zisofs.stream), 0,
1130 sizeof(iso9660->zisofs.stream));
1134 * Set default value of iso9660 options.
1136 iso9660->opt.abstract_file = OPT_ABSTRACT_FILE_DEFAULT;
1137 iso9660->opt.application_id = OPT_APPLICATION_ID_DEFAULT;
1138 iso9660->opt.allow_vernum = OPT_ALLOW_VERNUM_DEFAULT;
1139 iso9660->opt.biblio_file = OPT_BIBLIO_FILE_DEFAULT;
1140 iso9660->opt.boot = OPT_BOOT_DEFAULT;
1141 iso9660->opt.boot_catalog = OPT_BOOT_CATALOG_DEFAULT;
1142 iso9660->opt.boot_info_table = OPT_BOOT_INFO_TABLE_DEFAULT;
1143 iso9660->opt.boot_load_seg = OPT_BOOT_LOAD_SEG_DEFAULT;
1144 iso9660->opt.boot_load_size = OPT_BOOT_LOAD_SIZE_DEFAULT;
1145 iso9660->opt.boot_type = OPT_BOOT_TYPE_DEFAULT;
1146 iso9660->opt.compression_level = OPT_COMPRESSION_LEVEL_DEFAULT;
1147 iso9660->opt.copyright_file = OPT_COPYRIGHT_FILE_DEFAULT;
1148 iso9660->opt.iso_level = OPT_ISO_LEVEL_DEFAULT;
1149 iso9660->opt.joliet = OPT_JOLIET_DEFAULT;
1150 iso9660->opt.limit_depth = OPT_LIMIT_DEPTH_DEFAULT;
1151 iso9660->opt.limit_dirs = OPT_LIMIT_DIRS_DEFAULT;
1152 iso9660->opt.pad = OPT_PAD_DEFAULT;
1153 iso9660->opt.publisher = OPT_PUBLISHER_DEFAULT;
1154 iso9660->opt.rr = OPT_RR_DEFAULT;
1155 iso9660->opt.volume_id = OPT_VOLUME_ID_DEFAULT;
1156 iso9660->opt.zisofs = OPT_ZISOFS_DEFAULT;
1159 iso9660->primary.rootent =
1160 isoent_create_virtual_dir(a, iso9660, "");
1161 if (iso9660->primary.rootent == NULL) {
1162 free(iso9660);
1167 iso9660->primary.rootent->parent = iso9660->primary.rootent;
1168 iso9660->cur_dirent = iso9660->primary.rootent;
1169 archive_string_init(&(iso9660->cur_dirstr));
1170 archive_string_ensure(&(iso9660->cur_dirstr), 1);
1171 iso9660->cur_dirstr.s[0] = 0;
1172 iso9660->sconv_to_utf16be = NULL;
1173 iso9660->sconv_from_utf16be = NULL;
1175 a->format_data = iso9660;
1176 a->format_name = "iso9660";
1253 struct iso9660 *iso9660 = a->format_data;
1261 &(iso9660->abstract_file_identifier),
1263 iso9660->opt.abstract_file = r == ARCHIVE_OK;
1268 &(iso9660->application_identifier),
1270 iso9660->opt.application_id = r == ARCHIVE_OK;
1274 iso9660->opt.allow_vernum = value != NULL;
1281 &(iso9660->bibliographic_file_identifier),
1283 iso9660->opt.biblio_file = r == ARCHIVE_OK;
1288 iso9660->opt.boot = 0;
1290 iso9660->opt.boot = 1;
1292 &(iso9660->el_torito.boot_filename),
1299 &(iso9660->el_torito.catalog_filename),
1301 iso9660->opt.boot_catalog = r == ARCHIVE_OK;
1305 iso9660->opt.boot_info_table = value != NULL;
1311 iso9660->opt.boot_load_seg = 0;
1338 iso9660->el_torito.boot_load_seg = (uint16_t)seg;
1339 iso9660->opt.boot_load_seg = 1;
1345 iso9660->opt.boot_load_size = r == ARCHIVE_OK;
1348 iso9660->el_torito.boot_load_size = (uint16_t)num;
1355 iso9660->opt.boot_type = OPT_BOOT_TYPE_NO_EMU;
1357 iso9660->opt.boot_type = OPT_BOOT_TYPE_FD;
1359 iso9660->opt.boot_type = OPT_BOOT_TYPE_HARD_DISK;
1372 iso9660->zisofs.compression_level = value[0] - '0';
1373 iso9660->opt.compression_level = 1;
1385 &(iso9660->copyright_file_identifier),
1387 iso9660->opt.copyright_file = r == ARCHIVE_OK;
1415 iso9660->birth_time = mktime(&tm);
1424 iso9660->opt.iso_level = value[0]-'0';
1433 iso9660->opt.joliet = OPT_JOLIET_DISABLE;
1435 iso9660->opt.joliet = OPT_JOLIET_ENABLE;
1437 iso9660->opt.joliet = OPT_JOLIET_LONGNAME;
1445 iso9660->opt.limit_depth = value != NULL;
1449 iso9660->opt.limit_dirs = value != NULL;
1455 iso9660->opt.pad = value != NULL;
1460 &(iso9660->publisher_identifier),
1462 iso9660->opt.publisher = r == ARCHIVE_OK;
1470 iso9660->opt.rr = OPT_RR_DISABLED;
1472 iso9660->opt.rr = OPT_RR_USEFUL;
1474 iso9660->opt.rr = OPT_RR_STRICT;
1476 iso9660->opt.rr = OPT_RR_USEFUL;
1484 r = get_str_opt(a, &(iso9660->volume_identifier),
1486 iso9660->opt.volume_id = r == ARCHIVE_OK;
1493 iso9660->opt.zisofs = OPT_ZISOFS_DISABLED;
1496 iso9660->opt.zisofs = OPT_ZISOFS_DIRECT;
1524 struct iso9660 *iso9660;
1529 iso9660 = a->format_data;
1531 iso9660->cur_file = NULL;
1532 iso9660->bytes_remaining = 0;
1533 iso9660->need_multi_extent = 0;
1535 && iso9660->opt.rr == OPT_RR_DISABLED) {
1538 iso9660->cur_file = NULL;
1543 if (iso9660->opt.iso_level < 3) {
1549 iso9660->cur_file = NULL;
1552 iso9660->need_multi_extent = 1;
1579 isofile_add_entry(iso9660, file);
1586 if (isoent->file->dircnt > iso9660->dircnt_max)
1587 iso9660->dircnt_max = isoent->file->dircnt;
1608 iso9660->cur_file = file;
1619 if (iso9660->temp_fd < 0) {
1620 iso9660->temp_fd = __archive_mktemp(NULL);
1621 if (iso9660->temp_fd < 0) {
1634 iso9660->bytes_remaining = archive_entry_size(file->entry);
1642 struct iso9660 *iso9660 = a->format_data;
1648 written = write(iso9660->temp_fd, b, s);
1672 struct iso9660 *iso9660 = (struct iso9660 *)a->format_data;
1674 iso9660->wbuff_offset += s - xs;
1712 struct iso9660 *iso9660 = a->format_data;
1715 if (iso9660->temp_fd < 0) {
1722 if (iso9660->need_multi_extent &&
1723 (iso9660->cur_file->cur_content->size + ws) >=
1729 iso9660->cur_file->cur_content->size);
1731 if (iso9660->zisofs.detect_magic)
1734 if (iso9660->zisofs.making) {
1740 iso9660->cur_file->cur_content->size += ts;
1745 iso9660->cur_file->cur_content->size) != ARCHIVE_OK)
1749 iso9660->cur_file->cur_content->blocks = (int)
1750 ((iso9660->cur_file->cur_content->size
1766 iso9660->cur_file->cur_content->next = con;
1767 iso9660->cur_file->cur_content = con;
1769 iso9660->zisofs.block_offset = 0;
1773 if (iso9660->zisofs.detect_magic)
1776 if (iso9660->zisofs.making) {
1782 iso9660->cur_file->cur_content->size += ws;
1791 struct iso9660 *iso9660 = a->format_data;
1794 if (iso9660->cur_file == NULL)
1796 if (archive_entry_filetype(iso9660->cur_file->entry) != AE_IFREG)
1798 if (s > iso9660->bytes_remaining)
1799 s = (size_t)iso9660->bytes_remaining;
1805 iso9660->bytes_remaining -= r;
1812 struct iso9660 *iso9660 = a->format_data;
1814 if (iso9660->cur_file == NULL)
1816 if (archive_entry_filetype(iso9660->cur_file->entry) != AE_IFREG)
1818 if (iso9660->cur_file->content.size == 0)
1822 while (iso9660->bytes_remaining > 0) {
1825 s = (iso9660->bytes_remaining > a->null_length)?
1826 a->null_length: (size_t)iso9660->bytes_remaining;
1829 iso9660->bytes_remaining -= s;
1832 if (iso9660->zisofs.making && zisofs_finish_entry(a) != ARCHIVE_OK)
1836 if (wb_write_padding_to_temp(a, iso9660->cur_file->cur_content->size)
1841 iso9660->cur_file->cur_content->blocks = (int)
1842 ((iso9660->cur_file->cur_content->size
1846 isofile_add_data_file(iso9660, iso9660->cur_file);
1854 struct iso9660 *iso9660;
1857 iso9660 = a->format_data;
1872 if (iso9660->birth_time == 0)
1874 time(&(iso9660->birth_time));
1879 if (iso9660->opt.boot) {
1881 ret = isoent_find_out_boot_file(a, iso9660->primary.rootent);
1896 ret = isoent_create_boot_catalog(a, iso9660->primary.rootent);
1904 if (iso9660->opt.joliet) {
1906 ret = isoent_clone_tree(a, &(iso9660->joliet.rootent),
1907 iso9660->primary.rootent);
1913 if (iso9660->sconv_to_utf16be == NULL) {
1914 iso9660->sconv_to_utf16be =
1917 if (iso9660->sconv_to_utf16be == NULL)
1920 iso9660->sconv_from_utf16be =
1923 if (iso9660->sconv_from_utf16be == NULL)
1938 * contents of an iso9660 image.
1944 if (iso9660->opt.boot)
1946 if (iso9660->opt.joliet)
1948 if (iso9660->opt.iso_level == 4)
1952 iso9660->primary.location_type_L_path_table = blocks;
1953 blocks += iso9660->primary.path_table_block;
1954 iso9660->primary.location_type_M_path_table = blocks;
1955 blocks += iso9660->primary.path_table_block;
1956 if (iso9660->opt.joliet) {
1957 iso9660->joliet.location_type_L_path_table = blocks;
1958 blocks += iso9660->joliet.path_table_block;
1959 iso9660->joliet.location_type_M_path_table = blocks;
1960 blocks += iso9660->joliet.path_table_block;
1964 isoent_setup_directory_location(iso9660, blocks,
1965 &(iso9660->primary));
1966 blocks += iso9660->primary.total_dir_block;
1967 if (iso9660->opt.joliet) {
1968 isoent_setup_directory_location(iso9660, blocks,
1969 &(iso9660->joliet));
1970 blocks += iso9660->joliet.total_dir_block;
1973 if (iso9660->opt.rr) {
1974 iso9660->location_rrip_er = blocks;
1979 isoent_setup_file_location(iso9660, blocks);
1980 blocks += iso9660->total_file_block;
1981 if (iso9660->opt.boot && iso9660->opt.boot_info_table) {
1988 iso9660->volume_space_size = blocks;
1989 if (iso9660->opt.pad)
1990 iso9660->volume_space_size += PADDING_BLOCK;
1991 iso9660->volume_sequence_number = 1;
1999 iso9660->wbuff_remaining = wb_buffmax();
2000 iso9660->wbuff_type = WB_TO_STREAM;
2001 iso9660->wbuff_offset = 0;
2002 iso9660->wbuff_written = 0;
2003 iso9660->wbuff_tail = 0;
2011 ret = write_VD(a, &(iso9660->primary));
2015 if (iso9660->opt.boot) {
2022 if (iso9660->opt.iso_level == 4) {
2024 iso9660->primary.vdd_type = VDD_ENHANCED;
2025 ret = write_VD(a, &(iso9660->primary));
2026 iso9660->primary.vdd_type = VDD_PRIMARY;
2031 if (iso9660->opt.joliet) {
2032 ret = write_VD(a, &(iso9660->joliet));
2048 ret = write_path_table(a, 0, &(iso9660->primary));
2053 ret = write_path_table(a, 1, &(iso9660->primary));
2057 if (iso9660->opt.joliet) {
2059 ret = write_path_table(a, 0, &(iso9660->joliet));
2064 ret = write_path_table(a, 1, &(iso9660->joliet));
2070 ret = write_directory_descriptors(a, &(iso9660->primary));
2074 if (iso9660->opt.joliet) {
2075 ret = write_directory_descriptors(a, &(iso9660->joliet));
2080 if (iso9660->opt.rr) {
2093 if (iso9660->opt.pad) {
2099 if (iso9660->directories_too_deep != NULL) {
2103 iso9660->directories_too_deep->file->entry));
2116 struct iso9660 *iso9660;
2119 iso9660 = a->format_data;
2122 if (iso9660->temp_fd >= 0)
2123 close(iso9660->temp_fd);
2129 isoent_free_all(iso9660->primary.rootent);
2130 for (i = 0; i < iso9660->primary.max_depth; i++)
2131 free(iso9660->primary.pathtbl[i].sorted);
2132 free(iso9660->primary.pathtbl);
2134 if (iso9660->opt.joliet) {
2135 isoent_free_all(iso9660->joliet.rootent);
2136 for (i = 0; i < iso9660->joliet.max_depth; i++)
2137 free(iso9660->joliet.pathtbl[i].sorted);
2138 free(iso9660->joliet.pathtbl);
2142 isofile_free_all_entries(iso9660);
2143 isofile_free_hardlinks(iso9660);
2145 archive_string_free(&(iso9660->cur_dirstr));
2146 archive_string_free(&(iso9660->volume_identifier));
2147 archive_string_free(&(iso9660->publisher_identifier));
2148 archive_string_free(&(iso9660->data_preparer_identifier));
2149 archive_string_free(&(iso9660->application_identifier));
2150 archive_string_free(&(iso9660->copyright_file_identifier));
2151 archive_string_free(&(iso9660->abstract_file_identifier));
2152 archive_string_free(&(iso9660->bibliographic_file_identifier));
2153 archive_string_free(&(iso9660->el_torito.catalog_filename));
2154 archive_string_free(&(iso9660->el_torito.boot_filename));
2155 archive_string_free(&(iso9660->el_torito.id));
2156 archive_string_free(&(iso9660->utf16be));
2157 archive_string_free(&(iso9660->mbs));
2159 free(iso9660);
2247 struct iso9660 *iso9660 = a->format_data;
2248 if (archive_strncpy_l(&iso9660->utf16be, s, strlen(s),
2249 iso9660->sconv_to_utf16be) != 0 && errno == ENOMEM) {
2254 size = iso9660->utf16be.length;
2257 memcpy(p, iso9660->utf16be.s, size);
2788 struct isoent *isoent, struct iso9660 *iso9660, enum dir_rec_type t)
2842 isoent->parent == iso9660->primary.rootent &&
2962 if (iso9660->opt.rr == OPT_RR_USEFUL) {
3415 set_SUSP_CE(bp+1, iso9660->location_rrip_er,
3439 struct iso9660 *iso9660, enum dir_rec_type t,
3524 set_num_723(bp+29, iso9660->volume_sequence_number);
3564 if (iso9660->opt.rr && vdd_type != VDD_JOLIET)
3566 isoent, iso9660, t);
3598 get_dir_rec_size(struct iso9660 *iso9660, struct isoent *isoent,
3603 isoent, iso9660, t, vdd_type));
3615 struct iso9660 *iso9660 = (struct iso9660 *)a->format_data;
3617 return (&(iso9660->wbuff[sizeof(iso9660->wbuff)
3618 - iso9660->wbuff_remaining]));
3624 struct iso9660 *iso9660 = (struct iso9660 *)a->format_data;
3628 wsize = sizeof(iso9660->wbuff) - iso9660->wbuff_remaining;
3630 if (iso9660->wbuff_type == WB_TO_STREAM)
3631 r = __archive_write_output(a, iso9660->wbuff, wsize - nw);
3633 r = write_to_temp(a, iso9660->wbuff, wsize - nw);
3635 iso9660->wbuff_offset += wsize - nw;
3636 if (iso9660->wbuff_offset > iso9660->wbuff_written)
3637 iso9660->wbuff_written = iso9660->wbuff_offset;
3638 iso9660->wbuff_remaining = sizeof(iso9660->wbuff);
3640 iso9660->wbuff_remaining -= nw;
3641 memmove(iso9660->wbuff, iso9660->wbuff + wsize - nw, nw);
3649 struct iso9660 *iso9660 = (struct iso9660 *)a->format_data;
3651 if (size > iso9660->wbuff_remaining ||
3652 iso9660->wbuff_remaining == 0) {
3654 "Internal Programming error: iso9660:wb_consume()"
3656 (intmax_t)size, (intmax_t)iso9660->wbuff_remaining);
3659 iso9660->wbuff_remaining -= size;
3660 if (iso9660->wbuff_remaining < LOGICAL_BLOCK_SIZE)
3670 struct iso9660 *iso9660 = (struct iso9660 *)a->format_data;
3673 if (iso9660->wbuff_type != WB_TO_TEMP) {
3675 "Internal Programming error: iso9660:wb_set_offset()");
3679 used = sizeof(iso9660->wbuff) - iso9660->wbuff_remaining;
3680 if (iso9660->wbuff_offset + used > iso9660->wbuff_tail)
3681 iso9660->wbuff_tail = iso9660->wbuff_offset + used;
3682 if (iso9660->wbuff_offset < iso9660->wbuff_written) {
3684 write_to_temp(a, iso9660->wbuff, (size_t)used) != ARCHIVE_OK)
3686 iso9660->wbuff_offset = iso9660->wbuff_written;
3687 lseek(iso9660->temp_fd, iso9660->wbuff_offset, SEEK_SET);
3688 iso9660->wbuff_remaining = sizeof(iso9660->wbuff);
3691 if (off < iso9660->wbuff_offset) {
3699 lseek(iso9660->temp_fd, off, SEEK_SET);
3700 iso9660->wbuff_offset = off;
3701 iso9660->wbuff_remaining = sizeof(iso9660->wbuff);
3702 } else if (off <= iso9660->wbuff_tail) {
3703 iso9660->wbuff_remaining = (size_t)
3704 (sizeof(iso9660->wbuff) - (off - iso9660->wbuff_offset));
3706 ext_bytes = off - iso9660->wbuff_tail;
3707 iso9660->wbuff_remaining = (size_t)(sizeof(iso9660->wbuff)
3708 - (iso9660->wbuff_tail - iso9660->wbuff_offset));
3709 while (ext_bytes >= (int64_t)iso9660->wbuff_remaining) {
3710 if (write_null(a, (size_t)iso9660->wbuff_remaining)
3713 ext_bytes -= iso9660->wbuff_remaining;
3837 struct iso9660 *iso9660;
3846 iso9660 = a->format_data;
3882 iso9660->volume_identifier.s, vdc);
3888 set_num_733(bp+81, iso9660->volume_space_size);
3902 set_num_723(bp+125, iso9660->volume_sequence_number);
3917 iso9660, DIR_REC_VD, vdd->vdd_type);
3924 &(iso9660->publisher_identifier),
3930 &(iso9660->data_preparer_identifier),
3936 &(iso9660->application_identifier),
3942 &(iso9660->copyright_file_identifier),
3948 &(iso9660->abstract_file_identifier),
3954 &(iso9660->bibliographic_file_identifier),
3959 set_date_time(bp+814, iso9660->birth_time);
3961 set_date_time(bp+831, iso9660->birth_time);
3965 set_date_time(bp+865, iso9660->birth_time);
3984 struct iso9660 *iso9660;
3987 iso9660 = a->format_data;
3998 iso9660->el_torito.catalog->file->content.location);
4055 struct iso9660 *iso9660;
4063 iso9660 = (struct iso9660 *)a->format_data;
4079 __time64_t iso9660_birth_time_tmp = (__time64_t) iso9660->birth_time; //time_t may be shorter than 64 bits
4083 ctime_r(&(iso9660->birth_time), buf);
4085 strncpy(buf, ctime(&(iso9660->birth_time)), sizeof(buf)-1);
4090 if (iso9660->opt.abstract_file != OPT_ABSTRACT_FILE_DEFAULT)
4092 KEY_STR, iso9660->abstract_file_identifier.s);
4093 if (iso9660->opt.application_id != OPT_APPLICATION_ID_DEFAULT)
4095 KEY_STR, iso9660->application_identifier.s);
4096 if (iso9660->opt.allow_vernum != OPT_ALLOW_VERNUM_DEFAULT)
4098 KEY_FLG, iso9660->opt.allow_vernum);
4099 if (iso9660->opt.biblio_file != OPT_BIBLIO_FILE_DEFAULT)
4101 KEY_STR, iso9660->bibliographic_file_identifier.s);
4102 if (iso9660->opt.boot != OPT_BOOT_DEFAULT)
4104 KEY_STR, iso9660->el_torito.boot_filename.s);
4105 if (iso9660->opt.boot_catalog != OPT_BOOT_CATALOG_DEFAULT)
4107 KEY_STR, iso9660->el_torito.catalog_filename.s);
4108 if (iso9660->opt.boot_info_table != OPT_BOOT_INFO_TABLE_DEFAULT)
4110 KEY_FLG, iso9660->opt.boot_info_table);
4111 if (iso9660->opt.boot_load_seg != OPT_BOOT_LOAD_SEG_DEFAULT)
4113 KEY_HEX, iso9660->el_torito.boot_load_seg);
4114 if (iso9660->opt.boot_load_size != OPT_BOOT_LOAD_SIZE_DEFAULT)
4116 KEY_INT, iso9660->el_torito.boot_load_size);
4117 if (iso9660->opt.boot_type != OPT_BOOT_TYPE_DEFAULT) {
4119 if (iso9660->opt.boot_type == OPT_BOOT_TYPE_FD)
4121 if (iso9660->opt.boot_type == OPT_BOOT_TYPE_HARD_DISK)
4127 if (iso9660->opt.compression_level != OPT_COMPRESSION_LEVEL_DEFAULT)
4129 KEY_INT, iso9660->zisofs.compression_level);
4131 if (iso9660->opt.copyright_file != OPT_COPYRIGHT_FILE_DEFAULT)
4133 KEY_STR, iso9660->copyright_file_identifier.s);
4134 if (iso9660->opt.iso_level != OPT_ISO_LEVEL_DEFAULT)
4136 KEY_INT, iso9660->opt.iso_level);
4137 if (iso9660->opt.joliet != OPT_JOLIET_DEFAULT) {
4138 if (iso9660->opt.joliet == OPT_JOLIET_LONGNAME)
4143 KEY_FLG, iso9660->opt.joliet);
4145 if (iso9660->opt.limit_depth != OPT_LIMIT_DEPTH_DEFAULT)
4147 KEY_FLG, iso9660->opt.limit_depth);
4148 if (iso9660->opt.limit_dirs != OPT_LIMIT_DIRS_DEFAULT)
4150 KEY_FLG, iso9660->opt.limit_dirs);
4151 if (iso9660->opt.pad != OPT_PAD_DEFAULT)
4153 KEY_FLG, iso9660->opt.pad);
4154 if (iso9660->opt.publisher != OPT_PUBLISHER_DEFAULT)
4156 KEY_STR, iso9660->publisher_identifier.s);
4157 if (iso9660->opt.rr != OPT_RR_DEFAULT) {
4158 if (iso9660->opt.rr == OPT_RR_DISABLED)
4160 KEY_FLG, iso9660->opt.rr);
4161 else if (iso9660->opt.rr == OPT_RR_STRICT)
4164 else if (iso9660->opt.rr == OPT_RR_USEFUL)
4168 if (iso9660->opt.volume_id != OPT_VOLUME_ID_DEFAULT)
4170 KEY_STR, iso9660->volume_identifier.s);
4171 if (iso9660->opt.zisofs != OPT_ZISOFS_DEFAULT)
4173 KEY_FLG, iso9660->opt.zisofs);
4330 calculate_directory_descriptors(struct iso9660 *iso9660, struct vdd *vdd,
4337 bs = get_dir_rec_size(iso9660, isoent, DIR_REC_SELF, vdd->vdd_type);
4338 bs += get_dir_rec_size(iso9660, isoent, DIR_REC_PARENT, vdd->vdd_type);
4341 !iso9660->opt.rr && depth + 1 >= vdd->max_depth))
4356 dr_l = get_dir_rec_size(iso9660, np, DIR_REC_NORMAL,
4373 struct iso9660 *iso9660 = a->format_data;
4382 iso9660, DIR_REC_SELF, vdd->vdd_type);
4384 iso9660, DIR_REC_PARENT, vdd->vdd_type);
4387 !iso9660->opt.rr && depth + 1 >= vdd->max_depth)) {
4402 np, iso9660, DIR_REC_NORMAL,
4411 WD_REMAINING, np, iso9660,
4483 struct iso9660 *iso9660 = a->format_data;
4486 lseek(iso9660->temp_fd, offset, SEEK_SET);
4497 rs = read(iso9660->temp_fd, wb, rsize);
4514 struct iso9660 *iso9660 = a->format_data;
4523 if (iso9660->el_torito.catalog != NULL) {
4530 if (iso9660->el_torito.boot != NULL) {
4531 file = iso9660->el_torito.boot->file;
4545 for (file = iso9660->data_file_list.first;
4583 isofile_init_entry_list(struct iso9660 *iso9660)
4585 iso9660->all_file_list.first = NULL;
4586 iso9660->all_file_list.last = &(iso9660->all_file_list.first);
4590 isofile_add_entry(struct iso9660 *iso9660, struct isofile *file)
4593 *iso9660->all_file_list.last = file;
4594 iso9660->all_file_list.last = &(file->allnext);
4598 isofile_free_all_entries(struct iso9660 *iso9660)
4602 file = iso9660->all_file_list.first;
4611 isofile_init_entry_data_file_list(struct iso9660 *iso9660)
4613 iso9660->data_file_list.first = NULL;
4614 iso9660->data_file_list.last = &(iso9660->data_file_list.first);
4618 isofile_add_data_file(struct iso9660 *iso9660, struct isofile *file)
4621 *iso9660->data_file_list.last = file;
4622 iso9660->data_file_list.last = &(file->datanext);
4714 struct iso9660 *iso9660;
4720 iso9660 = a->format_data;
4736 if (iso9660->opt.joliet) {
4740 if (iso9660->sconv_to_utf16be == NULL) {
4741 iso9660->sconv_to_utf16be =
4744 if (iso9660->sconv_to_utf16be == NULL)
4747 iso9660->sconv_from_utf16be =
4750 if (iso9660->sconv_from_utf16be == NULL)
4759 iso9660->sconv_to_utf16be)) {
5001 struct iso9660 *iso9660 = a->format_data;
5020 __archive_rb_tree_insert_node(&(iso9660->hardlink_rbtree),
5024 &(iso9660->hardlink_rbtree), pathname);
5044 isofile_connect_hardlink_files(struct iso9660 *iso9660)
5050 ARCHIVE_RB_TREE_FOREACH(n, &(iso9660->hardlink_rbtree)) {
5086 isofile_init_hardlinks(struct iso9660 *iso9660)
5092 __archive_rb_tree_init(&(iso9660->hardlink_rbtree), &rb_ops);
5096 isofile_free_hardlinks(struct iso9660 *iso9660)
5100 ARCHIVE_RB_TREE_FOREACH_SAFE(n, &(iso9660->hardlink_rbtree), tmp) {
5101 __archive_rb_tree_remove_node(&(iso9660->hardlink_rbtree), n);
5188 isoent_create_virtual_dir(struct archive_write *a, struct iso9660 *iso9660, const char *pathname)
5208 isofile_add_entry(iso9660, file);
5358 isoent_setup_directory_location(struct iso9660 *iso9660, int location,
5371 iso9660, vdd, np, depth);
5399 _isoent_file_location(struct iso9660 *iso9660, struct isoent *isoent,
5416 if (np == iso9660->el_torito.boot)
5439 isoent_setup_file_location(struct iso9660 *iso9660, int location)
5451 iso9660->total_file_block = 0;
5452 if ((isoent = iso9660->el_torito.catalog) != NULL) {
5457 iso9660->total_file_block += block;
5459 if ((isoent = iso9660->el_torito.boot) != NULL) {
5461 size = fd_boot_image_size(iso9660->el_torito.media_type);
5467 iso9660->total_file_block += block;
5473 if (!iso9660->opt.rr && iso9660->opt.joliet) {
5475 np = iso9660->joliet.rootent;
5478 np = iso9660->primary.rootent;
5481 _isoent_file_location(iso9660, np, &symlocation);
5485 ((iso9660->opt.rr == OPT_RR_DISABLED &&
5486 depth + 2 < iso9660->primary.max_depth) ||
5487 (iso9660->opt.rr &&
5488 depth + 1 < iso9660->primary.max_depth)))) {
5507 for (file = iso9660->data_file_list.first;
5522 iso9660->total_file_block += total_block;
5558 struct iso9660 *iso9660 = a->format_data;
5565 dent = iso9660->primary.rootent;
5576 if (archive_strlen(&(iso9660->cur_dirstr))
5578 strcmp(iso9660->cur_dirstr.s, fn) == 0) {
5579 if (!isoent_add_child_tail(iso9660->cur_dirent, isoent)) {
5581 &(iso9660->cur_dirent->rbtree),
5637 vp = isoent_create_virtual_dir(a, iso9660, as.s);
5648 if (vp->file->dircnt > iso9660->dircnt_max)
5649 iso9660->dircnt_max = vp->file->dircnt;
5671 iso9660->cur_dirent = dent;
5672 archive_string_empty(&(iso9660->cur_dirstr));
5673 archive_string_ensure(&(iso9660->cur_dirstr),
5678 iso9660->cur_dirstr.s[0] = 0;
5681 archive_string_copy(&(iso9660->cur_dirstr),
5683 archive_strappend_char(&(iso9660->cur_dirstr), '/');
5685 archive_string_concat(&(iso9660->cur_dirstr),
5806 idr_init(struct iso9660 *iso9660, struct vdd *vdd, struct idr *idr)
5812 if (iso9660->opt.iso_level <= 3) {
5976 struct iso9660 *iso9660;
5990 iso9660 = a->format_data;
5992 if (iso9660->opt.iso_level <= 3) {
5996 allow_vernum = iso9660->opt.allow_vernum;
5997 if (iso9660->opt.iso_level == 1) {
6009 if (iso9660->opt.rr)
6100 if (iso9660->opt.iso_level == 1) {
6171 if (iso9660->opt.iso_level == 1) {
6226 struct iso9660 *iso9660;
6239 iso9660 = a->format_data;
6240 if (iso9660->opt.joliet == OPT_JOLIET_LONGNAME)
6292 if (archive_strncpy_l(&iso9660->mbs,
6294 iso9660->sconv_from_utf16be) != 0 &&
6300 np->mb_len = (int)iso9660->mbs.length;
6550 struct iso9660 *iso9660 = a->format_data;
6557 idr_init(iso9660, vdd, &idr);
6569 iso9660->birth_time, 0);
6571 iso9660->birth_time, 0);
6573 iso9660->birth_time, 0);
6577 !iso9660->opt.rr && depth + 1 >= vdd->max_depth) {
6579 iso9660->directories_too_deep = np;
6661 struct iso9660 *iso9660 = a->format_data;
6665 struct isoent *rootent = iso9660->primary.rootent;
6669 rrmoved = isoent_create_virtual_dir(a, iso9660, "rr_moved");
6680 path_table_add_entry(&(iso9660->primary.pathtbl[1]), rrmoved);
6741 struct iso9660 *iso9660 = a->format_data;
6747 pt = &(iso9660->primary.pathtbl[MAX_DEPTH-1]);
6752 rootent = iso9660->primary.rootent;
6788 isoent_collect_dirs(&(iso9660->primary),
6988 struct iso9660 *iso9660 = a->format_data;
6995 if (iso9660->dircnt_max >= MAX_DEPTH &&
6996 (!iso9660->opt.limit_depth || iso9660->opt.iso_level == 4))
6997 r = isoent_alloc_path_table(a, &(iso9660->primary),
6998 iso9660->dircnt_max + 1);
7002 r = isoent_alloc_path_table(a, &(iso9660->primary),
7006 if (iso9660->opt.joliet) {
7007 r = isoent_alloc_path_table(a, &(iso9660->joliet),
7008 iso9660->dircnt_max + 1);
7016 isoent_collect_dirs(&(iso9660->primary), NULL, 0);
7017 if (iso9660->opt.joliet)
7018 isoent_collect_dirs(&(iso9660->joliet), NULL, 0);
7022 if (iso9660->opt.rr) {
7029 isofile_connect_hardlink_files(iso9660);
7037 r = isoent_traverse_tree(a, &(iso9660->primary));
7040 if (iso9660->opt.joliet) {
7041 r = isoent_traverse_tree(a, &(iso9660->joliet));
7051 for (depth = 0; depth < iso9660->primary.max_depth; depth++) {
7052 r = isoent_make_path_table_2(a, &(iso9660->primary),
7057 if (iso9660->opt.joliet) {
7059 for (depth = 0; depth < iso9660->joliet.max_depth; depth++) {
7060 r = isoent_make_path_table_2(a, &(iso9660->joliet),
7066 if (iso9660->opt.limit_dirs && dir_number > 0xffff) {
7079 calculate_path_table_size(&(iso9660->primary));
7080 if (iso9660->opt.joliet)
7081 calculate_path_table_size(&(iso9660->joliet));
7089 struct iso9660 *iso9660 = a->format_data;
7092 iso9660->el_torito.boot = isoent_find_entry(rootent,
7093 iso9660->el_torito.boot_filename.s);
7094 if (iso9660->el_torito.boot == NULL) {
7097 iso9660->el_torito.boot_filename.s);
7100 iso9660->el_torito.boot->file->boot = BOOT_IMAGE;
7107 struct iso9660 *iso9660 = a->format_data;
7123 iso9660->el_torito.catalog_filename.s);
7125 archive_entry_set_mtime(file->entry, iso9660->birth_time, 0);
7126 archive_entry_set_atime(file->entry, iso9660->birth_time, 0);
7127 archive_entry_set_ctime(file->entry, iso9660->birth_time, 0);
7139 isofile_add_entry(iso9660, file);
7153 iso9660->el_torito.catalog = isoent;
7157 switch (iso9660->opt.boot_type) {
7161 entry = iso9660->el_torito.boot->file->entry;
7163 iso9660->el_torito.media_type =
7166 iso9660->el_torito.media_type =
7169 iso9660->el_torito.media_type =
7174 iso9660->el_torito.media_type =
7178 iso9660->el_torito.media_type = BOOT_MEDIA_NO_EMULATION;
7181 iso9660->el_torito.media_type = BOOT_MEDIA_HARD_DISK;
7184 entry = iso9660->el_torito.boot->file->entry;
7186 iso9660->el_torito.media_type =
7189 iso9660->el_torito.media_type =
7192 iso9660->el_torito.media_type =
7198 iso9660->el_torito.boot_filename.s);
7209 iso9660->el_torito.system_type = 0;
7214 if (iso9660->opt.publisher)
7215 archive_string_copy(&(iso9660->el_torito.id),
7216 &(iso9660->publisher_identifier));
7247 struct iso9660 *iso9660 = a->format_data;
7261 p[1] = iso9660->el_torito.platform_id;
7265 if (archive_strlen(&(iso9660->el_torito.id)) > 0)
7266 strncpy((char *)p+4, iso9660->el_torito.id.s, 23);
7287 p[1] = iso9660->el_torito.media_type;
7289 if (iso9660->el_torito.media_type == BOOT_MEDIA_NO_EMULATION)
7290 set_num_721(&p[2], iso9660->el_torito.boot_load_seg);
7294 p[4] = iso9660->el_torito.system_type;
7298 if (iso9660->el_torito.media_type == BOOT_MEDIA_NO_EMULATION)
7299 set_num_721(&p[6], iso9660->el_torito.boot_load_size);
7304 iso9660->el_torito.boot->file->content.location);
7314 struct iso9660 *iso9660 = a->format_data;
7320 np = iso9660->el_torito.boot;
7321 lseek(iso9660->temp_fd,
7339 rs = read(iso9660->temp_fd, buff, rsize);
7355 size = fd_boot_image_size(iso9660->el_torito.media_type);
7365 lseek(iso9660->temp_fd,
7375 struct iso9660 *iso9660 = a->format_data;
7378 iso9660->zisofs.stream.next_in = NULL;
7379 iso9660->zisofs.stream.avail_in = 0;
7380 iso9660->zisofs.stream.total_in = 0;
7381 iso9660->zisofs.stream.total_out = 0;
7382 if (iso9660->zisofs.stream_valid)
7383 r = deflateReset(&(iso9660->zisofs.stream));
7385 r = deflateInit(&(iso9660->zisofs.stream),
7386 iso9660->zisofs.compression_level);
7387 iso9660->zisofs.stream_valid = 1;
7417 struct iso9660 *iso9660 = a->format_data;
7424 iso9660->zisofs.detect_magic = 0;
7425 iso9660->zisofs.making = 0;
7427 if (!iso9660->opt.rr || !iso9660->opt.zisofs)
7433 iso9660->zisofs.detect_magic = 1;
7434 iso9660->zisofs.magic_cnt = 0;
7436 if (!iso9660->zisofs.detect_magic)
7461 iso9660->zisofs.block_pointers_cnt = (int)_ceil + 1;
7462 iso9660->zisofs.block_pointers_idx = 0;
7465 bpsize = iso9660->zisofs.block_pointers_cnt *
7466 sizeof(iso9660->zisofs.block_pointers[0]);
7467 if (iso9660->zisofs.block_pointers_allocated < bpsize) {
7468 free(iso9660->zisofs.block_pointers);
7469 iso9660->zisofs.block_pointers = malloc(bpsize);
7470 if (iso9660->zisofs.block_pointers == NULL) {
7475 iso9660->zisofs.block_pointers_allocated = bpsize;
7490 archive_le32enc(&(iso9660->zisofs.block_pointers[0]),
7492 iso9660->zisofs.remaining = file->zisofs.uncompressed_size;
7493 iso9660->zisofs.making = 1;
7494 iso9660->zisofs.allzero = 1;
7495 iso9660->zisofs.block_offset = tsize;
7496 iso9660->zisofs.total_size = tsize;
7497 iso9660->cur_file->cur_content->size = tsize;
7506 struct iso9660 *iso9660 = a->format_data;
7507 struct isofile *file = iso9660->cur_file;
7519 if ((int64_t)sizeof(iso9660->zisofs.magic_buffer) > entry_size)
7522 magic_max = sizeof(iso9660->zisofs.magic_buffer);
7524 if (iso9660->zisofs.magic_cnt == 0 && s >= (size_t)magic_max)
7528 if (iso9660->zisofs.magic_cnt < magic_max) {
7531 l = sizeof(iso9660->zisofs.magic_buffer)
7532 - iso9660->zisofs.magic_cnt;
7535 memcpy(iso9660->zisofs.magic_buffer
7536 + iso9660->zisofs.magic_cnt, buff, l);
7537 iso9660->zisofs.magic_cnt += (int)l;
7538 if (iso9660->zisofs.magic_cnt < magic_max)
7541 magic_buff = iso9660->zisofs.magic_buffer;
7543 iso9660->zisofs.detect_magic = 0;
7587 iso9660->zisofs.making = 0;
7598 struct iso9660 *iso9660 = a->format_data;
7599 struct isofile *file = iso9660->cur_file;
7605 zstrm = &(iso9660->zisofs.stream);
7616 iso9660->zisofs.remaining -= avail;
7617 if (iso9660->zisofs.remaining <= 0)
7626 if (iso9660->zisofs.allzero) {
7632 iso9660->zisofs.allzero = 0;
7643 if (flush == Z_FINISH && iso9660->zisofs.allzero &&
7645 if (iso9660->zisofs.block_offset !=
7651 iso9660->zisofs.block_offset);
7655 iso9660->zisofs.block_offset;
7657 iso9660->zisofs.total_size -= diff;
7674 iso9660->zisofs.total_size += csize;
7675 iso9660->cur_file->cur_content->size += csize;
7693 iso9660->zisofs.block_pointers_idx ++;
7694 archive_le32enc(&(iso9660->zisofs.block_pointers[
7695 iso9660->zisofs.block_pointers_idx]),
7696 (uint32_t)iso9660->zisofs.total_size);
7700 iso9660->zisofs.allzero = 1;
7701 iso9660->zisofs.block_offset = file->cur_content->size;
7711 struct iso9660 *iso9660 = a->format_data;
7712 struct isofile *file = iso9660->cur_file;
7718 archive_entry_set_size(file->entry, iso9660->zisofs.total_size);
7768 s = iso9660->zisofs.block_pointers_cnt *
7769 sizeof(iso9660->zisofs.block_pointers[0]);
7770 if (wb_write_to_temp(a, iso9660->zisofs.block_pointers, s)
7783 struct iso9660 *iso9660 = a->format_data;
7786 free(iso9660->zisofs.block_pointers);
7787 if (iso9660->zisofs.stream_valid &&
7788 deflateEnd(&(iso9660->zisofs.stream)) != Z_OK) {
7793 iso9660->zisofs.block_pointers = NULL;
7794 iso9660->zisofs.stream_valid = 0;
8021 struct iso9660 *iso9660 = a->format_data;
8030 file = iso9660->el_torito.boot->file;
8045 fd = iso9660->temp_fd;
8072 rs = read(iso9660->temp_fd, rbuff, rsize);
8137 struct iso9660 *iso9660 = a->format_data;
8139 if (iso9660->el_torito.boot->file->zisofs.header_size != 0) {