"Fossies" - the Fresh Open Source Software Archive

Member "xorriso-1.5.4/libisofs/image.h" (30 Jan 2021, 14024 Bytes) of package /linux/misc/xorriso-1.5.4.pl02.tar.gz:


As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) C and C++ source code syntax highlighting (style: standard) with prefixed line numbers and code folding option. Alternatively you can here view or download the uninterpreted source code file. For more information about "image.h" see the Fossies "Dox" file reference documentation and the last Fossies "Diffs" side-by-side code changes report: 1.5.2_vs_1.5.4.

    1 /*
    2  * Copyright (c) 2007 Vreixo Formoso
    3  * Copyright (c) 2009 - 2017 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 #ifndef LIBISO_IMAGE_H_
   11 #define LIBISO_IMAGE_H_
   12 
   13 #include "libisofs.h"
   14 #include "node.h"
   15 #include "fsource.h"
   16 #include "builder.h"
   17 
   18 /* Size of a inode recycling window. Each new window causes a tree traversal.
   19    Window memory consumption is ISO_USED_INODE_RANGE / 8.
   20    This must be a power of 2 smaller than 30 bit and larger than 8 bit.
   21    Here: 32 kB memory for 256k inodes.
   22 */
   23 #define ISO_USED_INODE_RANGE (1 << 18)
   24 
   25 /* How many warnings to issue about name collisions during iso_image_import()
   26 */
   27 #define ISO_IMPORT_COLL_WARN_MAX 10
   28 
   29 /*
   30  * Image is a context for image manipulation.
   31  * Global objects such as the message_queues must belogn to that
   32  * context. Thus we will have, for example, a msg queue per image,
   33  * so images are completely independent and can be managed together.
   34  * (Useful, for example, in Multiple-Document-Interface GUI apps.
   35  * [The stuff we have in init belongs really to image!]
   36  */
   37 
   38 struct Iso_Image
   39 {
   40 
   41     int refcount;
   42 
   43     IsoDir *root;
   44 
   45     char *volset_id;
   46 
   47     char *volume_id; /**< Volume identifier. */
   48     char *publisher_id; /**< Volume publisher. */
   49     char *data_preparer_id; /**< Volume data preparer. */
   50     char *system_id; /**< Volume system identifier. */
   51     char *application_id; /**< Volume application id */
   52     char *copyright_file_id;
   53     char *abstract_file_id;
   54     char *biblio_file_id;
   55     char *creation_time;
   56     char *modification_time;
   57     char *expiration_time;
   58     char *effective_time;
   59     char application_use[512];
   60     
   61     /* el-torito boot catalog */
   62     struct el_torito_boot_catalog *bootcat;
   63 
   64     /* Eventually loaded system area data, or NULL */
   65     char *system_area_data;
   66     /* Prescribed/detected options, see iso_write_opts_set_system_area() */
   67     /* >>> Needs to be coordinated with .imported_sa_info->system_area_options
   68     */
   69     int system_area_options;
   70 
   71    /*
   72     * Up to 15 boot files can be referred by a MIPS Big Endian Volume Header.
   73       The mips_boot_file_paths are ISO 9660 Rock Ridge paths.
   74     */
   75     int num_mips_boot_files;
   76     char *mips_boot_file_paths[15]; /* ISO 9660 Rock Ridge Paths */
   77 
   78     /* A data file of which the position and size shall be written after
   79        a SUN Disk Label.
   80     */
   81     IsoFile *sparc_core_node;
   82 
   83     /*
   84      * Parameters for HP-PA PALO boot sector. cmdline is a string. The other
   85      * four are absolute paths to data files in the ISO image.
   86      */
   87     char *hppa_cmdline;
   88     char *hppa_bootloader;
   89     char *hppa_kernel_32;
   90     char *hppa_kernel_64;
   91     char *hppa_ramdisk;
   92 
   93     /* Absolute DEC Alpha boot image path in the ISO image */
   94     char *alpha_boot_image;
   95 
   96     /* image identifier, for message origin identifier */
   97     int id;
   98 
   99     /**
  100      * Default filesystem to use when adding files to the image tree.
  101      */
  102     IsoFilesystem *fs;
  103 
  104     /**
  105      * Block storage of imported ISO if demanded by IsoReadOpts.
  106      */
  107     IsoDataSource *import_src;
  108 
  109     /*
  110      * Default builder to use when adding files to the image tree.
  111      */
  112     IsoNodeBuilder *builder;
  113 
  114     /**
  115      * Whether to follow symlinks or just add them as symlinks
  116      */
  117     unsigned int follow_symlinks : 1;
  118 
  119     /**
  120      * Whether to skip hidden files
  121      */
  122     unsigned int ignore_hidden : 1;
  123 
  124     /**
  125      * Flags that determine what special files should be ignore. It is a
  126      * bitmask:
  127      * bit0: ignore FIFOs
  128      * bit1: ignore Sockets
  129      * bit2: ignore char devices
  130      * bit3: ignore block devices
  131      */
  132     int ignore_special;
  133 
  134     /**
  135      * Whether to ignore ACL when inserting nodes into the image.
  136      * Not in effect with loading a complete ISO image but only with image
  137      * manipulation.
  138      */
  139     unsigned int builder_ignore_acl : 1;
  140 
  141     /**
  142      * Whether to ignore EAs when inserting nodes into the image.
  143      * Not in effect with loading a complete ISO image but only with image
  144      * manipulation. ACL does not count as EA.
  145      */
  146     unsigned int builder_ignore_ea : 1;
  147 
  148     /**
  149      * If not builder_ignore_ea : import all xattr namespaces from local
  150      *                            filesystem, not only "user.
  151      */
  152     unsigned int builder_take_all_ea : 1;
  153 
  154     /**
  155      * Files to exclude. Wildcard support is included.
  156      */
  157     char** excludes;
  158     int nexcludes;
  159 
  160     /**
  161      * if the dir already contains a node with the same name, whether to
  162      * replace or not the old node with the new. 
  163      */
  164     enum iso_replace_mode replace;
  165 
  166     /* TODO
  167     enum iso_replace_mode (*confirm_replace)(IsoFileSource *src, IsoNode *node);
  168     */
  169 
  170     /**
  171      * What to do in case of name longer than truncate_length:
  172      *  0= throw FAILURE
  173      *  1= truncate to truncate_length with MD5 of whole name at end
  174      */
  175     int truncate_mode;
  176     int truncate_length;
  177 
  178     /**
  179      * This is a convenience buffer for name truncation during image
  180      * manipulation where libisofs is not thread-safe anyway.
  181      */
  182     char truncate_buffer[4096];
  183     
  184     /**
  185      * When this is not NULL, it is a pointer to a function that will
  186      * be called just before a file will be added. You can control where
  187      * the file will be in fact added or ignored.
  188      * 
  189      * @return
  190      *      1 add, 0 ignore, < 0 cancel
  191      */
  192     int (*report)(IsoImage *image, IsoFileSource *src);
  193 
  194     /**
  195      * User supplied data
  196      */
  197     void *user_data;
  198     void (*user_data_free)(void *ptr);
  199 
  200     /**
  201      * Inode number management. inode_counter is taken over from
  202      * IsoImageFilesystem._ImageFsData after image import.
  203      * It is to be used with img_give_ino_number()
  204      * This is a Rock Ridge file serial number. Thus 32 bit.
  205     */
  206     uint32_t inode_counter;
  207     /*
  208      * A bitmap of used inode numbers in an interval beginning at
  209      * used_inodes_start and holding ISO_USED_INODE_RANGE bits.
  210      * If a bit is set, then the corresponding inode number is occupied.
  211      * This interval is kept around inode_counter and eventually gets
  212      * advanced by ISO_USED_INODE_RANGE numbers in a tree traversal
  213      * done by img_collect_inos(). The value will stay in the 32 bit range,
  214      * although used_inodes_start is 64 bit to better handle rollovers.
  215      */
  216     uint8_t *used_inodes;
  217     uint64_t used_inodes_start;
  218 
  219     /**
  220      * Array of MD5 checksums as announced by xattr "isofs.ca" of the 
  221      * root node. Array element 0 contains an overall image checksum for the
  222      * block range checksum_start_lba,checksum_end_lba. Element size is
  223      * 16 bytes. IsoFile objects in the image may have xattr "isofs.cx"
  224      * which gives their index in checksum_array.
  225      */
  226     uint32_t checksum_start_lba;
  227     uint32_t checksum_end_lba;
  228     uint32_t checksum_idx_count;
  229     char *checksum_array;
  230 
  231     /**
  232      * Whether a write run has been started by iso_image_create_burn_source()
  233      * and has not yet been finished.
  234      */
  235     int generator_is_running;
  236 
  237     /* Pointers to directories or files which shall be get a HFS+ blessing.
  238      * libisofs/hfsplus.c et.al. will compare these pointers
  239      * with the ->node pointer of Ecma119Nodes.
  240      * See libisofs.h
  241      */
  242     IsoNode *hfsplus_blessed[ISO_HFSPLUS_BLESS_MAX];
  243 
  244     /* Counts the name collisions while iso_image_import() */
  245     size_t collision_warnings;
  246 
  247     /* Contains the assessment of boot aspects of the loaded image */
  248     struct iso_imported_sys_area *imported_sa_info;
  249 
  250     /* Whether some local filesystem xattr namespace could not be explored
  251      * during node building.
  252      */
  253     int blind_on_local_get_attrs;
  254 
  255 };
  256 
  257 
  258 /* Apply truncation mode to name, using image->truncate_buffer to perform
  259    truncation if needed.
  260 
  261    Warning: Not thread-safe !
  262 */
  263 int iso_image_truncate_name(IsoImage *image, const char *name, char **namept,
  264                             int flag);
  265 
  266     
  267 /* Collect the bitmap of used inode numbers in the range of
  268    _ImageFsData.used_inodes_start + ISO_USED_INODE_RANGE
  269    @param flag bit0= recursion is active
  270 */
  271 int img_collect_inos(IsoImage *image, IsoDir *dir, int flag);
  272 
  273 /**
  274  * A global counter for inode numbers for the ISO image filesystem.
  275  * On image import it gets maxed by the eventual inode numbers from PX
  276  * entries. Up to the first 32 bit rollover it simply increments the counter.
  277  * After the first rollover it uses a look ahead bitmap which gets filled
  278  * by a full tree traversal. It covers the next inode numbers to come
  279  * (somewhere between 1 and ISO_USED_INODE_RANGE which is quite many)
  280  * and advances when being exhausted.
  281  * @param image The image where the number shall be used
  282  * @param flag  bit0= reset count (Caution: image must get new inos then)
  283  * @return
  284  *     Since 0 is used as default and considered self-unique, 
  285  *     the value 0 should only be returned in case of error.
  286  */ 
  287 uint32_t img_give_ino_number(IsoImage *image, int flag);
  288 
  289 /* @param flag bit0= overwrite any ino, else only ino == 0
  290                bit1= install inode with non-data, non-directory files
  291                bit2= install inode with directories
  292                bit3= with bit2: install inode on parameter dir
  293 */
  294 int img_make_inos(IsoImage *image, IsoDir *dir, int flag);
  295 
  296 
  297 /* Free the checksum array of an image and reset its layout parameters
  298 */
  299 int iso_image_free_checksums(IsoImage *image, int flag);
  300 
  301 
  302 /* Equip an ISO image with a new checksum array buffer (after isofs.ca and
  303    isofs.cx have already been adjusted).
  304 */
  305 int iso_image_set_checksums(IsoImage *image, char *checksum_array, 
  306                             uint32_t start_lba, uint32_t end_lba,
  307                             uint32_t idx_count, int flag);
  308 
  309 
  310 int iso_image_set_pvd_times(IsoImage *image,
  311                             char *creation_time, char *modification_time,
  312                             char *expiration_time, char *effective_time);
  313 
  314 
  315 /* Collects boot block information obtained from the system area of
  316    imported images
  317 */
  318 struct iso_imported_sys_area {
  319 
  320     int refcount;
  321 
  322     /* Whether there was some System Area data at all */
  323     int is_not_zero;
  324 
  325     /* Giving the error number if the assessment ended by an error */
  326     int overall_return;
  327 
  328     /* Block address of loaded Primar Volume Descriptor */
  329     uint32_t pvd_block;
  330 
  331     /* Size of the imported ISO image */
  332     uint32_t image_size;
  333 
  334     /* see libisofs.h : iso_write_opts_set_system_area() */
  335     int system_area_options;
  336 
  337     /* The perceived MBR partitions */
  338     struct iso_mbr_partition_request **mbr_req;
  339     int mbr_req_count;
  340 
  341     /* see ecma119.h : struct ecma119_image , struct iso_write_opts */
  342     /* Effective partition table parameter: 1 to 63, 0= disabled/default */
  343     int partition_secs_per_head; 
  344     /* 1 to 255, 0= disabled/default */
  345     int partition_heads_per_cyl;
  346 
  347     /* see ecma119.h :  struct iso_write_opts */
  348     uint32_t partition_offset;
  349 
  350     /* 2048-byte start LBA and block count of PreP partition */
  351     uint32_t prep_part_start;
  352     uint32_t prep_part_size;
  353 
  354     /* see ecma119.h : struct ecma119_image */
  355     struct iso_apm_partition_request **apm_req;
  356     int apm_req_count;
  357     int apm_req_flags;
  358     /* Number of found "GapNN", "ISO9660_data" partitions in APM */
  359     int apm_gap_count;
  360 
  361     /* see ecma119.h : struct iso_write_opts */
  362     int apm_block_size;
  363 
  364     /* >>> see ecma119.h : struct iso_write_opts */
  365     int hfsp_block_size;
  366 
  367     /* see ecma119.h : struct ecma119_image */
  368     struct iso_gpt_partition_request **gpt_req;
  369     int gpt_req_count;
  370     int gpt_req_flags;
  371 
  372     /* see ecma119.h : struct ecma119_image */
  373     uint8_t gpt_disk_guid[16];
  374     /* Start of GPT entries in System Area, block size 512 */
  375     uint64_t gpt_part_start;
  376     uint32_t gpt_max_entries;
  377     uint64_t gpt_first_lba;
  378     uint64_t gpt_last_lba;
  379     uint64_t gpt_backup_lba;
  380     char *gpt_backup_comments;
  381     uint32_t gpt_head_crc_found;
  382     uint32_t gpt_head_crc_should;
  383     uint32_t gpt_array_crc_found;
  384     uint32_t gpt_array_crc_should;
  385 
  386     /* see image.h : struct Iso_Image */
  387     int num_mips_boot_files;
  388     char **mips_boot_file_paths; /* ISO 9660 Rock Ridge Paths */
  389     struct iso_mips_voldir_entry **mips_vd_entries;
  390 
  391     /* see ecma119.h : struct ecma119_image */
  392     /* Memorized ELF parameters from MIPS Little Endian boot file */
  393     uint32_t mipsel_e_entry;
  394     uint32_t mipsel_p_offset;
  395     uint32_t mipsel_p_vaddr; 
  396     uint32_t mipsel_p_filesz;
  397     uint32_t mipsel_seg_start;
  398     char *mipsel_boot_file_path;
  399 
  400     /* see image.h : struct Iso_Image */
  401     char *sparc_disc_label;
  402     int sparc_secs_per_head;
  403     int sparc_heads_per_cyl;
  404     struct iso_sun_disk_label_entry *sparc_entries;
  405     int sparc_entry_count;
  406 
  407     /* grub2-sparc-core : a node in the ISO image
  408                           published at bytes 0x228 to 0x233
  409     */
  410     uint64_t sparc_grub2_core_adr;
  411     uint32_t sparc_grub2_core_size;
  412     IsoFile *sparc_core_node;
  413 
  414     /* see image.h : struct Iso_Image */
  415     int hppa_hdrversion;
  416     char *hppa_cmdline;
  417     uint32_t hppa_kern32_adr;
  418     uint32_t hppa_kern32_len;
  419     uint32_t hppa_kern64_adr;
  420     uint32_t hppa_kern64_len;
  421     uint32_t hppa_ramdisk_adr;
  422     uint32_t hppa_ramdisk_len;
  423     uint32_t hppa_bootloader_adr;
  424     uint32_t hppa_bootloader_len;
  425     uint32_t hppa_ipl_entry;
  426     char *hppa_kernel_32;
  427     char *hppa_kernel_64;
  428     char *hppa_ramdisk;
  429     char *hppa_bootloader;
  430 
  431     uint64_t alpha_boot_image_size;
  432     uint64_t alpha_boot_image_adr;
  433     char *alpha_boot_image;
  434 
  435     /* Some block addresses of active and first session:
  436          PVD, L Pathtable, Opt L, M Pathtable, Opt M, root directory
  437     */
  438     uint32_t meta_struct_blocks[12];
  439     int num_meta_struct_blocks;
  440 };
  441 
  442 int iso_imported_sa_new(struct iso_imported_sys_area **sa_info, int flag);
  443 
  444 int iso_imported_sa_unref(struct iso_imported_sys_area **sa_info, int flag);
  445 
  446 
  447 #endif /*LIBISO_IMAGE_H_*/