1 /*
2  * Copyright (c) 2007 Vreixo Formoso
3  * Copyright (c) 2009 - 2019 Thomas Schmitt
4  *
5  * This file is part of the libisofs project; you can redistribute it and/or
6  * modify it under the terms of the GNU General Public License version 2
7  * or later as published by the Free Software Foundation.
8  * See COPYING file for details.
9  */
10 
11 #ifndef LIBISO_ECMA119_H_
12 #define LIBISO_ECMA119_H_
13 
14 #include "libisofs.h"
15 #include "util.h"
16 #include "buffer.h"
17 
18 #ifdef HAVE_STDINT_H
19 #include <stdint.h>
20 #else
21 #ifdef HAVE_INTTYPES_H
22 #include <inttypes.h>
23 #endif
24 #endif
25 
26 #include <pthread.h>
27 
28 #define BLOCK_SIZE      2048
29 
30 /*
31  * Maximum file section size. Set to 4GB - 1 =  0xffffffff
32  */
33 #define MAX_ISO_FILE_SECTION_SIZE   0xffffffff
34 
35 /*
36  * When a file need to be split in several sections, the maximum size
37  * of such sections, but the last one. Set to a multiple of BLOCK_SIZE.
38  * Default to 4GB - 2048 = 0xFFFFF800
39  */
40 #define ISO_EXTENT_SIZE             0xFFFFF800
41 
42 /*
43  * The maximum number of partition images that can be registered. Depending
44  * on the system area type, the effectively usable number may be smaller or
45  * even 0.
46  */
47 #define ISO_MAX_PARTITIONS 8
48 
49 /*
50  * The cylindersize with SUN Disk Label
51  * (512 bytes/sector, 640 sectors/head, 1 head/cyl = 320 KiB).
52  * Expressed in ECMA-119 blocks of 2048 bytes/block.
53  */
54 #define ISO_SUN_CYL_SIZE 160
55 
56 /*
57  * Maximum length of a disc label text plus 1.
58  */
59 #define ISO_DISC_LABEL_SIZE 129
60 
61 
62 /* The maximum length of an specs violating ECMA-119 file identifier.
63    The theoretical limit is  254 - 34 - 28 (len of SUSP CE entry) = 192
64    Currently the practical limit is 254 - 34 - 96 (non-CE RR entries) - 28 (CE)
65 */
66 #ifdef Libisofs_with_rrip_rR
67 #define ISO_UNTRANSLATED_NAMES_MAX 92
68 #else
69 #define ISO_UNTRANSLATED_NAMES_MAX 96
70 #endif
71 
72 
73 /* The theoretical maximum number of Apple Partition Map entries in the
74    System Area of an ISO image:
75    Block0 plus 63 entries with block size 512
76 */
77 #define ISO_APM_ENTRIES_MAX 63
78 
79 /* The maximum number of MBR partition table entries.
80 */
81 #define ISO_MBR_ENTRIES_MAX  4
82 
83 /* The theoretical maximum number of GPT entries in the System Area of an
84    ISO image:
85    MBR plus GPT header block plus 248 GPT entries of 128 bytes each.
86 */
87 #define ISO_GPT_ENTRIES_MAX 248
88 
89 
90 /* How many warnings to issue about writing Joliet names which cannot be
91    properly represented in UCS-2 and thus had to be defaulted to '_'.
92 */
93 #define ISO_JOLIET_UCS2_WARN_MAX 3
94 
95 
96 /**
97  * Holds the options for the image generation.
98  */
99 struct iso_write_opts {
100 
101     int will_cancel;
102 
103     int iso_level; /**< ISO level to write at. (ECMA-119, 10) */
104 
105     /** Which extensions to support. */
106     unsigned int rockridge :1;
107     unsigned int joliet :1;
108     unsigned int iso1999 :1;
109     unsigned int hfsplus :1;
110     unsigned int fat :1;
111 
112     unsigned int aaip :1; /* whether to write eventual ACL and EAs */
113 
114     /* always write timestamps in GMT */
115     unsigned int always_gmt :1;
116 
117     /*
118      * Relaxed constraints. Setting any of these to 1 break the specifications,
119      * but it is supposed to work on most moderns systems. Use with caution.
120      */
121 
122     /**
123      * Convert directory names for ECMA-119 the same way as other file names
124      * but do not force dots or add version numbers.
125      * This violates ECMA-119 by allowing one "." and especially ISO level 1
126      * by allowing DOS style 8.3 names rather than only 8 characters.
127      */
128     unsigned int allow_dir_id_ext :1;
129 
130     /**
131      * Omit the version number (";1") at the end of the ISO-9660 identifiers.
132      * Version numbers are usually not used.
133      * bit0= ECMA-119 and Joliet (for historical reasons)
134      * bit1= Joliet
135      */
136     unsigned int omit_version_numbers :2;
137 
138     /**
139      * Allow ISO-9660 directory hierarchy to be deeper than 8 levels.
140      */
141     unsigned int allow_deep_paths :1;
142 
143     /**
144      * Allow path in the ISO-9660 tree to have more than 255 characters.
145      */
146     unsigned int allow_longer_paths :1;
147 
148     /**
149      * Allow a single file or directory hierarchy to have up to 37 characters.
150      * This is larger than the 31 characters allowed by ISO level 2, and the
151      * extra space is taken from the version number, so this also forces
152      * omit_version_numbers.
153      */
154     unsigned int max_37_char_filenames :1;
155 
156     /**
157      * ISO-9660 forces filenames to have a ".", that separates file name from
158      * extension. libisofs adds it if original filename doesn't has one. Set
159      * this to 1 to prevent this behavior
160      * bit0= ECMA-119
161      * bit1= Joliet
162      */
163     unsigned int no_force_dots :2;
164 
165     /**
166      * Allow lowercase characters in ISO-9660 filenames. By default, only
167      * uppercase characters, numbers and a few other characters are allowed.
168      */
169     unsigned int allow_lowercase :1;
170 
171     /**
172      * Allow all ASCII characters to be appear on an ISO-9660 filename. Note
173      * that "/" and "\0" characters are never allowed, even in RR names.
174      */
175     unsigned int allow_full_ascii :1;
176 
177     /**
178      * If not allow_full_ascii is set: allow all 7 bit characters that would
179      * be allowed by allow_full_ascii. But still map lowercase to uppercase if
180      * not allow_lowercase is set to 1.
181      */
182     unsigned int allow_7bit_ascii :1;
183 
184     /**
185      * Allow all characters to be part of Volume and Volset identifiers on
186      * the Primary Volume Descriptor. This breaks ISO-9660 constraints, but
187      * should work on modern systems.
188      */
189     unsigned int relaxed_vol_atts :1;
190 
191     /**
192      * Allow paths in the Joliet tree to have more than 240 characters.
193      */
194     unsigned int joliet_longer_paths :1;
195 
196     /**
197      * Allow Joliet names up to 103 characters rather than 64.
198      */
199     unsigned int joliet_long_names :1;
200 
201     /**
202      * Use UTF-16BE rather than its subset UCS-2
203      */
204     unsigned int joliet_utf16 :1;
205 
206     /**
207      * Write Rock Ridge info as of specification RRIP-1.10 rather than
208      * RRIP-1.12: signature "RRIP_1991A" rather than "IEEE_1282",
209      *            field PX without file serial number
210      */
211     unsigned int rrip_version_1_10 :1;
212 
213     /**
214      * Write field PX with file serial number even with RRIP-1.10
215      */
216     unsigned int rrip_1_10_px_ino :1;
217 
218     /**
219      * See iso_write_opts_set_hardlinks()
220      */
221     unsigned int hardlinks:1;
222 
223     /**
224      * Write AAIP as extension according to SUSP 1.10 rather than SUSP 1.12.
225      * I.e. without announcing it by an ER field and thus without the need
226      * to precede the RRIP fields by an ES and to precede the AA field by ES.
227      * This saves bytes and might avoid problems with readers which dislike
228      * ER fields other than the ones for RRIP.
229      * On the other hand, SUSP 1.12 frowns on such unannounced extensions
230      * and prescribes ER and ES. It does this since year 1994.
231      *
232      * In effect only if above flag .aaip is set to 1.
233      */
234     unsigned int aaip_susp_1_10 :1;
235 
236     /**
237      * Store as ECMA-119 Directory Record timestamp the mtime of the source
238      * rather than the image creation time. (The ECMA-119 prescription seems
239      * to expect that we do have a creation timestamp with the source.
240      * mkisofs writes mtimes and the result seems more suitable if mounted
241      * without Rock Ridge support.)
242      * bit0= ECMA-119, bit1= Joliet, bit2= ISO 9660:1999
243      */
244     unsigned int dir_rec_mtime :3;
245 
246     /**
247      * This describes the directory where to store Rock Ridge relocated
248      * directories.
249      * If not relaxation "allow_deep_paths" is in effect, it is necessary to
250      * relocate directories so that no ECMA-119 file path has more than
251      * 8 components. For Rock Ridge the relocated directories are linked forth
252      * and back to a placeholder at their original position in path level 8
253      * (entries CL and PL). Directories marked by entry RE are to be considered
254      * artefacts of relocation and shall not be read into a Rock Ridge tree.
255      * For plain ECMA-119, the relocation directory is just a normal directory
256      * which contains normal files and directories.
257      */
258     char *rr_reloc_dir;          /* IsoNode name in root directory */
259     int rr_reloc_flags;          /* bit0= mark auto-created rr_reloc_dir by RE
260                                     bit1= directory was auto-created
261                                           (cannot be set via API)
262                                  */
263 
264     /**
265      * Compute MD5 checksum for the whole session and record it as index 0 of
266      * the checksum blocks after the data area of the session. The layout and
267      * position of these blocks will be recorded in xattr "isofs.ca" of the
268      * root node. See see also API call iso_image_get_session_md5().
269      */
270     unsigned int md5_session_checksum :1;
271 
272     /**
273      * Compute MD5 checksums for IsoFile objects and write them to blocks
274      * after the data area of the session. The layout and position of these
275      * blocks will be recorded in xattr "isofs.ca" of the root node.
276      * The indice of the MD5 sums will be recorded with the IsoFile directory
277      * entries as xattr "isofs.cx". See also API call iso_file_get_md5().
278      * bit0= compute individual checksums
279      * bit1= pre-compute checksum and compare it with actual one.
280      *       Raise MISHAP if mismatch.
281      */
282     unsigned int md5_file_checksums :2;
283 
284     /** If files should be sorted based on their weight. */
285     unsigned int sort_files :1;
286 
287     /**
288      * The following options set the default values for files and directory
289      * permissions, gid and uid. All these take one of three values: 0, 1 or 2.
290      * If 0, the corresponding attribute will be kept as set in the IsoNode.
291      * Unless you have changed it, it corresponds to the value on disc, so it
292      * is suitable for backup purposes. If set to 1, the corresponding attrib.
293      * will be changed by a default suitable value. Finally, if you set it to
294      * 2, the attrib. will be changed with the value specified in the options
295      * below. Note that for mode attributes, only the permissions are set, the
296      * file type remains unchanged.
297      */
298     unsigned int replace_dir_mode :2;
299     unsigned int replace_file_mode :2;
300     unsigned int replace_uid :2;
301     unsigned int replace_gid :2;
302 
303     mode_t dir_mode; /** Mode to use on dirs when replace_dir_mode == 2. */
304     mode_t file_mode; /** Mode to use on files when replace_file_mode == 2. */
305     uid_t uid; /** uid to use when replace_uid == 2. */
306     gid_t gid; /** gid to use when replace_gid == 2. */
307 
308     /**
309      * See API call iso_write_opts_set_old_empty().
310      */
311     unsigned int old_empty :1;
312 
313     /**
314      * Extra Caution: This option breaks any assumptions about names that
315      *                are supported by ECMA-119 specifications.
316      * Omit any translation which would make a file name compliant to the
317      * ECMA-119 rules. This includes and exceeds omit_version_numbers,
318      * max_37_char_filenames, no_force_dots bit0, allow_lowercase.
319      * The maximum name length is given by this variable.
320      * There is a length limit of ISO_UNTRANSLATED_NAMES_MAX characters,
321      * because ECMA-119 allows 254 byte in a directory record, some
322      * of them are occupied by ECMA-119, some more are needed for SUSP CE,
323      * and some are fixely occupied by libisofs Rock Ridge code.
324      * The default value 0 disables this feature.
325      */
326     unsigned int untranslated_name_len;
327 
328     /**
329      * 0 to use IsoNode timestamps, 1 to use recording time, 2 to use
330      * values from timestamp field. This has only meaning if RR extensions
331      * are enabled.
332      */
333     unsigned int replace_timestamps :2;
334     time_t timestamp;
335 
336     /**
337      * Charset for the RR filenames that will be created.
338      * NULL to use default charset, the locale one.
339      */
340     char *output_charset;
341 
342     /**
343      * This flags control the type of the image to create. Libisofs support
344      * two kind of images: stand-alone and appendable.
345      *
346      * A stand-alone image is an image that is valid alone, and that can be
347      * mounted by its own. This is the kind of image you will want to create
348      * in most cases. A stand-alone image can be burned in an empty CD or DVD,
349      * or write to an .iso file for future burning or distribution.
350      *
351      * On the other side, an appendable image is not self contained, it refers
352      * to several files that are stored outside the image. Its usage is for
353      * multisession discs, where you add data in a new session, while the
354      * previous session data can still be accessed. In those cases, the old
355      * data is not written again. Instead, the new image refers to it, and thus
356      * it's only valid when appended to the original. Note that in those cases
357      * the image will be written after the original, and thus you will want
358      * to use a ms_block greater than 0.
359      *
360      * Note that if you haven't import a previous image (by means of
361      * iso_image_import()), the image will always be a stand-alone image, as
362      * there is no previous data to refer to.
363      */
364     unsigned int appendable : 1;
365 
366     /**
367      * Start block of the image. It is supposed to be the lba where the first
368      * block of the image will be written on disc. All references inside the
369      * ISO image will take this into account, thus providing a mountable image.
370      *
371      * For appendable images, that are written to a new session, you should
372      * pass here the lba of the next writable address on disc.
373      *
374      * In stand alone images this is usually 0. However, you may want to
375      * provide a different ms_block if you don't plan to burn the image in the
376      * first session on disc, such as in some CD-Extra disc whether the data
377      * image is written in a new session after some audio tracks.
378      */
379     uint32_t ms_block;
380 
381     /**
382      * When not NULL, it should point to a buffer of at least 64KiB, where
383      * libisofs will write the contents that should be written at the beginning
384      * of a overwritable media, to grow the image. The growing of an image is
385      * a way, used by first time in growisofs by Andy Polyakov, to allow the
386      * appending of new data to non-multisession media, such as DVD+RW, in the
387      * same way you append a new session to a multisession disc, i.e., without
388      * need to write again the contents of the previous image.
389      *
390      * Note that if you want this kind of image growing, you will also need to
391      * set appendable to "1" and provide a valid ms_block after the previous
392      * image.
393      *
394      * You should initialize the buffer either with 0s, or with the contents of
395      * the first blocks of the image you're growing. In most cases, 0 is good
396      * enough.
397      */
398     uint8_t *overwrite;
399 
400     /**
401      * Size, in number of blocks, of the FIFO buffer used between the writer
402      * thread and the burn_source. You have to provide at least a 32 blocks
403      * buffer.
404      */
405     size_t fifo_size;
406 
407     /**
408      * This is not an option setting but a value returned after the options
409      * were used to compute the layout of the image.
410      * It tells the LBA of the first plain file data block in the image.
411      */
412     uint32_t data_start_lba;
413 
414     /**
415      * If not empty: A text holding parameters "name" and "timestamp" for
416      * a scdbackup stream checksum tag. See scdbackup/README appendix VERIFY.
417      * It makes sense only for single session images which start at LBA 0.
418      * Such a tag may be part of a libisofs checksum tag block after the
419      * session tag line. It then covers the whole session up to its own start
420      * position.
421      */
422     char scdbackup_tag_parm[100];
423 
424     /* If not NULL: A pointer to an application provided array with
425        at least 512 characters. The effectively written scdbackup tag
426        will be copied to this memory location.
427      */
428     char *scdbackup_tag_written;
429 
430     /*
431      * See ecma119_image : System Area related information
432      */
433     char *system_area_data;
434     int system_area_size;
435     int system_area_options;
436 
437     /* User settable PVD time stamps */
438     time_t vol_creation_time;
439     time_t vol_modification_time;
440     time_t vol_expiration_time;
441     time_t vol_effective_time;
442     /* To eventually override vol_creation_time and vol_modification_time
443      * by unconverted string with timezone 0
444      */
445     char vol_uuid[17];
446 
447     /* The number of unclaimed 2K blocks before start of partition 1 as of
448        the MBR in system area.
449        Must be 0 or >= 16. (Actually >= number of voldescr + checksum tag)
450     */
451     uint32_t partition_offset;
452     /* Partition table parameter: 1 to 63, 0= disabled/default */
453     int partition_secs_per_head;
454     /* 1 to 255, 0= disabled/default */
455     int partition_heads_per_cyl;
456 
457 #ifdef Libisofs_with_libjtE
458     /* Parameters and state of Jigdo Template Export environment.
459     */
460     struct libjte_env *libjte_handle;
461 #endif /* Libisofs_with_libjtE */
462 
463     /* A trailing padding of zero bytes which belongs to the image
464     */
465     uint32_t tail_blocks;
466 
467     /* Eventual disk file path of a PreP partition which shall be prepended
468        to HFS+/FAT and IsoFileSrc areas and marked by an MBR partition entry.
469     */
470     char *prep_partition;
471     int prep_part_flag;
472 
473     /* Eventual disk file path of an EFI system partition image which shall
474        be prepended to HFS+/FAT and IsoFileSrc areas and marked by a GPT entry.
475     */
476     char *efi_boot_partition;
477     int efi_boot_part_flag;
478 
479     /* Disk file paths of prepared images which shall be appended
480        after the ISO image and described by partition table entries in a MBR.
481        NULL means unused.
482     */
483     char *appended_partitions[ISO_MAX_PARTITIONS];
484     uint8_t appended_part_types[ISO_MAX_PARTITIONS];
485     int appended_part_flags[ISO_MAX_PARTITIONS];
486     uint8_t appended_part_type_guids[ISO_MAX_PARTITIONS][16];
487 
488     /* Flags in case that appended partitions show up in GPT:
489        bit0= appended_part_type_guids is valid
490     */
491     uint8_t appended_part_gpt_flags[ISO_MAX_PARTITIONS];
492 
493     /* If 1: With appended partitions: create protective MBR and mark by GPT
494      */
495     int appended_as_gpt;
496 
497     /* If 1: With appended partitions: mark by APM partition
498      */
499     int appended_as_apm;
500 
501     /* If 1: Obey struct el_torito_boot_image.isolinux_options bit2-7 and bit8.
502              I.e. mention boot image as partition in GPT and/or APM.
503      */
504     int part_like_isohybrid;
505 
506     /* The type to use for the mountable ISO partition if there is any and if
507        the type is not mandatorily determined for particular circumstances like
508        compliant GPT, CHRP, or PReP.
509        -1 = use the default value (e.g. 0xcd, 0x83, 0x17)
510        0x00 to 0xff = value to use if possible
511     */
512     int iso_mbr_part_type;
513 
514     /* iso_write_opts_set_iso_type_guid
515      */
516     uint8_t iso_gpt_type_guid[16];
517     /* bit0= iso_gpt_type_guid is valid
518     */
519     int iso_gpt_flag;
520 
521 
522     /* Eventual name of the non-ISO aspect of the image. E.g. SUN ASCII label.
523      */
524     char ascii_disc_label[ISO_DISC_LABEL_SIZE];
525 
526     /* HFS+ image serial number.
527      * 00...00 means that it shall be generated by libisofs.
528      */
529     uint8_t hfsp_serial_number[8];
530 
531     /* Allocation block size of HFS+ : 0= auto , 512, or 2048
532      */
533     int hfsp_block_size;
534 
535     /* Block size of and in APM : 0= auto , 512, or 2048
536      */
537     int apm_block_size;
538 
539     /* User defined GUID for GPT header and base of reproducible partition
540        GUIDs. (Not to be confused with volume "UUID", which is actually a
541        timestamp.)
542        See API call iso_write_opts_set_gpt_guid().
543      */
544     uint8_t gpt_disk_guid[16];
545     int gpt_disk_guid_mode;
546 };
547 
548 typedef struct ecma119_image Ecma119Image;
549 typedef struct ecma119_node Ecma119Node;
550 typedef struct joliet_node JolietNode;
551 typedef struct iso1999_node Iso1999Node;
552 typedef struct hfsplus_node HFSPlusNode;
553 typedef struct Iso_File_Src IsoFileSrc;
554 typedef struct Iso_Image_Writer IsoImageWriter;
555 
556 struct ecma119_image
557 {
558     int refcount;
559 
560     IsoImage *image;
561     Ecma119Node *root;
562 
563     IsoWriteOpts *opts;
564 
565     /** Whether El Torito data will be produced */
566     unsigned int eltorito :1;
567 
568     /* The ECMA-119 directory node where to store Rock Ridge relocated
569        directories. (Path is in IsoWriteOpts.rr_reloc_dir)
570     */
571     Ecma119Node *rr_reloc_node;  /* Directory node in ecma119_image */
572 
573     /*
574      * Mode replace. If one of these flags is set, the correspodent values are
575      * replaced with values below. Both get computed from IsoWriteOpts.
576      */
577     unsigned int replace_uid :1;
578     unsigned int replace_gid :1;
579     unsigned int replace_file_mode :1;
580     unsigned int replace_dir_mode :1;
581     unsigned int replace_timestamps :1;
582 
583     /* Mode replacement values. */
584     uid_t uid;
585     gid_t gid;
586     mode_t file_mode;
587     mode_t dir_mode;
588     time_t timestamp;
589 
590     /* Effective charsets */
591     char *input_charset;
592     char *output_charset;
593 
594     time_t now; /**< Time at which writing began. */
595 
596     /* Total size of the output. Counted in bytes.
597      * Includes ISO filesystem and appended data.
598      */
599     off_t total_size;
600 
601     /** Size actually governed by the ISO filesystem part of the output */
602     uint32_t vol_space_size;
603 
604     /* 1= write the total size into the PVD of the ISO,
605      * 0= write vol_space_size
606      */
607     int pvd_size_is_total_size;
608 
609     /* Bytes already written to image output */
610     off_t bytes_written;
611     /* just for progress notification */
612     int percent_written;
613 
614     /*
615      * Block being processed, either during image writing or structure
616      * size calculation.
617      */
618     uint32_t curblock;
619 
620     /*
621      * The address to be used for the content pointer of empty data files.
622      */
623     uint32_t empty_file_block;
624 
625     /*
626      * The calculated block address after ECMA-119 tree and eventual
627      * tree checksum tag.
628      */
629     uint32_t tree_end_block;
630 
631     /*
632      * number of dirs in ECMA-119 tree, computed together with dir position,
633      * and needed for path table computation in a efficient way
634      */
635     size_t ndirs;
636     uint32_t path_table_size;
637     uint32_t l_path_table_pos;
638     uint32_t m_path_table_pos;
639 
640     /*
641      * Joliet related information
642      */
643     JolietNode *joliet_root;
644     size_t joliet_ndirs;
645     uint32_t joliet_path_table_size;
646     uint32_t joliet_l_path_table_pos;
647     uint32_t joliet_m_path_table_pos;
648     size_t joliet_ucs2_failures;
649 
650     /*
651      * HFS+ related information
652      * (by Vladimir Serbinenko, see libisofs/hfsplus.c)
653      */
654     HFSPlusNode *hfsp_leafs;
655     struct hfsplus_btree_level *hfsp_levels;
656     uint32_t hfsp_nlevels;
657     uint32_t hfsp_part_start;
658     uint32_t hfsp_nfiles;
659     uint32_t hfsp_ndirs;
660     uint32_t hfsp_cat_id;
661     uint32_t hfsp_allocation_blocks;
662     uint32_t hfsp_allocation_file_start;
663     uint32_t hfsp_extent_file_start;
664     uint32_t hfsp_catalog_file_start;
665     uint32_t hfsp_total_blocks;
666     uint32_t hfsp_allocation_size;
667     uint32_t hfsp_nleafs;
668     uint32_t hfsp_curleaf;
669     uint32_t hfsp_nnodes;
670     uint32_t hfsp_bless_id[ISO_HFSPLUS_BLESS_MAX];
671     uint32_t hfsp_collision_count;
672 
673     /*
674      * ISO 9660:1999 related information
675      */
676     Iso1999Node *iso1999_root;
677     size_t iso1999_ndirs;
678     uint32_t iso1999_path_table_size;
679     uint32_t iso1999_l_path_table_pos;
680     uint32_t iso1999_m_path_table_pos;
681 
682     /*
683      * El-Torito related information
684      */
685     struct el_torito_boot_catalog *catalog;
686     IsoFileSrc *cat; /**< location of the boot catalog in the new image */
687 
688     int num_bootsrc;
689     IsoFileSrc **bootsrc; /* location of the boot images in the new image */
690 
691     int *boot_appended_idx; /* Appended partition which serve as boot images */
692 
693     uint32_t *boot_intvl_start;   /* In blocks of 2048 bytes */
694     uint32_t *boot_intvl_size;    /* In blocks of  512 bytes */
695 
696     /*
697      * System Area related information
698      */
699     /* Content of an embedded boot image. Valid if not NULL.
700      * In that case it must point to a memory buffer at least 32 kB.
701      */
702     char *system_area_data;
703     /*
704      * bit0= Only with DOS MBR
705      *       Make bytes 446 - 512 of the system area a partition
706      *       table which reserves partition 1 from byte 63*512 to the
707      *       end of the ISO image. Assumed are 63 secs/hed, 255 head/cyl.
708      *       (GRUB protective msdos label.)
709      *       This works with and without system_area_data.
710      * bit1= Only with DOS MBR
711      *       Apply isohybrid MBR patching to the system area.
712      *       This works only with system_area_data plus ISOLINUX boot image
713      *       and only if not bit0 is set.
714      * bit2-7= System area type
715      *       0= DOS MBR
716      *       1= MIPS Big Endian Volume Header
717      *       2= DEC Boot Block for MIPS Little Endian
718      *       3= SUN Disk Label for SUN SPARC
719      * bit8-9= Only with DOS MBR
720      *       Cylinder alignment mode eventually pads the image to make it
721      *       end at a cylinder boundary.
722      *       0 = auto (align if bit1)
723      *       1 = always align to cylinder boundary
724      *       2 = never align to cylinder boundary
725      *       3 = always align, additionally pad up and align partitions
726      *           which were appended by iso_write_opts_set_partition_img()
727      * bit10-13= System area sub type
728      *       With type 0 = MBR:
729      *         Gets overridden by bit0 and bit1.
730      *         0 = no particular sub type
731      *         1 = CHRP: A single MBR partition of type 0x96 covers the
732      *                   ISO image. Not compatible with any other feature
733      *                   which needs to have own MBR partition entries.
734      */
735     int system_area_options;
736 
737     /*
738      * Number of pad blocks that we need to write. Padding blocks are blocks
739      * filled by 0s that we put between the directory structures and the file
740      * data. These padding blocks are added by libisofs to improve the handling
741      * of image growing. The idea is that the first blocks in the image are
742      * overwritten with the volume descriptors of the new image. These first
743      * blocks usually correspond to the volume descriptors and directory
744      * structure of the old image, and can be safety overwritten. However,
745      * with very small images they might correspond to valid data. To ensure
746      * this never happens, what we do is to add padding bytes, to ensure no
747      * file data is written in the first 64 KiB, that are the bytes we usually
748      * overwrite.
749      */
750     uint32_t mspad_blocks;
751 
752     size_t nwriters;
753     IsoImageWriter **writers;
754 
755     /* tree of files sources */
756     IsoRBTree *files;
757 
758     struct iso_filesrc_list_item *ecma119_hidden_list;
759 
760     unsigned int checksum_idx_counter;
761     void *checksum_ctx;
762     off_t checksum_counter;
763     uint32_t checksum_rlsb_tag_pos;
764     uint32_t checksum_sb_tag_pos;
765     uint32_t checksum_tree_tag_pos;
766     uint32_t checksum_tag_pos;
767     char image_md5[16];
768     char *checksum_buffer;
769     uint32_t checksum_array_pos;
770     uint32_t checksum_range_start;
771     uint32_t checksum_range_size;
772 
773     char *opts_overwrite; /* Points to IsoWriteOpts->overwrite.
774                              Use only underneath ecma119_image_new()
775                              and if not NULL*/
776 
777     /* Buffer for communication between burn_source and writer thread */
778     IsoRingBuffer *buffer;
779 
780     /* writer thread descriptor */
781     pthread_t wthread;
782     int wthread_is_running;
783     pthread_attr_t th_attr;
784 
785     /* Effective partition table parameter: 1 to 63, 0= disabled/default */
786     int partition_secs_per_head;
787     /* 1 to 255, 0= disabled/default */
788     int partition_heads_per_cyl;
789 
790     /* The currently applicable LBA offset. To be subtracted from any LBA
791      *  that is mentioned in volume descriptors, trees, path tables,
792      *  Either 0 or .partition_offset
793      */
794     uint32_t eff_partition_offset;
795 
796     /* The second ECMA-119 directory tree and path tables */
797     Ecma119Node *partition_root;
798     uint32_t partition_l_table_pos;
799     uint32_t partition_m_table_pos;
800 
801     /* The second Joliet directory tree and path tables */
802     JolietNode *j_part_root;
803     uint32_t j_part_l_path_table_pos;
804     uint32_t j_part_m_path_table_pos;
805 
806     /* Memorized ELF parameters from MIPS Little Endian boot file */
807     uint32_t mipsel_e_entry;
808     uint32_t mipsel_p_offset;
809     uint32_t mipsel_p_vaddr;
810     uint32_t mipsel_p_filesz;
811 
812     /* A data file of which the position and size shall be written after
813        a SUN Disk Label.
814     */
815     IsoFileSrc *sparc_core_src;
816 
817     /* Trailing padding of ISO filesystem partition for cylinder alignment */
818     /* Only in effect with Libisofs_part_align_writeR */
819     uint32_t part_align_blocks;
820     uint32_t alignment_end_block;
821 
822     /* Counted in blocks of 2048 */
823     uint32_t appended_part_prepad[ISO_MAX_PARTITIONS];
824     uint32_t appended_part_start[ISO_MAX_PARTITIONS];
825     uint32_t appended_part_size[ISO_MAX_PARTITIONS];
826     int have_appended_partitions;
827 
828     /* See IsoImage and libisofs.h */
829     IsoNode *hfsplus_blessed[ISO_HFSPLUS_BLESS_MAX];
830 
831     /* Block sizes come from write options.
832        Only change a block size if it is 0. Set only to 512 or 2048.
833        If it stays 0 then it will become 512 or 2048 in time.
834     */
835 
836     /* Allocation block size of HFS+
837        May be defined to 512 or 2048 before hfsplus_writer_create().
838     */
839     int hfsp_cat_node_size; /* 2 * hfsp_block_size */
840     int hfsp_iso_block_fac; /* 2048 / hfsp_block_size */
841 
842     /* Apple Partition Map description. To be composed during IsoImageWriter
843        method ->compute_data_blocks() by calling iso_register_apm_entry().
844        Make sure that the composing writers get registered before the
845        gpt_tail_writer.
846     */
847     struct iso_apm_partition_request *apm_req[ISO_APM_ENTRIES_MAX];
848     int apm_req_count;
849     /* bit1= Do not fill gaps in Apple Partition Map
850        bit2= apm_req entries use apm_block_size in start_block and block_count.
851              Normally these two parameters are counted in 2 KiB blocks.
852     */
853     int apm_req_flags;
854 
855     /* MBR partition table description. To be composed during IsoImageWriter
856        method ->compute_data_blocks() by calling iso_register_mbr_entry().
857     */
858     struct iso_mbr_partition_request *mbr_req[ISO_MBR_ENTRIES_MAX];
859     int mbr_req_count;
860 
861     /* Number of bytes which have to be added after the cylinder aligned end
862        of the overall ISO partition because clinder size is not a multiple
863        of 2048
864     */
865     int post_iso_part_pad;
866 
867     uint32_t prep_part_size;
868 
869     /* GPT description. To be composed during IsoImageWriter
870        method ->compute_data_blocks() by calling iso_register_gpt_entry().
871        Make sure that the composing writers get registered before the
872        gpt_tail_writer.
873     */
874     struct iso_gpt_partition_request *gpt_req[ISO_GPT_ENTRIES_MAX];
875     int gpt_req_count;
876     /* bit0= GPT partitions may overlap */
877     int gpt_req_flags;
878 
879     /* Whether the eventual backup GPT is not part of the ISO filesystem */
880     int gpt_backup_outside;
881 
882     /* The base UUID for the generated GPT UUIDs */
883     uint8_t gpt_uuid_base[16];
884     /* The counter which distinguishes the GPT UUIDs */
885     uint32_t gpt_uuid_counter;
886 
887     uint32_t efi_boot_part_size;
888     IsoFileSrc *efi_boot_part_filesrc; /* Just a pointer. Do not free. */
889 
890     /* Messages from gpt_tail_writer_compute_data_blocks() to
891        iso_write_system_area().
892     */
893     uint8_t gpt_disk_guid[16];
894     int gpt_disk_guid_set;
895     /* Start of GPT entries in System Area, block size 512 */
896     uint32_t gpt_part_start;
897     /* The ISO block number after the backup GPT header , block size 2048 */
898     uint32_t gpt_backup_end;
899     uint32_t gpt_backup_size;
900     uint32_t gpt_max_entries;
901     int gpt_is_computed;
902 
903     /* Message from write_head_part1()/iso_write_system_area() to the
904        write_data() methods of the writers.
905     */
906     uint8_t sys_area_as_written[16 * BLOCK_SIZE];
907     int sys_area_already_written;
908 
909     /* Size of the filesrc_writer area (data file content).
910        This is available before any IsoImageWriter.compute_data_blocks()
911        is called.
912     */
913     uint32_t filesrc_start;
914     uint32_t filesrc_blocks;
915 
916 };
917 
918 #define BP(a,b) [(b) - (a) + 1]
919 
920 /* ECMA-119, 8.4 */
921 struct ecma119_pri_vol_desc
922 {
923     uint8_t vol_desc_type            BP(1, 1);
924     uint8_t std_identifier           BP(2, 6);
925     uint8_t vol_desc_version         BP(7, 7);
926     uint8_t unused1                  BP(8, 8);
927     uint8_t system_id                BP(9, 40);
928     uint8_t volume_id                BP(41, 72);
929     uint8_t unused2                  BP(73, 80);
930     uint8_t vol_space_size           BP(81, 88);
931     uint8_t unused3                  BP(89, 120);
932     uint8_t vol_set_size             BP(121, 124);
933     uint8_t vol_seq_number           BP(125, 128);
934     uint8_t block_size               BP(129, 132);
935     uint8_t path_table_size          BP(133, 140);
936     uint8_t l_path_table_pos         BP(141, 144);
937     uint8_t opt_l_path_table_pos     BP(145, 148);
938     uint8_t m_path_table_pos         BP(149, 152);
939     uint8_t opt_m_path_table_pos     BP(153, 156);
940     uint8_t root_dir_record          BP(157, 190);
941     uint8_t vol_set_id               BP(191, 318);
942     uint8_t publisher_id             BP(319, 446);
943     uint8_t data_prep_id             BP(447, 574);
944     uint8_t application_id           BP(575, 702);
945     uint8_t copyright_file_id        BP(703, 739);
946     uint8_t abstract_file_id         BP(740, 776);
947     uint8_t bibliographic_file_id    BP(777, 813);
948     uint8_t vol_creation_time        BP(814, 830);
949     uint8_t vol_modification_time    BP(831, 847);
950     uint8_t vol_expiration_time      BP(848, 864);
951     uint8_t vol_effective_time       BP(865, 881);
952     uint8_t file_structure_version   BP(882, 882);
953     uint8_t reserved1                BP(883, 883);
954     uint8_t app_use                  BP(884, 1395);
955     uint8_t reserved2                BP(1396, 2048);
956 };
957 
958 /* ECMA-119, 8.5 */
959 struct ecma119_sup_vol_desc
960 {
961     uint8_t vol_desc_type            BP(1, 1);
962     uint8_t std_identifier           BP(2, 6);
963     uint8_t vol_desc_version         BP(7, 7);
964     uint8_t vol_flags                BP(8, 8);
965     uint8_t system_id                BP(9, 40);
966     uint8_t volume_id                BP(41, 72);
967     uint8_t unused2                  BP(73, 80);
968     uint8_t vol_space_size           BP(81, 88);
969     uint8_t esc_sequences            BP(89, 120);
970     uint8_t vol_set_size             BP(121, 124);
971     uint8_t vol_seq_number           BP(125, 128);
972     uint8_t block_size               BP(129, 132);
973     uint8_t path_table_size          BP(133, 140);
974     uint8_t l_path_table_pos         BP(141, 144);
975     uint8_t opt_l_path_table_pos     BP(145, 148);
976     uint8_t m_path_table_pos         BP(149, 152);
977     uint8_t opt_m_path_table_pos     BP(153, 156);
978     uint8_t root_dir_record          BP(157, 190);
979     uint8_t vol_set_id               BP(191, 318);
980     uint8_t publisher_id             BP(319, 446);
981     uint8_t data_prep_id             BP(447, 574);
982     uint8_t application_id           BP(575, 702);
983     uint8_t copyright_file_id        BP(703, 739);
984     uint8_t abstract_file_id         BP(740, 776);
985     uint8_t bibliographic_file_id    BP(777, 813);
986     uint8_t vol_creation_time        BP(814, 830);
987     uint8_t vol_modification_time    BP(831, 847);
988     uint8_t vol_expiration_time      BP(848, 864);
989     uint8_t vol_effective_time       BP(865, 881);
990     uint8_t file_structure_version   BP(882, 882);
991     uint8_t reserved1                BP(883, 883);
992     uint8_t app_use                  BP(884, 1395);
993     uint8_t reserved2                BP(1396, 2048);
994 };
995 
996 /* ECMA-119, 8.2 */
997 struct ecma119_boot_rec_vol_desc
998 {
999     uint8_t vol_desc_type            BP(1, 1);
1000     uint8_t std_identifier           BP(2, 6);
1001     uint8_t vol_desc_version         BP(7, 7);
1002     uint8_t boot_sys_id              BP(8, 39);
1003     uint8_t boot_id                  BP(40, 71);
1004     uint8_t boot_catalog             BP(72, 75);
1005     uint8_t unused                   BP(76, 2048);
1006 };
1007 
1008 /* ECMA-119, 9.1 */
1009 struct ecma119_dir_record
1010 {
1011     uint8_t len_dr                   BP(1, 1);
1012     uint8_t len_xa                   BP(2, 2);
1013     uint8_t block                    BP(3, 10);
1014     uint8_t length                   BP(11, 18);
1015     uint8_t recording_time           BP(19, 25);
1016     uint8_t flags                    BP(26, 26);
1017     uint8_t file_unit_size           BP(27, 27);
1018     uint8_t interleave_gap_size      BP(28, 28);
1019     uint8_t vol_seq_number           BP(29, 32);
1020     uint8_t len_fi                   BP(33, 33);
1021     uint8_t file_id                  BP(34, 34); /* 34 to 33+len_fi */
1022     /* padding field (if len_fi is even) */
1023     /* system use (len_dr - len_su + 1 to len_dr) */
1024 };
1025 
1026 /* ECMA-119, 9.4 */
1027 struct ecma119_path_table_record
1028 {
1029     uint8_t len_di                   BP(1, 1);
1030     uint8_t len_xa                   BP(2, 2);
1031     uint8_t block                    BP(3, 6);
1032     uint8_t parent                   BP(7, 8);
1033     uint8_t dir_id                   BP(9, 9); /* 9 to 8+len_di */
1034     /* padding field (if len_di is odd) */
1035 };
1036 
1037 /* ECMA-119, 8.3 */
1038 struct ecma119_vol_desc_terminator
1039 {
1040     uint8_t vol_desc_type            BP(1, 1);
1041     uint8_t std_identifier           BP(2, 6);
1042     uint8_t vol_desc_version         BP(7, 7);
1043     uint8_t reserved                 BP(8, 2048);
1044 };
1045 
1046 void ecma119_set_voldescr_times(IsoImageWriter *writer,
1047                                 struct ecma119_pri_vol_desc *vol);
1048 
1049 /* Copies a data file into the ISO image output stream */
1050 int iso_write_partition_file(Ecma119Image *target, char *path,
1051                              uint32_t prepad, uint32_t blocks, int flag);
1052 
1053 void issue_ucs2_warning_summary(size_t failures);
1054 
1055 /* Tells whether ivr is a reader from imported_iso in a multi-session
1056    add-on situation, and thus to be kept in place.
1057 */
1058 int iso_interval_reader_keep(Ecma119Image *target,
1059                              struct iso_interval_reader *ivr,
1060                              int flag);
1061 
1062 /* @return: ISO_SUCCESS = ok, ISO_SUCCESS + 1 = keep , < 0 = error */
1063 int iso_interval_reader_start_size(Ecma119Image *t, char *path,
1064                                    off_t *start_byte, off_t *byte_count,
1065                                    int flag);
1066 
1067 /* Obtains start and end number of appended partition range and returns
1068    the number of valid entries in the list of appended partitions.
1069 */
1070 int iso_count_appended_partitions(Ecma119Image *target,
1071                                   int *first_partition, int *last_partition);
1072 
1073 /* Determines the range of valid partition numbers depending on partition
1074    table type.
1075 */
1076 void iso_tell_max_part_range(IsoWriteOpts *opts,
1077                              int *first_partition, int *last_partition,
1078                              int flag);
1079 
1080 #endif /*LIBISO_ECMA119_H_*/
1081