"Fossies" - the Fresh Open Source Software Archive

Member "libisoburn-1.5.4/xorriso/iso_img.c" (5 Dec 2020, 102678 Bytes) of package /linux/misc/libisoburn-1.5.4.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 "iso_img.c" see the Fossies "Dox" file reference documentation and the last Fossies "Diffs" side-by-side code changes report: 1.5.0_vs_1.5.2.

    1 
    2 /* xorriso - creates, loads, manipulates and burns ISO 9660 filesystem images.
    3 
    4    Copyright 2007-2020 Thomas Schmitt, <scdbackup@gmx.net>
    5 
    6    Provided under GPL version 2 or later.
    7 
    8    This file contains functions which operate on ISO images and their
    9    global properties.
   10 */
   11 
   12 #ifdef HAVE_CONFIG_H
   13 #include "../config.h"
   14 #endif
   15 
   16 #include <ctype.h>
   17 #include <sys/types.h>
   18 #include <unistd.h>
   19 #include <stdlib.h>
   20 #include <stdio.h>
   21 #include <string.h>
   22 #include <sys/stat.h>
   23 #include <sys/time.h>
   24 #include <time.h>
   25 #include <errno.h>
   26 
   27 #include <sys/wait.h>
   28 
   29 #include "xorriso.h"
   30 #include "xorriso_private.h"
   31 #include "xorrisoburn.h"
   32 
   33 #include "lib_mgt.h"
   34 #include "iso_img.h"
   35 #include "iso_tree.h"
   36 #include "drive_mgt.h"
   37 
   38 
   39 int Xorriso_set_ignore_aclea(struct XorrisO *xorriso, int flag)
   40 {
   41  int ret, hflag;
   42  IsoImage *volume;
   43 
   44  ret= Xorriso_get_volume(xorriso, &volume, 1); 
   45  if(ret<=0)
   46    return(ret);
   47  hflag= (~xorriso->do_aaip) & 1;
   48  if((xorriso->ino_behavior & (1 | 2)) && !(xorriso->do_aaip & (4 | 16)))
   49    hflag|= 2; 
   50  if(xorriso->do_aaip & 1024)
   51    hflag|= 8;
   52  iso_image_set_ignore_aclea(volume, hflag);
   53  return(1);
   54 }
   55 
   56 
   57 int Xorriso_update_volid(struct XorrisO *xorriso, int flag)
   58 {
   59  int gret, sret= 1;
   60 
   61  gret= Xorriso_get_volid(xorriso, xorriso->loaded_volid, 0);
   62  if(gret<=0 || (!xorriso->volid_default) || xorriso->loaded_volid[0]==0)
   63    sret= Xorriso_set_volid(xorriso, xorriso->volid, 1);
   64  return(gret>0 && sret>0);
   65 } 
   66  
   67 
   68 int Xorriso_create_empty_iso(struct XorrisO *xorriso, int flag)
   69 {
   70  int ret;
   71  IsoImage *volset;
   72  struct isoburn_read_opts *ropts;
   73  struct burn_drive_info *dinfo= NULL;
   74  struct burn_drive *drive= NULL;
   75 
   76  if(xorriso->out_drive_handle != NULL) {
   77    ret= Xorriso_get_drive_handles(xorriso, &dinfo, &drive,
   78                                   "on attempt to attach volset to drive", 2);
   79    if(ret<=0)
   80      return(ret);
   81  }
   82  if(xorriso->in_volset_handle!=NULL) {
   83    iso_image_unref((IsoImage *) xorriso->in_volset_handle);
   84    xorriso->in_volset_handle= NULL;
   85    Sectorbitmap_destroy(&(xorriso->in_sector_map), 0);
   86    Xorriso_destroy_di_array(xorriso, 0);
   87    Xorriso_destroy_hln_array(xorriso, 0);
   88    xorriso->loaded_volid[0]= 0;
   89    xorriso->volset_change_pending= 0;
   90    xorriso->boot_count= 0;
   91    xorriso->no_volset_present= 0;
   92  }
   93 
   94  ret= isoburn_ropt_new(&ropts, 0);
   95  if(ret<=0)
   96    return(ret);
   97  /* Note: no return before isoburn_ropt_destroy() */
   98  isoburn_ropt_set_extensions(ropts, isoburn_ropt_pretend_blank);
   99  isoburn_ropt_set_input_charset(ropts, xorriso->in_charset);
  100  isoburn_ropt_set_data_cache(ropts, 1, 1, 0);
  101  isoburn_set_read_pacifier(drive, NULL, NULL);
  102  isoburn_ropt_set_truncate_mode(ropts, 1, xorriso->file_name_limit);
  103 
  104  ret= isoburn_read_image(drive, ropts, &volset);
  105  Xorriso_process_msg_queues(xorriso,0);
  106  isoburn_ropt_destroy(&ropts, 0);
  107  if(ret<=0) {
  108    sprintf(xorriso->info_text, "Failed to create new empty ISO image object");
  109    Xorriso_report_iso_error(xorriso, "", ret, xorriso->info_text, 0, "FATAL",
  110                             0);
  111    return(-1);
  112  }
  113  xorriso->in_volset_handle= (void *) volset;
  114  xorriso->in_sector_map= NULL;
  115  Xorriso_update_volid(xorriso, 0);
  116  xorriso->volset_change_pending= 0;
  117  xorriso->boot_count= 0;
  118  xorriso->system_area_clear_loaded=
  119                     (strcmp(xorriso->system_area_disk_path, "/dev/zero") == 0);
  120  xorriso->no_volset_present= 0;
  121  return(1);
  122 }
  123 
  124 
  125 int Xorriso_record_boot_info(struct XorrisO *xorriso, int flag)
  126 {
  127  int ret;
  128  struct burn_drive_info *dinfo;
  129  struct burn_drive *drive;
  130  IsoImage *image;
  131  ElToritoBootImage *bootimg;
  132  IsoFile *bootimg_node;
  133  IsoBoot *bootcat_node;
  134 
  135  xorriso->loaded_boot_bin_lba= -1;
  136  xorriso->loaded_boot_cat_path[0]= 0;
  137  ret= Xorriso_get_drive_handles(xorriso, &dinfo, &drive,
  138                                 "on attempt to record boot LBAs", 0);
  139  if(ret<=0)
  140    return(0);
  141  image= isoburn_get_attached_image(drive);
  142  if(image == NULL)
  143    return(0);
  144  ret= iso_image_get_boot_image(image, &bootimg,
  145                                &bootimg_node, &bootcat_node);
  146  iso_image_unref(image); /* release obtained reference */
  147  if(ret != 1)
  148    return(0);
  149  if(bootimg_node != NULL)
  150    Xorriso__file_start_lba((IsoNode *) bootimg_node,
  151                            &(xorriso->loaded_boot_bin_lba), 0);
  152  if(bootcat_node != NULL)
  153    Xorriso_path_from_lba(xorriso, (IsoNode *) bootcat_node, 0,
  154                          xorriso->loaded_boot_cat_path, 0);
  155  return(1);
  156 }
  157 
  158 
  159 int Xorriso_assert_volid(struct XorrisO *xorriso, int msc1, int flag)
  160 {
  161  int ret, image_blocks;
  162  char volid[33];
  163  struct burn_drive_info *dinfo;
  164  struct burn_drive *drive;
  165 
  166  if(xorriso->assert_volid[0] == 0)
  167    return(1);
  168  ret= Xorriso_get_drive_handles(xorriso, &dinfo, &drive,
  169                                 "on attempt to perform -assert_volid", 0);
  170  if(ret<=0)
  171    return(0);
  172  ret= isoburn_read_iso_head(drive, msc1, &image_blocks, volid, 1);
  173  Xorriso_process_msg_queues(xorriso,0);
  174  if(ret <= 0) {
  175    sprintf(xorriso->info_text,
  176            "-assert_volid: Cannot determine Volume Id at LBA %d.", msc1);
  177    Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0,
  178                        xorriso->assert_volid_sev, 0);
  179    return(0);
  180  }
  181  ret= Sregex_match(xorriso->assert_volid, volid, 0);
  182  if(ret < 0)
  183    return(2);
  184  if(ret == 0) {
  185    strcpy(xorriso->info_text,
  186           "-assert_volid: Volume id does not match pattern: ");
  187    Text_shellsafe(xorriso->assert_volid, xorriso->info_text, 1);
  188    strcat(xorriso->info_text, " <> ");
  189    Text_shellsafe(volid, xorriso->info_text, 1);
  190    Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0,
  191                        xorriso->assert_volid_sev, 0);
  192    return(0);
  193  }
  194  return(ret);
  195 }
  196 
  197 
  198 /* @return <0 yes , 0 no , <0 error */
  199 int Xorriso_is_isohybrid(struct XorrisO *xorriso, IsoFile *bootimg_node,
  200                          int flag)
  201 {
  202  int ret;
  203  unsigned char buf[68];
  204  void *data_stream= NULL;
  205 
  206  ret= Xorriso_iso_file_open(xorriso, "", (void *) bootimg_node,
  207                             &data_stream, 1);
  208  if(ret <= 0)
  209    return(-1);
  210  ret= Xorriso_iso_file_read(xorriso, data_stream, (char *) buf, 68, 0);
  211  Xorriso_iso_file_close(xorriso, &data_stream, 0);
  212  if(ret <= 0)
  213    return(0);
  214  if(buf[64] == 0xfb && buf[65] == 0xc0 && buf[66] == 0x78 && buf[67] == 0x70)
  215    return(1);
  216  return(0);
  217 }
  218 
  219 
  220 int Xorriso_image_has_md5(struct XorrisO *xorriso, int flag)
  221 {
  222  int ret;
  223  IsoImage *image;
  224  uint32_t start_lba, end_lba;
  225  char md5[16];
  226 
  227  ret= Xorriso_get_volume(xorriso, &image, 0);
  228  if(ret<=0)
  229    return(ret);
  230  ret= iso_image_get_session_md5(image, &start_lba, &end_lba, md5, 0);
  231  Xorriso_process_msg_queues(xorriso,0);
  232  if(ret <= 0)
  233    return(0);
  234  return(1);
  235 }
  236 
  237 
  238 static const char *un0(const char *text)
  239 {
  240  if(text == NULL)
  241    return("");
  242  return(text);
  243 }
  244 
  245 
  246 static int Xorriso_report_pvd_time(struct XorrisO *xorriso, char *head,
  247                                    char *pvd_time, int flag)
  248 {
  249  char *msg, hr[17];
  250  int at;
  251 
  252  msg= xorriso->result_line;
  253  strncpy(hr, pvd_time, 16);
  254  hr[16]= 0;
  255  sprintf(msg, "%s %s\n", head, hr);
  256  Xorriso_result(xorriso,0);
  257  if(pvd_time[16] != 0) {
  258    at= abs(pvd_time[16]);
  259    sprintf(msg, "%2.2s. Time Zone: %c%-2.2d:%-2.2d\n", head,
  260            pvd_time[16] > 0 ? '+' : '-', at / 4, (at - (at / 4) * 4) * 15);
  261    Xorriso_result(xorriso,0);
  262  }
  263  return(1);
  264 }
  265 
  266 
  267 int Xorriso_pvd_info(struct XorrisO *xorriso, int flag)
  268 {
  269  int ret, msc1= -1, msc2, i;
  270  IsoImage *image;
  271  struct burn_drive_info *dinfo;
  272  struct burn_drive *drive;
  273  char *msg, block_head[8], *crt, *mdt, *ext, *eft;
  274  off_t head_count;
  275 
  276  msg= xorriso->result_line;
  277  ret= Xorriso_get_volume(xorriso, &image, 0);
  278  if(ret<=0)
  279    return(ret);
  280  ret= Xorriso_get_drive_handles(xorriso, &dinfo, &drive, "", 16);
  281  if(ret > 0) {
  282    ret= Xorriso_msinfo(xorriso, &msc1, &msc2, 1 | 4);
  283    if(ret<0)
  284      return(ret);
  285    Xorriso_toc(xorriso, 128);
  286    if(msc1 >= 0) {
  287      for(i = msc1 + 16; i < msc1 + 32; i++) {
  288        ret= burn_read_data(drive, (off_t) i * (off_t) 2048, block_head,
  289                            (off_t) sizeof(block_head), &head_count, 2);
  290        if(ret <= 0) {
  291          i= msc1 + 32;
  292      break;
  293        }
  294        if(block_head[0] == 1 && strncmp(block_head + 1, "CD001", 5) == 0)
  295      break;
  296      }
  297      if(i < msc1 + 32) {
  298        sprintf(msg, "PVD address  : %ds\n", i);
  299        Xorriso_result(xorriso,0);
  300      }
  301    }
  302  }
  303  sprintf(msg, "Volume Id    : %s\n", un0(iso_image_get_volume_id(image)));
  304  Xorriso_result(xorriso,0);
  305  sprintf(msg, "Volume Set Id: %s\n", xorriso->volset_id);
  306  Xorriso_result(xorriso,0);
  307  sprintf(msg, "Publisher Id : %s\n", xorriso->publisher);
  308  Xorriso_result(xorriso,0);
  309  sprintf(msg, "Preparer Id  : %s\n",
  310          un0(iso_image_get_data_preparer_id(image)));
  311  Xorriso_result(xorriso,0);
  312  sprintf(msg, "App Id       : %s\n", xorriso->application_id);
  313  Xorriso_result(xorriso,0);
  314  sprintf(msg, "System Id    : %s\n", xorriso->system_id);
  315  Xorriso_result(xorriso,0);
  316  sprintf(msg, "CopyrightFile: %s\n", xorriso->copyright_file);
  317  Xorriso_result(xorriso,0);
  318  sprintf(msg, "Abstract File: %s\n", xorriso->abstract_file);
  319  Xorriso_result(xorriso,0);
  320  sprintf(msg, "Biblio File  : %s\n", xorriso->biblio_file);
  321  Xorriso_result(xorriso,0);
  322 
  323  ret= iso_image_get_pvd_times(image, &crt, &mdt, &ext, &eft);
  324  if(ret != ISO_SUCCESS)
  325    crt= mdt= ext= eft= "                "; /* Need 17 bytes. Last byte 0. */
  326  Xorriso_report_pvd_time(xorriso, "Creation Time:", crt, 0);
  327  Xorriso_report_pvd_time(xorriso, "Modif. Time  :", mdt, 0);
  328  Xorriso_report_pvd_time(xorriso, "Expir. Time  :", ext, 0);
  329  Xorriso_report_pvd_time(xorriso, "Eff. Time    :", eft, 0);
  330  return(1);
  331 }
  332 
  333 
  334 /* @param flag bit0= do not mark image as changed */
  335 int Xorriso_set_volid(struct XorrisO *xorriso, char *volid, int flag)
  336 {
  337  int ret;
  338  IsoImage *volume;
  339 
  340  if(xorriso->in_volset_handle == NULL)
  341    return(2);
  342  ret= Xorriso_get_volume(xorriso, &volume, 0);
  343  if(ret<=0)
  344    return(ret);
  345  if(iso_image_get_volume_id(volume) == NULL ||
  346     strcmp(iso_image_get_volume_id(volume), volid) != 0)
  347    if(!(flag&1))
  348      Xorriso_set_change_pending(xorriso, 1);
  349  iso_image_set_volume_id(volume, volid);
  350  Xorriso_process_msg_queues(xorriso,0);
  351  sprintf(xorriso->info_text,"Volume ID: '%s'",iso_image_get_volume_id(volume));
  352  Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "DEBUG", 0);
  353  return(1);
  354 }
  355 
  356 
  357 int Xorriso_get_volid(struct XorrisO *xorriso, char volid[33], int flag)
  358 {
  359  int ret;
  360  IsoImage *volume;
  361 
  362  ret= Xorriso_get_volume(xorriso, &volume, 0);
  363  if(ret<=0)
  364    return(ret);
  365  strncpy(volid, iso_image_get_volume_id(volume), 32);
  366  volid[32]= 0;
  367  return(1);
  368 }
  369 
  370 
  371 /* 
  372  bit0= do only report non-default settings
  373  bit1= do only report to fp
  374  bit2= is_default
  375  bit3= append -boot_image any next
  376  bit4= concentrate boot options
  377  bit5= override load_size by "full"
  378 */
  379 int Xorriso_boot_item_status(struct XorrisO *xorriso, char *cat_path,
  380                              char *bin_path, int platform_id,
  381                              int patch_isolinux, int emul, off_t load_size,
  382                              unsigned char *id_string,
  383                              unsigned char *selection_crit, char *form,
  384                              char *filter, FILE *fp, int flag)
  385 {
  386  int is_default, no_defaults, i, is_default_id= 0, ret;
  387  char *line, *bspec= NULL, zeros[28], *partition_entry;
  388  off_t file_size;
  389  struct stat stbuf;
  390 
  391  Xorriso_alloc_meM(bspec, char, SfileadrL + 80);
  392 
  393  no_defaults= flag & 1;
  394  line= xorriso->result_line;
  395  if(flag & 32)
  396    load_size= -1;
  397 
  398  if((flag & 16) && bin_path[0] != 0) {
  399    /* Concentrate boot options. */
  400    memset(zeros, 0, 28);
  401    if(memcmp(id_string, zeros, 28) == 0 &&
  402       memcmp(selection_crit, zeros, 20) == 0)
  403      is_default_id= 1;
  404 
  405    /* -boot_image isolinux dir= ... */
  406    bspec[0]= 0;
  407    if(strcmp(form, "isolinux") != 0 && strcmp(form, "any") != 0)
  408      ;
  409    else if(strcmp(bin_path, "/isolinux.bin") == 0 &&
  410       strcmp(cat_path, "/boot.cat") == 0)
  411      strcpy(bspec, "dir=/");
  412    else if(strcmp(bin_path, "/isolinux/isolinux.bin") == 0 &&
  413            strcmp(cat_path, "/isolinux/boot.cat") == 0)
  414      strcpy(bspec, "dir=/isolinux");
  415    else if(strcmp(xorriso->boot_image_bin_path,
  416                   "/boot/isolinux/isolinux.bin") == 0
  417            && strcmp(xorriso->boot_image_cat_path,
  418                      "/boot/isolinux/boot.cat") == 0)
  419      strcpy(bspec, "dir=/boot/isolinux");
  420    memset(zeros, 0, 28);
  421    if(bspec[0] && platform_id == 0 && (patch_isolinux & 0x3ff) == 1 &&
  422       load_size == 2048 && is_default_id && emul == 0) {
  423      sprintf(line, "-boot_image isolinux %s\n", bspec);
  424      Xorriso_status_result(xorriso,filter,fp,flag&2); 
  425      {ret= 1; goto ex;};
  426    }
  427 
  428    file_size= 0;
  429    ret= Xorriso_iso_lstat(xorriso, bin_path, &stbuf, 2 | 4);
  430    if(ret == 0) {
  431      file_size= ((stbuf.st_size / (off_t) 512) +
  432                 !!(stbuf.st_size % (off_t) 512)) * 512;
  433      if(flag & 32)
  434        load_size= file_size * 512;
  435    }
  436    if(platform_id == 0xef && (patch_isolinux & 0x3ff) == 0 &&
  437       load_size / 512 == file_size && is_default_id && emul == 0) {
  438      sprintf(line, "-boot_image any efi_path=");
  439      Text_shellsafe(bin_path, line, 1);
  440      strcat(line, "\n");
  441      Xorriso_status_result(xorriso,filter,fp,flag&2);
  442      {ret= 1; goto ex;};
  443    }
  444  }
  445 
  446  is_default= (bin_path[0] == 0) || (flag & 4);
  447  sprintf(line, "-boot_image %s bin_path=", form);
  448  Text_shellsafe(bin_path, line, 1);
  449  strcat(line, "\n");
  450  if(!(is_default && no_defaults))
  451    Xorriso_status_result(xorriso,filter,fp,flag&2);
  452 
  453  is_default= (emul == 0);
  454  sprintf(line, "-boot_image %s emul_type=%s\n",
  455       form, emul == 2 ? "diskette" : emul == 1 ? "hard_disk" : "no_emulation");
  456  if(!(is_default && no_defaults))
  457    Xorriso_status_result(xorriso,filter,fp,flag&2);
  458  
  459  is_default= (platform_id == 0 || (flag & 4));
  460  sprintf(line, "-boot_image %s platform_id=0x%-2.2x\n", form, platform_id);
  461  if(!(is_default && no_defaults))
  462    Xorriso_status_result(xorriso,filter,fp,flag&2); 
  463 
  464  is_default= ((patch_isolinux & 1) == 0 || bin_path[0] == 0 || (flag & 4));
  465  sprintf(line, "-boot_image %s boot_info_table=%s\n",
  466                (patch_isolinux & 2) ? "grub" : form,
  467                (patch_isolinux & 1) ? "on" : "off");
  468  if(!(is_default && no_defaults))
  469    Xorriso_status_result(xorriso,filter,fp,flag&2); 
  470  
  471  is_default= ((patch_isolinux & 512) == 0 || bin_path[0] == 0 || (flag & 4));
  472  sprintf(line, "-boot_image grub grub2_boot_info=%s\n",
  473                (patch_isolinux & 512) ? "on" : "off");
  474  if(!(is_default && no_defaults))
  475    Xorriso_status_result(xorriso,filter,fp,flag&2); 
  476  
  477  if(flag & 32) {
  478    is_default= 0;
  479    sprintf(line, "-boot_image %s load_size=full", form);
  480  } else {
  481    is_default= (load_size == 2048 || (flag & 4));
  482    sprintf(line, "-boot_image %s load_size=%lu\n",
  483            form, (unsigned long) load_size);
  484  }
  485  if(!(is_default && no_defaults))
  486    Xorriso_status_result(xorriso,filter,fp,flag&2); 
  487 
  488  is_default= 1;
  489  if(!(flag & 4))
  490    for(i= 0; i < 20; i++)
  491      if(selection_crit[i])
  492        is_default= 0;
  493  sprintf(line, "-boot_image %s sel_crit=", form);
  494  for(i= 0; i < 20; i++)
  495    sprintf(line + strlen(line), "%-2.2X", (unsigned int) selection_crit[i]);
  496  strcat(line, "\n");
  497  if(!(is_default && no_defaults))
  498    Xorriso_status_result(xorriso,filter,fp,flag&2); 
  499 
  500  is_default= 1;
  501  if(!(flag & 4))
  502    for(i= 0; i < 28; i++)
  503      if(id_string[i])
  504        is_default= 0;
  505  sprintf(line, "-boot_image %s id_string=", form);
  506  for(i= 0; i < 28; i++)
  507    sprintf(line + strlen(line), "%-2.2X", (unsigned int) id_string[i]);
  508  strcat(line, "\n");
  509  if(!(is_default && no_defaults))
  510    Xorriso_status_result(xorriso,filter,fp,flag&2); 
  511 
  512  is_default= 1;
  513  partition_entry= "";
  514  if((patch_isolinux & 0x0fc) == (1 << 2))
  515    partition_entry= "gpt_basdat";
  516  else if((patch_isolinux & 0x0fc) == (2 << 2))
  517    partition_entry= "gpt_hfsplus";
  518  if(partition_entry[0]) {
  519    sprintf(line, "-boot_image isolinux partition_entry=%s\n", partition_entry);
  520    Xorriso_status_result(xorriso, filter, fp, flag & 2);
  521    is_default= 0;
  522  }
  523  if(patch_isolinux & (1 << 8)) {
  524    sprintf(line, "-boot_image isolinux partition_entry=apm_hfsplus\n");
  525    Xorriso_status_result(xorriso, filter, fp, flag & 2);
  526    is_default= 0;
  527  }
  528  if(is_default && !no_defaults) {
  529    sprintf(line, "-boot_image isolinux partition_entry=off\n");
  530    Xorriso_status_result(xorriso, filter, fp, flag & 2);
  531  }
  532  
  533  ret= 1; 
  534 ex:;
  535  Xorriso_free_meM(bspec);
  536  return(ret); 
  537 }
  538 
  539 
  540 int Xorriso_status_hppa(struct XorrisO *xorriso, char *what, char *value,
  541                         char *filter, FILE *fp, int flag)
  542 {
  543  char *line;
  544 
  545  line= xorriso->result_line;
  546  if(value == NULL)
  547    return(1);
  548  sprintf(line, "-boot_image any hppa_%s=", what);
  549  Text_shellsafe(value, line, 1);
  550  strcat(line, "\n");
  551  Xorriso_status_result(xorriso, filter, fp, flag & 2);
  552  return(1);
  553 }
  554 
  555 
  556 /* 
  557  bit0= do only report non-default settings
  558  bit1= do only report to fp
  559 */
  560 int Xorriso_boot_status_non_mbr(struct XorrisO *xorriso, IsoImage *image,
  561                                 char *filter, FILE *fp, int flag)
  562 {
  563  int i, num_boots, sa_type;
  564  char *paths[15], *line;
  565  int ret;
  566  char num[4];
  567  char *cmdline, *bootloader, *kernel_32, *kernel_64, *ramdisk;
  568 
  569  line= xorriso->result_line;
  570 
  571  sa_type= (xorriso->system_area_options & 0xfc) >> 2;
  572  if(sa_type == 3) {
  573    sprintf(line, "-boot_image any sparc_label=");
  574    Text_shellsafe(xorriso->ascii_disc_label, line, 1);
  575    strcat(line, "\n");
  576    Xorriso_status_result(xorriso, filter, fp, flag & 2);
  577    sprintf(line, "-boot_image grub grub2_sparc_core=");
  578    Text_shellsafe(xorriso->grub2_sparc_core, line, 1);
  579    strcat(line, "\n");
  580    Xorriso_status_result(xorriso, filter, fp, flag & 2);
  581    return(0);
  582  } else if(sa_type == 1 || sa_type == 2) {
  583    num_boots= iso_image_get_mips_boot_files(image, paths, 0);
  584    Xorriso_process_msg_queues(xorriso, 0);
  585    if(num_boots > 0) {
  586      if(sa_type == 2)
  587        num_boots= 1;
  588      for(i= 0; i < num_boots; i++) {
  589        sprintf(line, "-boot_image any mips%s_path=", sa_type ==2 ? "el" : "");
  590        Text_shellsafe(paths[i], line, 1);
  591        strcat(line, "\n");
  592        Xorriso_status_result(xorriso, filter, fp, flag & 2);
  593      }
  594    }
  595    return(num_boots);
  596  } else if(sa_type == 4 || sa_type == 5) {
  597    ret= iso_image_get_hppa_palo(image, &cmdline, &bootloader, &kernel_32,
  598                                 &kernel_64, &ramdisk);
  599    if(ret == 1) {
  600      Xorriso_status_hppa(xorriso, "cmdline", cmdline, filter, fp, 0);
  601      Xorriso_status_hppa(xorriso, "bootloader", bootloader, filter, fp, 0);
  602      Xorriso_status_hppa(xorriso, "kernel_32", kernel_32, filter, fp, 0);
  603      Xorriso_status_hppa(xorriso, "kernel_64", kernel_64, filter, fp, 0);
  604      Xorriso_status_hppa(xorriso, "ramdisk", ramdisk, filter, fp, 0);
  605      sprintf(num, "%d", sa_type);
  606      Xorriso_status_hppa(xorriso, "hdrversion", num, filter, fp, 0);
  607    }
  608    return(0);
  609  } else if(sa_type == 6) {
  610    ret= iso_image_get_alpha_boot(image, &bootloader);
  611    if (ret == 1 && bootloader != NULL) {
  612      sprintf(line, "-boot_image any alpha_boot=");
  613      Text_shellsafe(bootloader, line, 1);
  614      strcat(line, "\n");
  615      Xorriso_status_result(xorriso, filter, fp, flag & 2);
  616    }
  617    return(0);
  618  }
  619  return(0);
  620 }
  621 
  622 
  623 /* 
  624  bit0= do only report non-default settings
  625  bit1= do only report to fp
  626 */
  627 int Xorriso_append_part_status(struct XorrisO *xorriso, IsoImage *image,
  628                              char *filter, FILE *fp, int flag)
  629 {
  630  int i, l, is_default;
  631 
  632  is_default= (xorriso->appended_as_gpt == 0);
  633  sprintf(xorriso->result_line, "-boot_image any appended_part_as=%s\n",
  634          xorriso->appended_as_gpt ? "gpt" : "mbr");
  635  if(!(is_default && (flag & 1)))
  636    Xorriso_status_result(xorriso, filter, fp, flag & 2);
  637  for(i= 0; i < Xorriso_max_appended_partitionS; i++) {
  638    if(xorriso->appended_partitions[i] == NULL)
  639  continue;
  640    sprintf(xorriso->result_line, "-append_partition %d ", i + 1);
  641    l= strlen(xorriso->result_line);
  642    if(xorriso->appended_part_gpt_flags[i] & 1) {
  643      Xorriso__format_guid(xorriso->appended_part_type_guids[i],
  644                           xorriso->result_line + l, 0);
  645      strcpy(xorriso->result_line + l + 32, " ");
  646    } else {
  647      sprintf(xorriso->result_line + l, "0x%2.2x ",
  648              (unsigned int) xorriso->appended_part_types[i]);
  649    }
  650    Text_shellsafe(xorriso->appended_partitions[i], xorriso->result_line, 1);
  651    strcat(xorriso->result_line, "\n");
  652    Xorriso_status_result(xorriso, filter, fp, flag & 2);
  653  }
  654  return(1);
  655 }
  656 
  657 
  658 /* 
  659  bit0= do only report non-default settings
  660  bit1= do only report to fp
  661 */
  662 int Xorriso_boot_image_status(struct XorrisO *xorriso, char *filter, FILE *fp,
  663                               int flag)
  664 {
  665  int ret, i, num_boots, hflag;
  666  int is_default, no_defaults;
  667  char *path= NULL, *form= "any", *line, *hpt;
  668  struct burn_drive_info *dinfo;
  669  struct burn_drive *drive;
  670  IsoImage *image= NULL;
  671  ElToritoBootImage **boots = NULL;
  672  IsoFile **bootnodes = NULL;
  673  int platform_id, patch, load_size;
  674  enum eltorito_boot_media_type media_type;
  675  unsigned char id_string[29], sel_crit[21];
  676 
  677  Xorriso_alloc_meM(path, char, SfileadrL);
  678  line= xorriso->result_line;
  679  no_defaults= flag & 1;
  680 
  681  ret= Xorriso_get_drive_handles(xorriso, &dinfo, &drive,
  682                                 "on attempt to print boot info", 2 | 16);
  683  if(ret<=0)
  684    goto no_image;
  685  image= isoburn_get_attached_image(drive);
  686  Xorriso_process_msg_queues(xorriso,0);
  687  if(image == NULL) 
  688    goto no_image;
  689  
  690  ret= Xorriso_boot_status_non_mbr(xorriso, image, filter, fp, flag & 3);
  691  if(ret < 0) /* == 0 is normal */
  692    {ret= 0; goto ex;}
  693 
  694  if(xorriso->boot_count == 0 && xorriso->boot_image_bin_path[0] == 0) {
  695 no_image:;
  696    if(xorriso->patch_isolinux_image & 1) {
  697      sprintf(line, "-boot_image %s patch\n",
  698              xorriso->patch_isolinux_image & 2 ? "grub" : form);
  699      is_default= 0;
  700    } else if(xorriso->keep_boot_image) {
  701      sprintf(line, "-boot_image %s keep\n", form);
  702      is_default= 0;
  703    } else {
  704      sprintf(line, "-boot_image %s discard\n", form);
  705      is_default= 1;
  706    }
  707    if(!(is_default && no_defaults))
  708       Xorriso_status_result(xorriso,filter,fp,flag&2); 
  709    goto report_open_item;
  710  }
  711 
  712  is_default= (xorriso->boot_image_cat_path[0] == 0);
  713  sprintf(line,"-boot_image %s cat_path=", form);
  714  Text_shellsafe(xorriso->boot_image_cat_path, line, 1);
  715  strcat(line, "\n");
  716  if(!(is_default && no_defaults))
  717    Xorriso_status_result(xorriso,filter,fp,flag&2);
  718 
  719  is_default= !xorriso->boot_image_cat_hidden;
  720  hpt= Xorriso__hide_mode_text(xorriso->boot_image_cat_hidden & 63, 0);
  721  if(hpt != NULL)
  722    sprintf(line, "-boot_image %s cat_hidden=%s\n", form, hpt);
  723  Xorriso_free_meM(hpt);
  724  if(!(is_default && no_defaults))
  725    Xorriso_status_result(xorriso,filter,fp,flag&2);
  726 
  727  if(xorriso->boot_count > 0) {
  728 
  729    /* show attached boot image info */;
  730 
  731    ret= iso_image_get_all_boot_imgs(image, &num_boots, &boots, &bootnodes, 0);
  732    Xorriso_process_msg_queues(xorriso,0);
  733    if(ret == 1 && num_boots > 0) {
  734      for(i= 0; i < num_boots; i++) {
  735        ret= Xorriso_path_from_node(xorriso, (IsoNode *) bootnodes[i], path, 0);
  736        if(ret <= 0)
  737     continue;
  738        platform_id= el_torito_get_boot_platform_id(boots[i]);
  739        patch= el_torito_get_isolinux_options(boots[i], 0);
  740        el_torito_get_boot_media_type(boots[i], &media_type);
  741        load_size= el_torito_get_load_size(boots[i]) * 512;
  742        el_torito_get_id_string(boots[i], id_string);
  743        el_torito_get_selection_crit(boots[i], sel_crit);
  744        if(media_type == ELTORITO_FLOPPY_EMUL)
  745          media_type= 2;
  746        else if(media_type == ELTORITO_HARD_DISC_EMUL)
  747          media_type= 1;
  748        else
  749          media_type= 0;
  750        ret= Xorriso_boot_item_status(xorriso, xorriso->boot_image_cat_path,
  751                   path, platform_id, patch, media_type,
  752                   load_size, id_string, sel_crit, "any",
  753                   filter, fp, 16 | (flag & 3));
  754        if(ret <= 0)
  755      continue;
  756        sprintf(line,"-boot_image %s next\n", form);
  757        Xorriso_status_result(xorriso,filter,fp,flag&2);
  758      }
  759    }
  760  } 
  761 
  762  /* Show pending boot image info */
  763  if(strcmp(xorriso->boot_image_bin_form, "isolinux") == 0 ||
  764     strcmp(xorriso->boot_image_bin_form, "grub") == 0)
  765    form= xorriso->boot_image_bin_form;
  766 
  767  if(xorriso->boot_count > 0 &&
  768     xorriso->boot_platform_id == 0 &&
  769     xorriso->patch_isolinux_image == 0 &&
  770     xorriso->boot_image_bin_path[0] == 0 &&
  771     xorriso->boot_image_emul == 0 &&
  772     xorriso->boot_image_load_size == 4 * 512) {
  773    for(i= 0; i < 20; i++)
  774      if(xorriso->boot_selection_crit[i])
  775    break;
  776    if(i >= 20)
  777      for(i= 0; i < 28; i++)
  778        if(xorriso->boot_id_string[i])
  779      break;
  780    if(i >= 28)
  781      {ret= 1; goto ex;} /* Images registered, pending is still default */
  782  }
  783 
  784 report_open_item:;
  785  hflag= 16; 
  786  if(xorriso->boot_platform_id == 0xef && !xorriso->boot_efi_default)
  787    hflag= 0;
  788  ret= Xorriso_boot_item_status(xorriso, xorriso->boot_image_cat_path,
  789              xorriso->boot_image_bin_path, xorriso->boot_platform_id,
  790              xorriso->patch_isolinux_image, xorriso->boot_image_emul,
  791              xorriso->boot_image_load_size, xorriso->boot_id_string,
  792              xorriso->boot_selection_crit, form,
  793              filter, fp, hflag | (flag & 3));
  794  if(ret <= 0)
  795    goto ex;
  796 
  797  ret = Xorriso_append_part_status(xorriso, image, filter, fp, flag & 3);
  798  if(ret <= 0)
  799    goto ex;
  800 
  801  ret= 1;
  802 ex:
  803  if(boots != NULL)
  804    free(boots);
  805  if(bootnodes != NULL)
  806    free(bootnodes);
  807  if(image != NULL)
  808    iso_image_unref(image);
  809  Xorriso_free_meM(path);
  810  return(ret);
  811 }
  812 
  813 
  814 int Xorriso__append_boot_params(char *line, ElToritoBootImage *bootimg,
  815                                 int flag)
  816 {
  817  unsigned int platform_id;
  818 
  819  platform_id= el_torito_get_boot_platform_id(bootimg); 
  820  if(platform_id != 0)
  821    sprintf(line + strlen(line),
  822            " , platform_id=0x%-2.2X ", (unsigned int) platform_id);
  823  if(el_torito_seems_boot_info_table(bootimg, 0))
  824    sprintf(line + strlen(line), " , boot_info_table=on");
  825  if(el_torito_seems_boot_info_table(bootimg, 1))
  826    sprintf(line + strlen(line), " , grub2_boot_info=on");
  827  return(1);
  828 }
  829 
  830 
  831 /* @param flag bit0= no output if no boot record was found
  832                bit1= short form
  833                bit3= report to info channel (else to result channel)
  834 */
  835 int Xorriso_show_boot_info(struct XorrisO *xorriso, int flag)
  836 {
  837  int ret, bin_path_valid= 0, i, num_boots, sa_count;
  838  char *respt, *path= NULL, **sa_report= NULL, *sa_summary= NULL;
  839  unsigned char *lb0= NULL;
  840  struct burn_drive_info *dinfo;
  841  struct burn_drive *drive;
  842  IsoImage *image= NULL;
  843  ElToritoBootImage *bootimg, **boots = NULL;
  844  IsoFile *bootimg_node, **bootnodes = NULL;
  845  IsoBoot *bootcat_node;
  846 
  847  Xorriso_alloc_meM(path, char, SfileadrL);
  848  Xorriso_alloc_meM(lb0, unsigned char, 2048);
  849 
  850  respt= xorriso->result_line;
  851 
  852  if(xorriso->boot_count > 0) {
  853    if(!(flag & 1)) {
  854      sprintf(respt, "Boot record  : (overridden by -boot_image any next)\n");
  855      Xorriso_toc_line(xorriso, flag & 8);
  856    }
  857    ret= 1; goto ex;
  858  }
  859 
  860  ret= Xorriso_get_drive_handles(xorriso, &dinfo, &drive,
  861                                 "on attempt to print boot info", 16);
  862  if(ret<=0)
  863    goto no_boot;
  864  image= isoburn_get_attached_image(drive);
  865  if(image == NULL) {
  866    ret= 0;
  867 no_boot:;
  868    if(!(flag & 1)) {
  869      sprintf(respt, "Boot record  : none\n");
  870      Xorriso_toc_line(xorriso, flag & 8);
  871    }
  872    goto ex;
  873  }
  874 
  875  ret= iso_image_report_system_area(image, &sa_report, &sa_count, 0);
  876  if(ret > 0 && sa_report != NULL)
  877    for(i= 0; i < sa_count; i++)
  878      if(strncmp(sa_report[i], "System area summary: ", 21) == 0) {
  879        Xorriso_alloc_meM(sa_summary, char, strlen(sa_report[i] + 21) + 1);
  880        strcpy(sa_summary, sa_report[i] + 21);
  881    break;
  882      }
  883  if(sa_report != NULL)
  884    iso_image_report_system_area(image, &sa_report, &sa_count, 1 << 15);
  885  Xorriso_process_msg_queues(xorriso,0);
  886 
  887  /* Using the nodes with extreme care . They might be deleted meanwhile. */
  888  ret= iso_image_get_boot_image(image, &bootimg, &bootimg_node, &bootcat_node);
  889  if(ret != 1) {
  890    if(sa_summary == NULL)
  891      goto no_boot;
  892    sprintf(respt, "Boot record  : (system area only) , %s\n", sa_summary);
  893    Xorriso_toc_line(xorriso, flag & 8);
  894    ret= 1; goto ex;
  895  }
  896  ret= iso_image_get_all_boot_imgs(image, &num_boots, &boots, &bootnodes, 0);
  897  Xorriso_process_msg_queues(xorriso,0);
  898  if(ret != 1) {
  899    num_boots= 0;
  900  } else {
  901    ret= Xorriso_path_from_node(xorriso, (IsoNode *) bootnodes[0], path, 0);
  902    if(ret > 0)
  903      bin_path_valid= 1;
  904  }
  905  sprintf(respt, "Boot record  : El Torito");
  906  if(sa_summary != NULL)
  907    sprintf(respt + strlen(respt), " , %s", sa_summary);
  908 
  909  strcat(respt, "\n");
  910  Xorriso_toc_line(xorriso, flag & 8);
  911  if(flag & 2)
  912    {ret= 1; goto ex;}
  913 
  914  if(xorriso->loaded_boot_cat_path[0]) {
  915    sprintf(respt, "Boot catalog : ");
  916    Text_shellsafe(xorriso->loaded_boot_cat_path, respt, 1);
  917    strcat(respt, "\n");
  918  } else {
  919    sprintf(respt, "Boot catalog : -not-found-at-load-time-\n");
  920  }
  921  Xorriso_toc_line(xorriso, flag & 8);
  922 
  923  if(bin_path_valid) {
  924    sprintf(respt, "Boot image   : ");
  925    Text_shellsafe(path, respt, 1);
  926  } else if(xorriso->loaded_boot_bin_lba <= 0) {
  927    sprintf(respt, "Boot image   : -not-found-at-load-time-");
  928  } else {
  929    sprintf(respt, "Boot image   : -not-found-any-more-by-lba=%d",
  930            xorriso->loaded_boot_bin_lba);
  931  }
  932  Xorriso__append_boot_params(respt, bootimg, 0);
  933  strcat(respt, "\n");
  934  Xorriso_toc_line(xorriso, flag & 8);
  935 
  936  if(num_boots > 1) {
  937    for(i= 1; i < num_boots; i++) {
  938      ret= Xorriso_path_from_node(xorriso, (IsoNode *) bootnodes[i], path, 0);
  939      if(ret > 0) {
  940        sprintf(respt, "Boot image   : ");
  941        Text_shellsafe(path, respt, 1);
  942      } else
  943        sprintf(respt, "Boot image   : -not-found-any-more-");
  944      Xorriso__append_boot_params(respt, boots[i], 0);
  945      strcat(respt, "\n");
  946      Xorriso_toc_line(xorriso, flag & 8);
  947    }
  948  }
  949  ret= 1;
  950 ex:;
  951  if(boots != NULL)
  952    free(boots);
  953  if(bootnodes != NULL)
  954    free(bootnodes);
  955  if(image != NULL)
  956    iso_image_unref(image); /* release obtained reference */
  957  Xorriso_free_meM(path);
  958  Xorriso_free_meM(lb0);
  959  Xorriso_free_meM(sa_summary);
  960  return(ret);
  961 } 
  962 
  963 
  964 /* @param flag    bit0=silently return 0 if no volume/image is present
  965 */
  966 int Xorriso_get_volume(struct XorrisO *xorriso, IsoImage **volume,
  967                        int flag)
  968 {
  969  *volume= NULL;
  970  if(xorriso->in_volset_handle==NULL) {
  971    if(flag & 1)
  972      return(0);
  973    Xorriso_process_msg_queues(xorriso,0);
  974    sprintf(xorriso->info_text,"No ISO image present.");
  975    if(xorriso->indev[0]==0 && xorriso->outdev[0]==0)
  976      sprintf(xorriso->info_text+strlen(xorriso->info_text),
  977              " No -dev, -indev, or -outdev selected.");
  978    else
  979      sprintf(xorriso->info_text+strlen(xorriso->info_text),
  980              " Possible program error with drive '%s'.", xorriso->indev);
  981 
  982    if(!xorriso->no_volset_present)
  983      Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
  984    xorriso->no_volset_present= 1;
  985    return(0);
  986  }
  987  *volume= (IsoImage *) xorriso->in_volset_handle;
  988  xorriso->no_volset_present= 0;
  989  return(*volume != NULL);
  990 }
  991 
  992 
  993 /* @param flag bit0= do not return 1 on volset_change_pending != 1
  994 */
  995 int Xorriso_change_is_pending(struct XorrisO *xorriso, int flag)
  996 {
  997  if(flag & 1)
  998    return(xorriso->volset_change_pending == 1);
  999  return(!!xorriso->volset_change_pending);
 1000 }
 1001 
 1002 
 1003 /* @param flag bit0= do not set hln_change_pending */
 1004 int Xorriso_set_change_pending(struct XorrisO *xorriso, int flag)
 1005 {
 1006  int ret;
 1007  IsoImage *image;
 1008 
 1009  ret= Xorriso_get_volume(xorriso, &image, 1);
 1010  if(ret <= 0)
 1011    return ret;
 1012  /* Do not override mark of -as mkisofs -print-size */
 1013  if(xorriso->volset_change_pending != 2)
 1014     xorriso->volset_change_pending= 1;
 1015  if(!(flag & 1))
 1016    xorriso->hln_change_pending= 1;
 1017  return(1);
 1018 }
 1019 
 1020 
 1021 /**
 1022     @param flag bit0= print mount command to result channel rather than
 1023                       performing it 
 1024                 bit1= do not allow prefixes with cmd
 1025                 bit2= interpret unprefixed cmd as shell:
 1026 */
 1027 int Xorriso_mount(struct XorrisO *xorriso, char *dev, int adr_mode,
 1028                   char *adr_value, char *cmd, int flag)
 1029 {
 1030  int ret, lba, track, session, params_flag= 0, is_safe= 0, is_extra_drive= 0;
 1031  int give_up= 0, mount_chardev= 0, status, aquire_flag= 0;
 1032  char volid[33], *devadr, *mount_command= NULL, *adr_data= NULL, *adr_pt;
 1033  char *dev_path, *libburn_adr= NULL;
 1034  char *dpt, *sysname= "";
 1035  struct stat stbuf;
 1036  struct burn_drive_info *dinfo= NULL;
 1037  struct burn_drive *drive= NULL;
 1038 
 1039  Xorriso_alloc_meM(mount_command, char, SfileadrL);
 1040  Xorriso_alloc_meM(adr_data, char, 163);
 1041  Xorriso_alloc_meM(libburn_adr, char, BURN_DRIVE_ADR_LEN + SfileadrL);
 1042 
 1043  devadr= dev;
 1044  adr_pt= adr_value;
 1045  if(strcmp(dev, "indev") == 0) {
 1046    ret= Xorriso_get_drive_handles(xorriso, &dinfo, &drive,
 1047                                   "on attempt to perform -mount \"indev\"", 0);
 1048    if(ret<=0)
 1049      goto ex;
 1050    dev_path= devadr= xorriso->indev;
 1051    if(strncmp(dev_path, "stdio:", 6) == 0)
 1052      dev_path+= 6;
 1053    else if(strncmp(dev_path, "mmc:", 4) == 0)
 1054      dev_path+= 4;
 1055    if(xorriso->in_drive_handle == xorriso->out_drive_handle)
 1056      give_up= 3;
 1057    else
 1058      give_up= 1;
 1059  } else if(strcmp(dev, "outdev") == 0) {
 1060    ret= Xorriso_get_drive_handles(xorriso, &dinfo, &drive,
 1061                                   "on attempt to perform -mount \"outdev\"", 
 1062                                   2);
 1063    if(ret<=0)
 1064      goto ex;
 1065    dev_path= devadr= xorriso->outdev;
 1066    if(strncmp(dev_path, "stdio:", 6) == 0)
 1067      dev_path+= 6;
 1068    else if(strncmp(dev_path, "mmc:", 4) == 0)
 1069      dev_path+= 4;
 1070    if(xorriso->in_drive_handle == xorriso->out_drive_handle)
 1071      give_up= 3;
 1072    else
 1073      give_up= 2;
 1074  } else {
 1075    is_extra_drive= 1;
 1076    dev_path= dev;
 1077    if(strncmp(dev_path, "stdio:", 6) == 0)
 1078      dev_path+= 6;
 1079    else if(strncmp(dev_path, "mmc:", 4) == 0)
 1080      dev_path+= 4;
 1081 
 1082    /* do only accept regular files and block devices */
 1083    ret= stat(dev_path, &stbuf);
 1084    if(ret == -1) {
 1085      sprintf(xorriso->info_text, "Cannot determine properties of file ");
 1086      Text_shellsafe(dev_path, xorriso->info_text, 1);
 1087      Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
 1088      ret= 0; goto ex;
 1089    }
 1090    ret= System_uname(&sysname, NULL, NULL, NULL, 0);
 1091    if(ret > 0 && strcmp(sysname, "FreeBSD") == 0)
 1092      mount_chardev= 1;
 1093    if(!(S_ISREG(stbuf.st_mode) || (S_ISBLK(stbuf.st_mode) && !mount_chardev)
 1094         || (S_ISCHR(stbuf.st_mode) && !mount_chardev))) {
 1095      sprintf(xorriso->info_text,
 1096              "File object is not suitable as mount device: ");
 1097      Text_shellsafe(dev_path, xorriso->info_text, 1);
 1098      Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
 1099      ret= 0; goto ex;
 1100    }
 1101 
 1102    /* Acquire drive as direct libburn address or via stdio: prefix */
 1103    if(strncmp(dev, "mmc:", 4) == 0)
 1104      ret= burn_drive_convert_fs_adr(dev + 4, libburn_adr);
 1105    else
 1106      ret= burn_drive_convert_fs_adr(dev, libburn_adr);
 1107    Xorriso_process_msg_queues(xorriso,0);
 1108    if(ret < 0)
 1109      {ret= -1; goto ex;}
 1110    if(ret == 0 && strncmp(dev, "stdio:", 6) != 0 &&
 1111       strncmp(dev, "mmc:", 4) != 0)
 1112      sprintf(libburn_adr, "stdio:%s", dev);
 1113    burn_preset_device_open(
 1114            (xorriso->drives_exclusive && !(xorriso->mount_opts_flag & 1)) |
 1115            (xorriso->linux_scsi_dev_family << 2), 0, 0);
 1116    aquire_flag= 1;
 1117    if((xorriso->toc_emulation_flag & 2) && adr_mode == 3)
 1118      aquire_flag|= 16;
 1119    if(xorriso->toc_emulation_flag & 4)
 1120      aquire_flag|= 128;
 1121    if(xorriso->toc_emulation_flag & 8)
 1122      aquire_flag|= 512;
 1123    ret= isoburn_drive_aquire(&dinfo, libburn_adr, aquire_flag);
 1124    burn_preset_device_open(1 | (xorriso->linux_scsi_dev_family << 2), 0, 0);
 1125    Xorriso_process_msg_queues(xorriso,0);
 1126    if(ret <= 0)
 1127      {ret= 0; goto ex;}
 1128    drive= dinfo[0].drive;
 1129  }
 1130 
 1131  if(adr_mode == 4 && strlen(adr_pt) <= 80) {
 1132    ret= Xorriso__bourne_to_reg(adr_pt, adr_data, 0);
 1133    if(ret == 1) {
 1134      params_flag|= 4;
 1135      adr_pt= adr_data;
 1136    }
 1137  }
 1138  ret= isoburn_get_mount_params(drive, adr_mode, adr_pt, &lba, &track,
 1139                                &session, volid, params_flag);
 1140  Xorriso_process_msg_queues(xorriso,0);
 1141  if(ret <= 0)
 1142    goto ex;
 1143  if(((session <= 0 || track <= 0) && !(aquire_flag & 16)) || ret == 2) {
 1144    Xorriso_msgs_submit(xorriso, 0,
 1145                 "-mount : Given address does not point to an ISO 9660 session",
 1146                 0, "FAILURE", 0);
 1147    ret= 0; goto ex;
 1148  }
 1149  if(strstr(devadr, "stdio:") == devadr)
 1150    devadr+= 6;
 1151  if(strstr(devadr, "mmc:") == devadr)
 1152    devadr+= 4;
 1153  ret= Xorriso_make_mount_cmd(xorriso, cmd, lba, track, session, volid, devadr,
 1154                           mount_command, (flag & (2 | 4)) | ((flag & 4) << 1));
 1155  if(ret <= 0)
 1156    goto ex;
 1157  if(ret == 2)
 1158    is_safe= 1;
 1159 
 1160  if(is_extra_drive) {
 1161    isoburn_drive_release(drive, 0);
 1162    burn_drive_info_free(dinfo);
 1163    drive= NULL;
 1164  } else if(give_up > 0 && !((flag & 1) || (xorriso->mount_opts_flag & 1))) {
 1165    ret= Xorriso_give_up_drive(xorriso, give_up);
 1166    if(ret <= 0)
 1167      goto ex;
 1168  }
 1169  Xorriso_process_msg_queues(xorriso,0);
 1170 
 1171  sprintf(xorriso->info_text, "Volume id    : ");
 1172  Text_shellsafe(volid, xorriso->info_text, 1);
 1173  strcat(xorriso->info_text, "\n");
 1174  Xorriso_info(xorriso, 0);
 1175  if(flag & 1) {
 1176    sprintf(xorriso->result_line, "%s\n", mount_command);
 1177    Xorriso_result(xorriso,0);
 1178  } else {
 1179    sprintf(xorriso->info_text, "Mount command: %s\n", mount_command);
 1180    Xorriso_info(xorriso, 0);
 1181    if(!is_safe) {
 1182      Xorriso_msgs_submit(xorriso, 0,
 1183   "-mount : Will not perform mount command which stems from command template.",
 1184        0, "SORRY", 0);
 1185      sprintf(xorriso->result_line, "%s\n", mount_command);
 1186      Xorriso_result(xorriso,0);
 1187    } else {
 1188      ret= Xorriso_execv(xorriso, mount_command, 0, NULL, "/bin:/sbin",
 1189                         NULL, NULL, NULL, &status, 1);
 1190      if(WIFEXITED(status) && WEXITSTATUS(status) != 0) {
 1191        sprintf(xorriso->info_text,
 1192                "-mount : mount command failed with exit value %d",
 1193                (int) WEXITSTATUS(status));
 1194        Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
 1195        ret= 0; goto ex;
 1196      }
 1197      sprintf(xorriso->info_text, "\nMounted session %d of device ", session);
 1198      Text_shellsafe(dev_path, xorriso->info_text, 1);
 1199      dpt= strchr(cmd, ':');
 1200      if(dpt == NULL)
 1201        dpt= cmd ;
 1202      else
 1203        dpt++;
 1204      sprintf(xorriso->info_text + strlen(xorriso->info_text), " as directory ");
 1205      Text_shellsafe(dpt, xorriso->info_text, 1);
 1206      strcat(xorriso->info_text, "\n");
 1207      Xorriso_info(xorriso, 0);
 1208    }
 1209  }
 1210  ret= 1;
 1211 ex:;
 1212  if(is_extra_drive && drive != NULL) {
 1213    isoburn_drive_release(drive, 0);
 1214    burn_drive_info_free(dinfo);
 1215    Xorriso_process_msg_queues(xorriso,0);
 1216  }
 1217  Xorriso_free_meM(mount_command);
 1218  Xorriso_free_meM(adr_data);
 1219  Xorriso_free_meM(libburn_adr);
 1220  return(ret);
 1221 }
 1222 
 1223 
 1224 /* @param flag bit0= give up all boot file paths
 1225                bit1= refuse if already a path is added
 1226 */
 1227 int Xorriso_add_mips_boot_file(struct XorrisO *xorriso, char *path, int flag)
 1228 {
 1229  int ret;
 1230  IsoImage *image;
 1231  char *paths[15];
 1232 
 1233  ret= Xorriso_get_volume(xorriso, &image, 0);
 1234  if(ret <= 0)
 1235    return ret;
 1236  if(flag & 1) {
 1237    iso_image_give_up_mips_boot(image, 0);
 1238    Xorriso_process_msg_queues(xorriso,0);
 1239    return(1);
 1240  }
 1241  if(flag & 2) {
 1242    ret= iso_image_get_mips_boot_files(image, paths, 0);
 1243    Xorriso_process_msg_queues(xorriso,0);
 1244    if(ret < 0)
 1245      goto report_error;
 1246    if(ret > 0) {
 1247      Xorriso_msgs_submit(xorriso, 0,
 1248                          "There is already a boot image file registered.",
 1249                          0, "FAILURE", 0);
 1250      return(0);
 1251    }
 1252  }
 1253  ret = iso_image_add_mips_boot_file(image, path, 0);
 1254  Xorriso_process_msg_queues(xorriso,0);
 1255  if (ret < 0) {
 1256 report_error:;
 1257    Xorriso_report_iso_error(xorriso, "", ret,
 1258                             "Error when adding MIPS boot file",
 1259                             0, "FAILURE", 1);
 1260    return(0);
 1261  }
 1262  return(1);
 1263 }
 1264 
 1265 
 1266 /* @param flag bit0= Give up HP-PA boot parameters
 1267 */
 1268 int Xorriso_set_hppa_boot_parm(struct XorrisO *xorriso, char *text, char *what,
 1269                                int flag)
 1270 {
 1271  int ret;
 1272  IsoImage *image;
 1273  char *par[5];
 1274 
 1275  ret= Xorriso_get_volume(xorriso, &image, 0);
 1276  if(ret <= 0)
 1277    return(ret);
 1278  par[0]= par[1]= par[2]= par[3]= par[4]= NULL;
 1279  if(flag & 1) {
 1280    /* Give up HP-PA boot parameters */
 1281    iso_image_set_hppa_palo(image, par[0], par[1], par[2], par[3], par[4],
 1282                            1);
 1283    return(1);
 1284  }
 1285  if(strcmp(what, "cmdline") == 0) {
 1286    par[0]= text;
 1287  } else if(strcmp(what, "bootloader") == 0) {
 1288    par[1]= text;
 1289  } else if(strcmp(what, "kernel_32") == 0 || strcmp(what, "kernel-32") == 0) {
 1290    par[2]= text;
 1291  } else if(strcmp(what, "kernel_64") == 0 || strcmp(what, "kernel-64") == 0) {
 1292    par[3]= text;
 1293  } else if(strcmp(what, "ramdisk") == 0) {
 1294    par[4]= text;
 1295  } else if(strcmp(what, "hdrversion") == 0) {
 1296    if(strcmp(text, "4") == 0) {
 1297      xorriso->system_area_options= (xorriso->system_area_options & ~0xfc) |
 1298                                    (4 << 2);
 1299    } else if(strcmp(text, "5") == 0) {
 1300      xorriso->system_area_options= (xorriso->system_area_options & ~0xfc) |
 1301                                    (5 << 2);
 1302    } else {
 1303      strcpy(xorriso->info_text, "Unsupported HP-PA PALO header version ");
 1304      Text_shellsafe(text, xorriso->info_text, 1);
 1305      Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
 1306      return(0);
 1307    }
 1308    return(1);
 1309  } else {
 1310    strcpy(xorriso->info_text,
 1311           "HP-PA boot parameter name not recognized: hppa_");
 1312    Text_shellsafe(what, xorriso->info_text, 1);
 1313    Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
 1314    return(0);
 1315  }
 1316  ret= iso_image_set_hppa_palo(image, par[0], par[1], par[2], par[3], par[4],
 1317                               0);
 1318  if (ret < 0) {
 1319    Xorriso_report_iso_error(xorriso, "", ret,
 1320                             "Error when adding HP-PA boot parameter",
 1321                             0, "FAILURE", 1);
 1322    return(0);
 1323  }
 1324  return(1);
 1325 }
 1326 
 1327 
 1328 /* @param flag bit0= Give up DEC Alpha boot parameters
 1329 */
 1330 int Xorriso_set_alpha_boot(struct XorrisO *xorriso, char *path, int flag)
 1331 {
 1332  int ret;
 1333  IsoImage *image;
 1334 
 1335  ret= Xorriso_get_volume(xorriso, &image, 0);
 1336  if(ret <= 0)
 1337    return(ret);
 1338  if(flag & 1) {
 1339    /* Give up boot parameters */
 1340    iso_image_set_alpha_boot(image, NULL, 1);
 1341    return(1);
 1342  }
 1343  ret= iso_image_set_alpha_boot(image, path, 0);
 1344  if (ret < 0) {
 1345    Xorriso_report_iso_error(xorriso, "", ret,
 1346                             "Error when adding DEC Alpha boot loader",
 1347                             0, "FAILURE", 1);
 1348    return(0);
 1349  }
 1350  return(1);
 1351 }
 1352  
 1353 
 1354 /* @param flag bit0= do not set xorriso->system_area_options, just check
 1355                bit1= only check for grub2_mbr <-> isolinux partition_table
 1356 */
 1357 int Xorriso_coordinate_system_area(struct XorrisO *xorriso, int sa_type,
 1358                                    int options, char *cmd, int flag)
 1359 {
 1360  int old_type, old_options, new_options;
 1361  static char *type_names[7] = {
 1362       "MBR", "MIPS Big Endian Volume Header", "MIPS Little Endian Boot Block",
 1363       "SUN Disk Label", "HP-PA PALO v4", "HP-PA PALO v5",
 1364       "DEC Alpha SRM Boot Block"};
 1365  static int num_names = 7;
 1366 
 1367  old_type= (xorriso->system_area_options & 0xfc) >> 2;
 1368  old_options= xorriso->system_area_options & 0x3c03;
 1369  new_options= options & 0x3c03;
 1370  if(((options & (1 << 14)) && (xorriso->system_area_options & 2)) ||
 1371     ((options & 2) && (xorriso->system_area_options & (1 << 14))))
 1372    goto reject;
 1373  if(flag & 2)
 1374    return(1);
 1375  if((old_type != 0 || old_options != 0) &&
 1376     (old_type != sa_type || (old_options != 0 && old_options != new_options))){
 1377 reject:;
 1378    sprintf(xorriso->info_text, "%s : First sector already occupied by %s",
 1379            cmd, old_type < num_names ?
 1380                 type_names[old_type] : "other boot facility");
 1381    if(old_type == 0 && (old_options & 2))
 1382      strcat(xorriso->info_text, " for ISOLINUX isohybrid");
 1383    else if (old_type == 0 && (xorriso->system_area_options & (1 << 14))) {
 1384      strcat(xorriso->info_text, " for GRUB2 patching");
 1385      if(old_type == 0 && (old_options & 1))
 1386        strcat(xorriso->info_text, " with partition table");
 1387    } else if(old_type == 0 && (old_options & 1))
 1388      strcat(xorriso->info_text, " for partition table");
 1389    Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
 1390    goto hint_revoke;
 1391  }
 1392  if(!(flag & 1))
 1393    xorriso->system_area_options= (xorriso->system_area_options & ~0x3cff) |
 1394                                  ((sa_type << 2) & 0xfc) | (options & 0x3c03);
 1395  return(1);
 1396 
 1397 hint_revoke:;
 1398  if(old_type == 0)
 1399    sprintf(xorriso->info_text, "Revokable by -boot_image any discard");
 1400  else if(old_type == 1 || old_type == 2)
 1401    sprintf(xorriso->info_text, "Revokable by -boot_image any mips_discard");
 1402  else if(old_type == 3)
 1403    sprintf(xorriso->info_text, "Revokable by -boot_image any sparc_discard");
 1404  if(old_type < 4)
 1405    Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "HINT", 0);
 1406  return(0);
 1407 }
 1408 
 1409 
 1410 int Xorriso_gpt_crc(struct XorrisO *xorriso, char *path, int flag)
 1411 {
 1412  int ret;
 1413  char *buf = NULL;
 1414  FILE *fp = NULL;
 1415  uint32_t crc;
 1416 
 1417  Xorriso_alloc_meM(buf, char, 32 * 1024);
 1418 
 1419  ret= Xorriso_afile_fopen(xorriso, path, "rb", &fp, 0);
 1420  if(ret <= 0)
 1421    goto ex;
 1422  ret= fread(buf, 1, 32 * 1024, fp);
 1423  if(ret == 0) {
 1424    strcpy(xorriso->info_text,
 1425           "No bytes readable for GPT CRC from ");
 1426    Text_shellsafe(path, xorriso->info_text, 1);
 1427    Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "WARNING", 0);
 1428    ret= 0; goto ex;
 1429  }
 1430  crc= iso_crc32_gpt((unsigned char *) buf, ret, 0);
 1431  sprintf(xorriso->result_line, "0x%8.8x\n", (unsigned int) crc);
 1432  Xorriso_result(xorriso, 0);
 1433  ret= 1;
 1434 ex:;
 1435  if(fp != NULL && fp != stdin)
 1436    fclose(fp);
 1437  Xorriso_free_meM(buf);
 1438  return(ret);
 1439 }
 1440 
 1441 
 1442 static int Xorriso_split_report_line(struct XorrisO *xorriso, char *line,
 1443                                      int num_limit,
 1444                                      char *name, char **contentpt,
 1445                                      double *num, int *num_count,
 1446                                      char **textpt, int flag)
 1447 {
 1448  int i;
 1449  char *spt, *ept, *cpt;
 1450 
 1451  if(strlen(line) < 21) {
 1452 undigestible:
 1453    sprintf(xorriso->info_text,
 1454            "Undigestible report line with -report_* mode cmd: '%s'", line);
 1455    Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "SORRY", 0);
 1456    return(0);
 1457  }
 1458  if(line[19] != ':')
 1459    goto undigestible;
 1460  strncpy(name, line, 20);
 1461  name[20]= 0;
 1462 
 1463  for(spt= line + 20; *spt == ' '; spt++);
 1464  *textpt= *contentpt= spt;
 1465  *num_count= 0;
 1466  for(i= 0; i < num_limit; i++) {
 1467    /* Get word */
 1468    for(spt= *textpt; *spt == ' '; spt++);
 1469    if(*spt == 0) {
 1470      *textpt= spt;
 1471  break;
 1472    }
 1473    for(ept= spt + 1; *ept != ' ' && *ept != 0; ept++);
 1474    /* Look for decimal number */
 1475    if(ept - spt > 16)
 1476  break;
 1477    for(cpt= spt; cpt < ept; cpt++)
 1478      if(*cpt < '0' || *cpt > '9')
 1479    break;
 1480    if(cpt != ept)
 1481  break;
 1482    sscanf(spt, "%lf", num + *num_count);
 1483    (*num_count)++;
 1484    *textpt= ept;
 1485  }
 1486  /* Set *textpt to next non-blank */
 1487  for(; **textpt == ' '; (*textpt)++);
 1488  return(1);
 1489 }
 1490 
 1491 
 1492 int Xorriso_record_cmd_line(struct XorrisO *xorriso, char *buf,
 1493                             char **cmds, int *cmd_count, int flag)
 1494 {
 1495  int ret;
 1496 
 1497  if(flag & 1) {
 1498    (*cmd_count)++;
 1499    ret= 1; goto ex;
 1500  }
 1501  Xorriso_alloc_meM(cmds[*cmd_count], char, strlen(buf) + 1);
 1502  strcpy(cmds[*cmd_count], buf);
 1503  (*cmd_count)++;
 1504  ret= 1;
 1505 ex:;
 1506  return(ret);
 1507 }
 1508 
 1509 
 1510 /* @param flag bit0= zeroize MBR partition table
 1511                bit1= zeroize GPT
 1512                bit2= zeroize APM
 1513               bit30= Source imported_iso rather than local_fs
 1514 */
 1515 int Xorriso_add_intvl_adr(struct XorrisO *xorriso, char *buf,
 1516                           uint64_t start_adr, uint64_t end_adr, char *suffix,
 1517                           int flag)
 1518 {
 1519  char *path;
 1520 
 1521  sprintf(buf + strlen(buf), "--interval:%s:%.f%s-%.f%s:",
 1522          ((flag & (1 << 30)) ? "imported_iso" : "local_fs"),
 1523          (double) start_adr, suffix, (double) end_adr, suffix);
 1524  if(flag & 1)
 1525    strcat(buf, "zero_mbrpt,");
 1526  if(flag & 2)
 1527    strcat(buf, "zero_gpt,");
 1528  if(flag & 4)
 1529    strcat(buf, "zero_apm,");
 1530  if(buf[strlen(buf) - 1] == ',')
 1531    buf[strlen(buf) - 1] = 0;
 1532  strcat(buf, ":");
 1533  path= xorriso->indev;
 1534  if(strncmp(path, "stdio:", 6) == 0)
 1535    path+= 6;
 1536  Text_shellsafe(path, buf, 1);
 1537  return(1);
 1538 }
 1539 
 1540 
 1541 int Xorriso_add_offset_size(struct XorrisO *xorriso, char *buf,
 1542                             off_t byte_offset, off_t byte_size, int flag)
 1543 {
 1544  strcat(buf, " ");
 1545  Sfile_off_t_text(buf + strlen(buf), byte_offset, 0);
 1546  strcat(buf, " ");
 1547  Sfile_off_t_text(buf + strlen(buf), byte_size, 0);
 1548  return(1);
 1549 }
 1550 
 1551 
 1552 struct elto_img_par {
 1553  int n, ldsiz, boot_info_table, grub2_boot_info;
 1554  int do_gpt_basdat, do_gpt_hfsplus, do_apm_hfsplus;
 1555  unsigned int ld_seg, hdpt, platform_id;
 1556  unsigned long int lba, extract_size;
 1557  char pltf[8], b[8], emul[8], boot_image_type[16];
 1558  char *path, *id_string, *sel_crit;
 1559 };
 1560 
 1561 
 1562 /* @param ptype   0= unknown, 1= gpt-basdat, 2=gpt-hfsplus, 3=EFI
 1563    @param flag    bit0= isohybrid
 1564 */
 1565 static int Xorriso_register_eltorito_gpt(struct XorrisO *xorriso,
 1566                                          struct elto_img_par *et_img,
 1567                                          int ptype,
 1568                                          int *efi_boot_part, int *first_efi,
 1569                                          int flag)
 1570 {
 1571  if(flag & 1) {
 1572    if(ptype == 1 || ptype == 3)
 1573      et_img->do_gpt_basdat= 1;
 1574    else if(ptype == 2)
 1575      et_img->do_gpt_hfsplus= 1;
 1576    return(1);
 1577  } else if(*first_efi && et_img->platform_id == 0xef) {
 1578    *efi_boot_part= 1;
 1579    return(1);
 1580  }
 1581  if(et_img->platform_id == 0xef)
 1582    *first_efi= 0;
 1583  return(0);
 1584 }
 1585 
 1586 
 1587 /* @param ptype   0= unknown, 1= gpt-basdat, 2=gpt-hfsplus, 3=EFI
 1588    @param flag    bit0= isohybrid
 1589 */
 1590 static int Xorriso_search_eltorito_path(struct XorrisO *xorriso,
 1591                                         struct elto_img_par *et_imgs,
 1592                                         int elto_count, char *path, int ptype,
 1593                                         int *found, int *efi_boot_part,
 1594                                         int flag)
 1595 {
 1596  int first_efi= 1, et_idx, ret;
 1597 
 1598  for(et_idx= 0; et_idx < elto_count; et_idx++) {
 1599    if(strcmp(et_imgs[et_idx].path, path) != 0)
 1600  continue;
 1601    ret= Xorriso_register_eltorito_gpt(xorriso, et_imgs + et_idx,
 1602                                       ptype, efi_boot_part, &first_efi, flag);
 1603    if(ret > 0)
 1604  break;
 1605  }
 1606  *found= et_idx;
 1607  if(et_idx < elto_count)
 1608    return(1);
 1609  return(0);
 1610 }
 1611 
 1612 
 1613 static int Xorriso_search_eltorito_lba(struct XorrisO *xorriso,
 1614                                        struct elto_img_par *et_imgs,
 1615                                        int elto_count,
 1616                                        unsigned int lba,
 1617                                        int *found, int flag)
 1618 {
 1619  int et_idx;
 1620 
 1621  for(et_idx= 0; et_idx < elto_count; et_idx++)
 1622    if(et_imgs[et_idx].lba == lba)
 1623  break;
 1624  *found= et_idx;
 1625  if(et_idx < elto_count)
 1626    return(1);
 1627  return(0);
 1628 }
 1629 
 1630 
 1631 int Xorriso_highest_data_block(struct XorrisO *xorriso, uint32_t *high_block,
 1632                                int flag)
 1633 {
 1634  int ret;
 1635  struct FindjoB *job= NULL;
 1636  struct stat dir_stbuf;
 1637 
 1638  *high_block= 0;
 1639  ret= Findjob_new(&job, "/", 0);
 1640  if(ret <= 0) {
 1641    Xorriso_no_findjob(xorriso, "[internal:last_data_file_block]", 0);
 1642    {ret= -1; goto ex;}
 1643  }
 1644  Findjob_set_action_type(job, 58, 0, 0);
 1645  ret= Xorriso_findi(xorriso, job, NULL,  (off_t) 0,
 1646                     NULL, "/", &dir_stbuf, 0, 0);
 1647  if(ret <= 0)
 1648    goto ex;
 1649  Findjob_get_last_data_file_block(job, high_block, 0);
 1650 ex:;
 1651  Findjob_destroy(&job, 0);
 1652  return(ret);
 1653 }
 1654 
 1655 
 1656 /* @param flag bit0= do not record but only count
 1657                bit1= as_mkisofs
 1658                bit2= no sorry messages
 1659 */
 1660 static int Xorriso_scan_report_lines(struct XorrisO *xorriso,
 1661                                      char **et_lines, int et_line_count,
 1662                                      char **sa_lines, int sa_line_count,
 1663                                      char **cmds, int *cmd_count,
 1664                                      char **boot_imgs, int *boot_img_count,
 1665                                      int flag)
 1666 {
 1667  int ret= 0, i, num_count, mkisofs, line_count, idx, et_idx, isohybrid= 0;
 1668  int ptype, gpt_idx, j, pad, mbr_idx;
 1669  int efi_boot_part= 0, full_sparc_part= 0, have_sparc_part= 0, fe_dummy= 1;
 1670  int appended_as_gpt= 0, have_prep= 0, did_sysarea= 0, cared_for_apm= 0;
 1671  int cared_for_sparc= 0, have_hfsplus= 0;
 1672  int have_sysarea= 0, ptable_killer, imported_iso, have_alpha_ldr_path= 0;
 1673  int have_protective_msdos= 0, part_like_isohybrid= 0;
 1674 
 1675 #ifdef Not_any_more_because_padding_is_now_after_partitions
 1676  int appended_partition= 0;
 1677 #endif
 1678 
 1679  int iso_mbr_part_type= -1, iso_gpt_part_idx= -1;
 1680  unsigned int prev_pltf= 0;
 1681  unsigned long int sa_options= 0, partno, id_tag, perms, start_cyl;
 1682  unsigned long int part_status, part_type, mbr_start_block, mbr_num_blocks;
 1683  unsigned long int partition_offset= 0;
 1684  uint32_t high_block= 0, indev_blocks;
 1685  char name[24], *textpt, *contentpt, *buf= NULL, part_type_text[37];
 1686  char **lines= NULL;
 1687  double num[8];
 1688  char *cat_path= "";
 1689  struct elto_img_par *et_imgs= NULL;
 1690  int elto_count= 0;
 1691  uint32_t mbr_parts_end= 0, extract_size;
 1692  struct FindjoB *job= NULL;
 1693  struct stat dir_stbuf;
 1694  IsoImage *image;
 1695  char *volid, *crt, *mdt, *ext, *eft, uuid[17], *uuid_time;
 1696  char **app_pseudo_paths= NULL;
 1697  struct tm tm_erg;
 1698  int was_force_bootable= 0, have_mbr_force_bootable= 0;
 1699  uint64_t gpt_bheader_block= 0, start_block, num_blocks;
 1700  uint64_t img_blocks= 0, iso_part_blocks;
 1701 
 1702  struct mbr_par {
 1703    uint8_t ptype;
 1704    uint64_t start_block;
 1705    uint64_t block_count;
 1706    int appended;
 1707    int has_path;
 1708  };
 1709  struct mbr_par *mbrpts= NULL;
 1710  int mbr_count= 0;
 1711 
 1712  struct gpt_par {
 1713    int ptype; /* 0= unknown, 1= gpt-basdat, 2=gpt-hfsplus, 3=EFI */
 1714    uint8_t type_guid[16];
 1715    int is_gap;
 1716    int has_path;
 1717    char *path;
 1718    uint64_t start_block;
 1719    uint64_t block_count;
 1720  };
 1721  struct gpt_par *gpts= NULL;
 1722  int gpt_count= 0;
 1723 
 1724  struct apm_par {
 1725    int ptype; /* bit0= type Apple_HFS , bit1= name HFSPLUS_Hybrid */
 1726    char *path;
 1727  };
 1728  struct apm_par *apms= NULL; 
 1729  int apm_count= 0;
 1730 
 1731 #define Xorriso_record_cmd_linE { \
 1732      ret= Xorriso_record_cmd_line(xorriso, buf, cmds, cmd_count, flag & 1); \
 1733      buf[0]= 0; \
 1734      if(ret <= 0) \
 1735        goto ex; \
 1736  }
 1737 #define Xorriso_record_boot_imglinE { \
 1738      ret= Xorriso_record_cmd_line(xorriso, buf, boot_imgs, boot_img_count, \
 1739                                   flag & 1); \
 1740      buf[0]= 0; \
 1741      if(ret <= 0) \
 1742        goto ex; \
 1743  }
 1744 
 1745 /* 2 exp 19 blocks = 1 GiB */
 1746 #define Xorriso_max_endless_uefi_sizE (1 << 19)
 1747 
 1748  mkisofs= !!(flag & 2);
 1749  imported_iso= (!mkisofs) << 30;
 1750 
 1751  *cmd_count= 0;
 1752  *boot_img_count= 0;
 1753  line_count= et_line_count + sa_line_count;
 1754  if(line_count <= 0)
 1755    {ret= 1; goto ex;}
 1756 
 1757  Xorriso_alloc_meM(buf, char, 80 + SfileadrL);
 1758  Xorriso_alloc_meM(lines, char *, line_count);
 1759  for(i= 0; i < et_line_count; i++)
 1760    lines[i]= et_lines[i];
 1761  for(i= 0; i < sa_line_count; i++)
 1762    lines[i + et_line_count]= sa_lines[i];
 1763 
 1764  /* Pre-scan to establish context */
 1765  for(i= 0; i < line_count; i++) {
 1766    ret= Xorriso_split_report_line(xorriso, lines[i], 8, name, &contentpt,
 1767                                   num, &num_count, &textpt, 0);
 1768    if(ret <= 0)
 1769      goto ex;
 1770    if(strcmp(name, "System area options:") == 0) {
 1771      sscanf(contentpt, "%lx", &sa_options);
 1772 
 1773    } else if(strcmp(name, "System area summary:") == 0) {
 1774      have_sysarea= 1;
 1775 
 1776    } else if(strcmp(name, "El Torito boot img :") == 0) {
 1777      if(num[0] > elto_count)
 1778        elto_count= num[0];
 1779 
 1780    } else if(strcmp(name, "PReP boot partition:") == 0) {
 1781      have_prep= 1;
 1782 
 1783    } else if(strcmp(name, "MBR partition      :") == 0) {
 1784      if(num[0] > mbr_count)
 1785        mbr_count= num[0];
 1786      if(strcmp(textpt, "0x80  0x00            0            1") == 0)
 1787        have_mbr_force_bootable= 1;
 1788 
 1789    } else if(strcmp(name, "GPT partition name :") == 0) {
 1790      if(num[0] > gpt_count)
 1791        gpt_count= num[0];
 1792 
 1793    } else if(strcmp(name, "APM partition name :") == 0) {
 1794      if(num[0] > apm_count)
 1795        apm_count= num[0];
 1796 
 1797    } else if(strcmp(name, "ISO image size/512 :") == 0) {
 1798      img_blocks= num[0];
 1799 
 1800    } else if(strcmp(name, "Partition offset   :") == 0 &&
 1801       (num[0] == 0 || num[0] == 16)) {
 1802      partition_offset= num[0];
 1803 
 1804    }
 1805  }
 1806 
 1807  ret= Xorriso_highest_data_block(xorriso, &high_block, 0);
 1808  if(ret < 0)
 1809    goto ex;
 1810  if(ret == 0)
 1811    high_block = img_blocks / 4 - 1;
 1812 
 1813  if(elto_count > 0) {
 1814    Xorriso_alloc_meM(et_imgs, struct elto_img_par, elto_count);
 1815    for(et_idx= 0; et_idx < elto_count; et_idx++) {
 1816      et_imgs[et_idx].path= NULL;
 1817      et_imgs[et_idx].ldsiz= -1;
 1818    }
 1819    Xorriso_alloc_meM(app_pseudo_paths, char *, elto_count);
 1820    for(i= 0; i < elto_count; i++)
 1821      app_pseudo_paths[i]= NULL;
 1822    for(i= 0; i < elto_count; i++) {
 1823      Xorriso_alloc_meM(app_pseudo_paths[i], char, 80);
 1824      app_pseudo_paths[i][0]= 0;
 1825    }
 1826  }
 1827  if(mbr_count > 0)
 1828    Xorriso_alloc_meM(mbrpts, struct mbr_par, mbr_count);
 1829  if(gpt_count > 0) {
 1830    Xorriso_alloc_meM(gpts, struct gpt_par, gpt_count);
 1831    for(gpt_idx= 0; gpt_idx < gpt_count; gpt_idx++)
 1832      gpts[gpt_idx].path= NULL;
 1833  }
 1834  if(apm_count > 0) {
 1835    Xorriso_alloc_meM(apms, struct apm_par, apm_count);
 1836    for(i= 0; i < apm_count; i++)
 1837      apms[i].path= NULL;
 1838  }
 1839 
 1840  ptable_killer= (mbr_count > 0) | ((gpt_count > 0) << 1) |
 1841                 ((apm_count > 0) << 2);
 1842 
 1843  /* Report volume id and GRUB2 modification date */;
 1844  ret= Xorriso_get_volume(xorriso, &image, 0);
 1845  if(ret <= 0)
 1846    goto ex;
 1847  if(mkisofs)
 1848    sprintf(buf, "-V ");
 1849  else
 1850    sprintf(buf, "-volid ");
 1851  volid= (char *) un0(iso_image_get_volume_id(image));
 1852  Text_shellsafe(volid, buf, 1);
 1853  Xorriso_record_cmd_linE
 1854  ret= iso_image_get_pvd_times(image, &crt, &mdt, &ext, &eft);
 1855  if(ret == ISO_SUCCESS) {
 1856    uuid_time= crt;
 1857    /* If Creation Time is bad and Modification Time is ok: use the latter */
 1858    ret= Decode_ecma119_format(&tm_erg, crt, 0);
 1859    if(ret <= 0 || strlen(crt) != 16) {
 1860      ret= Decode_ecma119_format(&tm_erg, mdt, 0);
 1861      if(!(ret <= 0 || strlen(mdt) != 16))
 1862        uuid_time= mdt;
 1863    }
 1864    pad= 0;
 1865    for(j= 0; j < 16; j++) {
 1866      if(pad) {
 1867        uuid[j]= '0';
 1868      } else if(uuid_time[j] == 0) {
 1869        pad= 1;
 1870        uuid[j]= '0';
 1871      } else if(uuid_time[j] < '0' || uuid_time[j] > '9') {
 1872        uuid[j]= '0';
 1873      } else {
 1874        uuid[j]= uuid_time[j];
 1875      }
 1876    }
 1877    uuid[16]= 0;
 1878    ret= Decode_ecma119_format(&tm_erg, uuid, 0);
 1879    if(!(ret <= 0 || strlen(uuid) != 16)) {
 1880      if(mkisofs)
 1881        sprintf(buf, "--modification-date=");
 1882      else
 1883        sprintf(buf, "-volume_date uuid ");
 1884      Text_shellsafe(uuid, buf, 1);
 1885      Xorriso_record_cmd_linE
 1886    }
 1887  }
 1888 
 1889  /* First pass: set up objects, record El Torito and info needed in 2nd pass */
 1890  for(i= 0; i < line_count; i++) {
 1891    buf[0]= 0;
 1892    ret= Xorriso_split_report_line(xorriso, lines[i], 8, name, &contentpt,
 1893                                   num, &num_count, &textpt, 0);
 1894    if(ret <= 0)
 1895      goto ex;
 1896 
 1897    if(strcmp(name, "El Torito cat path :") == 0) {
 1898      cat_path= textpt;
 1899 
 1900    } else if(strcmp(name, "El Torito catalog  :") == 0) {
 1901      strcpy(buf, "eltorito_catalog.img/");
 1902      Xorriso_add_offset_size(xorriso, buf, ((off_t) num[0]) * 2048,
 1903                              ((off_t) num[1]) * 2048, 0);
 1904      Xorriso_record_boot_imglinE
 1905 
 1906    } else if(strcmp(name, "El Torito boot img :") == 0) {
 1907      /* Platform Id, bootability, emulation, load segment,
 1908         Hard disk emulation partition type, Load size
 1909      */
 1910      idx= num[0] - 1;
 1911      sscanf(contentpt, "%d %s %s %s %x %x %d %lu",
 1912             &(et_imgs[idx].n), et_imgs[idx].pltf, et_imgs[idx].b,
 1913             et_imgs[idx].emul, &(et_imgs[idx].ld_seg), &(et_imgs[idx].hdpt),
 1914             &(et_imgs[idx].ldsiz), &(et_imgs[idx].lba));
 1915      if(strcmp(et_imgs[idx].pltf, "BIOS") == 0)
 1916        et_imgs[idx].platform_id= 0;
 1917      else if(strcmp(et_imgs[idx].pltf, "PPC") == 0)
 1918        et_imgs[idx].platform_id= 1;
 1919      else if(strcmp(et_imgs[idx].pltf, "Mac") == 0)
 1920        et_imgs[idx].platform_id= 2;
 1921      else if(strcmp(et_imgs[idx].pltf, "UEFI") == 0)
 1922        et_imgs[idx].platform_id= 0xef;
 1923      else
 1924        sscanf(et_imgs[idx].pltf, "%x", &(et_imgs[idx].platform_id));
 1925 
 1926      strcpy(et_imgs[idx].boot_image_type, "any");
 1927      et_imgs[idx].boot_info_table= 0;
 1928      et_imgs[idx].grub2_boot_info= 0;
 1929      et_imgs[idx].path= et_imgs[idx].id_string= et_imgs[idx].sel_crit= "";
 1930      et_imgs[idx].do_gpt_basdat= et_imgs[idx].do_gpt_hfsplus= 0;
 1931      et_imgs[idx].do_apm_hfsplus= 0;
 1932      et_imgs[idx].extract_size= (et_imgs[idx].ldsiz + 3) / 4;
 1933 
 1934    } else if(strcmp(name, "El Torito img path :") == 0) {
 1935      idx= num[0] - 1;
 1936      et_imgs[idx].path= textpt;
 1937      ret= Xorriso_iso_lstat(xorriso, et_imgs[idx].path, &dir_stbuf, 0);
 1938      if(ret == 0) {
 1939        extract_size = (dir_stbuf.st_size + 2047) / 2048;
 1940        if(extract_size > et_imgs[idx].extract_size)
 1941          et_imgs[idx].extract_size= extract_size;
 1942      }
 1943 
 1944    } else if(strcmp(name, "El Torito img blks :") == 0) {
 1945      idx= num[0] - 1;
 1946      if(num[1] > et_imgs[idx].extract_size)
 1947        et_imgs[idx].extract_size= num[1];
 1948 
 1949    } else if(strcmp(name, "El Torito img opts :") == 0) {
 1950      idx= num[0] - 1;
 1951      if(strstr(textpt, "boot-info-table") != NULL)
 1952        et_imgs[idx].boot_info_table= 1;
 1953      if(strstr(textpt, "isohybrid-suitable") != NULL)
 1954        strcpy(et_imgs[idx].boot_image_type, "isolinux");
 1955      if(strstr(textpt, "grub2-boot-info") != NULL) {
 1956        strcpy(et_imgs[idx].boot_image_type, "grub");
 1957        et_imgs[idx].grub2_boot_info= 1;
 1958      }
 1959 
 1960    } else if(strcmp(name, "El Torito id string:") == 0) {
 1961      idx= num[0] - 1;
 1962      et_imgs[idx].id_string= textpt;
 1963 
 1964    } else if(strcmp(name, "El Torito sel crit :") == 0) {
 1965      idx= num[0] - 1;
 1966      et_imgs[idx].sel_crit= textpt;
 1967 
 1968    } else if(strcmp(name, "System area summary:") == 0) {
 1969      if(strstr(textpt, "protective-msdos-label") != NULL)
 1970        have_protective_msdos= 1;
 1971 
 1972    } else if(strcmp(name, "MBR partition      :") == 0) {
 1973      sscanf(contentpt, "%lu 0x%lx 0x%lx %lu %lu",
 1974             &partno, &part_status, &part_type, &mbr_start_block,
 1975             &mbr_num_blocks);
 1976      idx= partno - 1;
 1977      mbrpts[idx].ptype= part_type;
 1978      mbrpts[idx].start_block= mbr_start_block;
 1979      mbrpts[idx].block_count= mbr_num_blocks;
 1980      if(mbr_num_blocks > 0 && mbr_start_block + mbr_num_blocks > mbr_parts_end)
 1981        mbr_parts_end= mbr_start_block + mbr_num_blocks; 
 1982      if(mbr_start_block == partition_offset * 4 &&
 1983         (mbr_start_block + mbr_num_blocks) >= high_block * 4 &&
 1984          iso_mbr_part_type < 0)
 1985        iso_mbr_part_type = part_type;
 1986 
 1987    } else if(strcmp(name, "MBR partition path :") == 0) {
 1988      idx= num[0] - 1;
 1989      mbrpts[idx].has_path= 1;
 1990 
 1991    } else if(strcmp(name, "GPT lba range      :") == 0) {
 1992      gpt_bheader_block= num[2];
 1993 
 1994    } else if(strcmp(name, "GPT type GUID      :") == 0) {
 1995      idx= num[0] - 1;
 1996      if(strcmp(textpt, "a2a0d0ebe5b9334487c068b6b72699c7") == 0)
 1997        gpts[idx].ptype= 1; /* Basic data */
 1998      else if(strcmp(textpt, "005346480000aa11aa1100306543ecac") == 0)
 1999        gpts[idx].ptype= 2; /* HFS+ */
 2000      else if(strcmp(textpt, "28732ac11ff8d211ba4b00a0c93ec93b") == 0)
 2001        gpts[idx].ptype= 3; /* EFI System Partition */
 2002      else
 2003        gpts[idx].ptype= 0;
 2004      Xorriso_parse_guid(xorriso, textpt, gpts[idx].type_guid, 1);
 2005 
 2006    } else if(strcmp(name, "GPT start and size :") == 0) {
 2007      idx= num[0] - 1;
 2008      if(num[2] > 0)
 2009        appended_as_gpt= 1;
 2010      start_block= gpts[idx].start_block= num[1];
 2011      num_blocks= gpts[idx].block_count= num[2];
 2012      if(start_block == partition_offset * 4 &&
 2013         (start_block + num_blocks) >= high_block * 4 &&
 2014         iso_gpt_part_idx < 0)
 2015        iso_gpt_part_idx= idx;
 2016 
 2017    } else if(strcmp(name, "GPT partition path :") == 0) {
 2018      idx= num[0] - 1;
 2019      gpts[idx].has_path= 1;
 2020      gpts[idx].path= textpt;
 2021 
 2022    } else if(strcmp(name, "GPT partition name :") == 0) {
 2023      idx= num[0] - 1;
 2024      if(strstr(contentpt, " 470061007000") != NULL) /* "Gap"... */
 2025        gpts[idx].is_gap= 1;
 2026 
 2027    } else if(strcmp(name, "APM partition name :") == 0) {
 2028      idx= num[0] - 1;
 2029      if(strcmp(textpt, "HFSPLUS_Hybrid") == 0)
 2030        apms[idx].ptype|= 2;
 2031 
 2032    } else if(strcmp(name, "APM partition type :") == 0) {
 2033      idx= num[0] - 1;
 2034      if(strcmp(textpt, "Apple_HFS") == 0)
 2035        apms[idx].ptype|= 1;
 2036 
 2037    } else if(strcmp(name, "APM partition path :") == 0) {
 2038      idx= num[0] - 1;
 2039      apms[idx].path= textpt;
 2040 
 2041    } else if(strcmp(name, "DEC Alpha ldr path :") == 0) {
 2042      have_alpha_ldr_path= 1;
 2043 
 2044    }
 2045  }
 2046 
 2047  if(appended_as_gpt && !have_protective_msdos) {
 2048    if(mbr_count != 1) {
 2049      appended_as_gpt= 0;
 2050    } else if(mbrpts[0].ptype != 0xee || mbrpts[0].start_block != 1) {
 2051      appended_as_gpt= 0;
 2052    } else if(gpt_bheader_block != mbrpts[0].block_count) {
 2053      appended_as_gpt= 0;
 2054    }
 2055  }
 2056 
 2057  iso_part_blocks= img_blocks;
 2058  for(mbr_idx = 0; mbr_idx < mbr_count; mbr_idx++) {
 2059    if(mbrpts[mbr_idx].start_block == partition_offset * 4) {
 2060      iso_part_blocks= mbrpts[mbr_idx].block_count + partition_offset * 4;
 2061  break;
 2062    }
 2063  }
 2064 
 2065  /* Second pass: scan for System Area info */
 2066  for(i= 0; i < line_count; i++) {
 2067    buf[0]= 0;
 2068    ret= Xorriso_split_report_line(xorriso, lines[i], 8, name, &contentpt,
 2069                                   num, &num_count, &textpt, 0);
 2070    if(ret <= 0)
 2071      goto ex;
 2072 
 2073    if(strcmp(name, "System area options:") == 0) {
 2074      if((sa_options & 0x3c00) == 0x0400) {
 2075        if(mkisofs)
 2076          sprintf(buf, "-chrp-boot-part ");
 2077        else
 2078          sprintf(buf, "-boot_image any chrp_boot_part=on ");
 2079      }
 2080 
 2081    } else if(strcmp(name, "System area summary:") == 0) {
 2082      if(strstr(textpt, "isohybrid") != NULL) {
 2083        isohybrid= 1;
 2084        if(mkisofs)
 2085          sprintf(buf, "-isohybrid-mbr ");
 2086        else
 2087          sprintf(buf, "-boot_image isolinux system_area=");
 2088        Xorriso_add_intvl_adr(xorriso, buf, (uint64_t) 0, (uint64_t) 15, "s",
 2089                              imported_iso | ptable_killer);
 2090        Xorriso_record_cmd_linE
 2091        strcpy(buf, "mbr_code_isohybrid.img/");
 2092        Xorriso_add_offset_size(xorriso, buf, (off_t) 0, (off_t) 446, 0);
 2093        Xorriso_record_boot_imglinE
 2094        did_sysarea= 1;
 2095      }
 2096      if(strstr(textpt, "grub2-mbr") != NULL) {
 2097        if(mkisofs)
 2098          sprintf(buf, "--grub2-mbr ");
 2099        else
 2100          sprintf(buf, "-boot_image grub grub2_mbr=");
 2101        Xorriso_add_intvl_adr(xorriso, buf, (uint64_t) 0, (uint64_t) 15, "s",
 2102                              imported_iso | ptable_killer);
 2103        Xorriso_record_cmd_linE
 2104        strcpy(buf, "mbr_code_grub2.img/");
 2105        Xorriso_add_offset_size(xorriso, buf, (off_t) 0, (off_t) 446, 0);
 2106        Xorriso_record_boot_imglinE
 2107        did_sysarea= 1;
 2108      }
 2109      if(strstr(textpt, "protective-msdos-label") != NULL) {
 2110        if(mkisofs)
 2111          sprintf(buf, "--protective-msdos-label");
 2112        else
 2113          sprintf(buf, "-boot_image any partition_table=on");
 2114        Xorriso_record_cmd_linE
 2115      }
 2116      if(strstr(textpt, "cyl-align-off") != NULL) {
 2117        if(mkisofs)
 2118          sprintf(buf, "-partition_cyl_align off");
 2119        else
 2120          sprintf(buf, "-boot_image any partition_cyl_align=off");
 2121      } else if(strstr(textpt, "cyl-align-all") != NULL) {
 2122        if(mkisofs)
 2123          sprintf(buf, "-partition_cyl_align all");
 2124        else
 2125          sprintf(buf, "-boot_image any partition_cyl_align=all");
 2126      } else if(strstr(textpt, "cyl-align-") != NULL) {
 2127        if(mkisofs)
 2128          sprintf(buf, "-partition_cyl_align on");
 2129        else
 2130          sprintf(buf, "-boot_image any partition_cyl_align=on");
 2131      } else
 2132        buf[0]= 0;
 2133 
 2134    } else if(strcmp(name, "Partition offset   :") == 0 &&
 2135       (num[0] == 0 || num[0] == 16)) {
 2136      if(mkisofs)
 2137        sprintf(buf, "-partition_offset %.f", num[0]);
 2138      else
 2139        sprintf(buf, "-boot_image any partition_offset=%.f", num[0]);
 2140 
 2141    } else if(strcmp(name, "MBR heads per cyl  :") == 0 &&
 2142       (num[0] > 0 && num[0] <= 255)) {
 2143      if(mkisofs)
 2144        sprintf(buf, "-partition_hd_cyl %.f", num[0]);
 2145      else
 2146        sprintf(buf, "-boot_image any partition_hd_cyl=%.f", num[0]);
 2147 
 2148    } else if(strcmp(name, "MBR secs per head  :") == 0 &&
 2149       (num[0] > 0 && num[0] <= 63)) {
 2150      if(mkisofs)
 2151        sprintf(buf, "-partition_sec_hd %.f", num[0]);
 2152      else
 2153        sprintf(buf, "-boot_image any partition_sec_hd=%.f", num[0]);
 2154 
 2155    } else if(strcmp(name, "MBR partition      :") == 0) {
 2156      sscanf(contentpt, "%lu 0x%lx 0x%lx %lu %lu",
 2157             &partno, &part_status, &part_type, &mbr_start_block,
 2158             &mbr_num_blocks);
 2159      if(mbr_num_blocks > 0 && part_type != 0x00 && part_type != 0xee &&
 2160         (iso_part_blocks <= mbr_start_block ||
 2161          (have_protective_msdos && img_blocks == mbr_parts_end &&
 2162           partno > 1))) {
 2163        if(!appended_as_gpt) {
 2164          sprintf(buf, "-append_partition %lu 0x%lx ", partno, part_type);
 2165          Xorriso_add_intvl_adr(xorriso, buf, (uint64_t) mbr_start_block,
 2166                              ((uint64_t) mbr_start_block) + mbr_num_blocks - 1,
 2167                                "d", imported_iso);
 2168          Xorriso_record_cmd_linE
 2169          if(partno >= 1 && (int) partno <= mbr_count)
 2170            mbrpts[partno - 1].appended= 1;
 2171 
 2172 #ifdef Not_any_more_because_padding_is_now_after_partitions
 2173          appended_partition= 1;
 2174 #endif
 2175 
 2176        }
 2177        if(part_type == 0xef) {
 2178          sprintf(buf, "mbr_part%lu_efi.img/", partno);
 2179          Xorriso_add_offset_size(xorriso, buf, ((off_t) mbr_start_block) * 512,
 2180                                  ((off_t) mbr_num_blocks) * 512, 0);
 2181          Xorriso_record_boot_imglinE
 2182        }
 2183      } else if(part_type == 0x41 && have_prep) {
 2184        if(mkisofs) {
 2185          sprintf(buf, "-prep-boot-part ");
 2186        } else {
 2187          sprintf(buf, "-boot_image any prep_boot_part=");
 2188        }
 2189        Xorriso_add_intvl_adr(xorriso, buf, (uint64_t) mbr_start_block,
 2190                              ((uint64_t) mbr_start_block) + mbr_num_blocks - 1,
 2191                              "d", imported_iso);
 2192        Xorriso_record_cmd_linE
 2193        sprintf(buf, "mbr_part%lu_prep.img/", partno);
 2194        Xorriso_add_offset_size(xorriso, buf, ((off_t) mbr_start_block) * 512,
 2195                                ((off_t) mbr_num_blocks) * 512, 0);
 2196        Xorriso_record_boot_imglinE
 2197      } else if(part_type == 0xef) {
 2198        sprintf(buf, "mbr_part%lu_efi.img/", partno);
 2199        Xorriso_add_offset_size(xorriso, buf, ((off_t) mbr_start_block) * 512,
 2200                                ((off_t) mbr_num_blocks) * 512, 0);
 2201        Xorriso_record_boot_imglinE
 2202      }
 2203      if((part_status & 0x80) && !was_force_bootable) {
 2204        was_force_bootable= 1;
 2205        if(buf[0]) {
 2206          Xorriso_record_cmd_linE
 2207        }
 2208        if(mkisofs)
 2209          sprintf(buf, "--mbr-force-bootable");
 2210        else
 2211          sprintf(buf, "-boot_image any mbr_force_bootable=on");
 2212      }
 2213    } else if(strcmp(name, "MBR partition path :") == 0) {
 2214      idx= num[0] - 1;
 2215      if(mbrpts[idx].ptype == 0x41) {
 2216        sprintf(xorriso->info_text,
 2217                "Cannot make proposal to mark PReP partition by data file: ");
 2218        Text_shellsafe(textpt, xorriso->info_text, 1);
 2219        if(!(flag & 5))
 2220          Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "SORRY", 0);
 2221  continue;
 2222      }
 2223      ptype= 0;
 2224      if(mbrpts[idx].ptype == 0xef)
 2225        ptype= 3;
 2226      ret= Xorriso_search_eltorito_path(xorriso, et_imgs, elto_count,
 2227                                        textpt, ptype,
 2228                                        &et_idx, &efi_boot_part, !!isohybrid);
 2229      if(ret <= 0) {
 2230        sprintf(xorriso->info_text,
 2231                "Cannot make proposal to mark data file as MBR partition without being an El Torito boot image : ");
 2232        Text_shellsafe(textpt, xorriso->info_text, 1);
 2233        if(!(flag & 5))
 2234          Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "SORRY", 0);
 2235      } else {
 2236        for(gpt_idx= 0; gpt_idx < gpt_count; gpt_idx++) {
 2237          if(gpts[gpt_idx].path != NULL)
 2238            if(strcmp(gpts[gpt_idx].path, textpt) == 0)
 2239        break;
 2240        }
 2241        if(gpt_idx >= gpt_count) {
 2242          sprintf(xorriso->info_text,
 2243                  "Cannot make proposal to mark data file as MBR partition without being in GPT : ");
 2244          Text_shellsafe(textpt, xorriso->info_text, 1);
 2245          if(!(flag & 5))
 2246            Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "SORRY", 0);
 2247        }
 2248      } 
 2249 
 2250    } else if(strcmp(name, "GPT disk GUID      :") == 0) {
 2251 
 2252      /* >>> ??? need command to set disk GUID */;
 2253 
 2254    } else if(strcmp(name, "GPT partition name :") == 0) {
 2255 
 2256      /* >>> ??? need command to set partition name for partition number */;
 2257 
 2258    } else if(strcmp(name, "GPT partition GUID :") == 0) {
 2259 
 2260      /* >>> ??? need command to set partition GUID for partition number */;
 2261 
 2262    } else if(strcmp(name, "GPT partition flags:") == 0) {
 2263 
 2264      /* >>> check whether 0x1000000000000001 . Else: complain */;
 2265 
 2266    } else if(strcmp(name, "GPT partition path :") == 0) {
 2267      idx= num[0] - 1;
 2268      ret= Xorriso_search_eltorito_path(xorriso, et_imgs, elto_count,
 2269                                        textpt, gpts[idx].ptype,
 2270                                        &et_idx, &efi_boot_part, !!isohybrid);
 2271      if(ret <= 0) {
 2272        sprintf(xorriso->info_text,
 2273                "Cannot make proposal to mark data file as GPT partition : ");
 2274        Text_shellsafe(textpt, xorriso->info_text, 1);
 2275        if(!(flag & 5))
 2276          Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "SORRY", 0);
 2277      }
 2278 
 2279    } else if(strcmp(name, "GPT start and size :") == 0) {
 2280      idx= num[0] - 1;
 2281      if(gpts[idx].ptype == 3)
 2282        part_type= 0xef;
 2283      else
 2284        part_type= 0xcd;
 2285 
 2286      if(high_block * 4 < num[1] && num[2] > 0 && !gpts[idx].is_gap) {
 2287        for(mbr_idx = 0; mbr_idx < mbr_count; mbr_idx++) {
 2288          if(mbrpts[mbr_idx].start_block == num[1]) {
 2289            if(mbrpts[mbr_idx].block_count != num[2] && !(flag & 1)) {
 2290              sprintf(xorriso->info_text,
 2291                      "GPT partition %d has same start block as MBR partition %d but different block count (%.f <> %.f)",
 2292                      idx + 1, mbr_idx + 1, num[2],
 2293                      (double) mbrpts[mbr_idx].block_count);
 2294              Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "WARNING",
 2295                                  0);
 2296            }
 2297        break;
 2298          }
 2299        }
 2300        if(mbr_idx >= mbr_count) {
 2301          if(appended_as_gpt == 1) {
 2302            appended_as_gpt= 2;
 2303            Xorriso__format_guid(gpts[idx].type_guid, part_type_text, 0);
 2304          } else {
 2305            sprintf(part_type_text, "0x%lx", part_type);
 2306          }
 2307          sprintf(buf, "-append_partition %d %s ", idx + 1, part_type_text);
 2308          Xorriso_add_intvl_adr(xorriso, buf, (uint64_t) num[1],
 2309                                (uint64_t) (num[1] + num[2] - 1.0), "d",
 2310                                imported_iso);
 2311          Xorriso_record_cmd_linE
 2312 
 2313 #ifdef Not_any_more_because_padding_is_now_after_partitions
 2314          appended_partition= 1;
 2315 #endif
 2316 
 2317        }
 2318 
 2319        /* Check for isohybri-ish MBR and GPT mix */
 2320        if((mbr_count == 1 || (mbr_count == 2 && have_mbr_force_bootable)) &&
 2321           mbrpts[0].ptype == 0xee && have_protective_msdos) {
 2322          /* real GPT (+/- mbr_force_bootable) is not -part_like_isohybrid */
 2323          ret= 0;
 2324        } else {
 2325          ret= Xorriso_search_eltorito_lba(xorriso, et_imgs, elto_count,
 2326                                           (unsigned int) (num[1] / 4.0),
 2327                                           &et_idx, 0);
 2328        }
 2329        if(ret > 0) {
 2330          if(!(et_imgs[et_idx].do_gpt_basdat ||
 2331               et_imgs[et_idx].do_gpt_hfsplus ||
 2332               part_like_isohybrid)) {
 2333            if(mkisofs)
 2334              sprintf(buf, "-part_like_isohybrid");
 2335            else
 2336              sprintf(buf, "-boot_image any part_like_isohybrid=on");
 2337            Xorriso_record_cmd_linE
 2338            part_like_isohybrid= 1;
 2339            appended_as_gpt= 0;
 2340          }
 2341          /*  mark el torito for  -isohybrid-gpt-... */
 2342          Xorriso_register_eltorito_gpt(xorriso, et_imgs + et_idx,
 2343                                        gpts[idx].ptype, &efi_boot_part,
 2344                                        &fe_dummy, 1);
 2345        }
 2346 
 2347      } else if(gpts[idx].ptype == 3 && gpts[idx].has_path == 0 &&
 2348                img_blocks >= num[1] + num[2] && !efi_boot_part) {
 2349        if(mkisofs)
 2350          sprintf(buf, "-efi-boot-part ");
 2351        else
 2352          sprintf(buf, "-boot_image any efi_boot_part=");
 2353        Xorriso_add_intvl_adr(xorriso, buf, (uint64_t) num[1],
 2354                              (uint64_t) (num[1] + num[2] - 1.0), "d",
 2355                              imported_iso);
 2356        efi_boot_part= 2;
 2357        Xorriso_record_cmd_linE
 2358      }
 2359 
 2360      if(gpts[idx].ptype == 2 &&
 2361         (img_blocks / 2 > num[2] || num[1] >= img_blocks)) {
 2362        /* Obviously not a HFS+ tree covering the ISO */
 2363        sprintf(buf, "gpt_part%d_hfsplus.img/", idx + 1);
 2364        Xorriso_add_offset_size(xorriso, buf, ((off_t) num[1]) * 512,
 2365                                ((off_t) num[2]) * 512, 0);
 2366        Xorriso_record_boot_imglinE
 2367      } else if(gpts[idx].ptype == 3) {
 2368        sprintf(buf, "gpt_part%d_efi.img/", idx + 1);
 2369        Xorriso_add_offset_size(xorriso, buf, ((off_t) num[1]) * 512,
 2370                                ((off_t) num[2]) * 512, 0);
 2371        Xorriso_record_boot_imglinE
 2372      }
 2373 
 2374    } else if(strcmp(name, "APM block size     :") == 0) {
 2375      if(mkisofs)
 2376        sprintf(buf, "-apm-block-size %.f", num[0]);
 2377      else
 2378        sprintf(buf, "-boot_image any apm_block_size=%.f", num[0]);
 2379 
 2380    } else if(strcmp(name, "APM partition name :") == 0) {
 2381 
 2382      /* >>> ??? need command to set APM partition name for partition number */;
 2383 
 2384    } else if(strcmp(name, "APM partition path :") == 0) {
 2385      idx= num[0] - 1;
 2386      /* Check El Torito EFI boot images for same path */
 2387      for(et_idx= 0; isohybrid && et_idx < elto_count; et_idx++)
 2388        if(strcmp(et_imgs[et_idx].path, textpt) == 0) {
 2389          if(apms[idx].ptype == 1) {
 2390            et_imgs[et_idx].do_apm_hfsplus= 1;
 2391            cared_for_apm= 1;
 2392          }
 2393      break;
 2394        }
 2395 
 2396    } else if(strcmp(name, "APM start and size :") == 0) {
 2397      idx= num[0] - 1;
 2398 
 2399      if(num[1] + num[2] <= img_blocks && apms[idx].ptype == 3 &&
 2400         apms[idx].path == NULL && !have_hfsplus) {
 2401        
 2402        /* >>> HFS+ magic number */;
 2403        /* >>> Read byte 1024 and 1025 after partition start
 2404               Must be {'H', '+'}  (0x482b big endian)
 2405        */;
 2406        /* ??? >>> Do this recognition in libisofs ? */
 2407 
 2408        if(mkisofs)
 2409          sprintf(buf, "-hfsplus");
 2410        else
 2411          sprintf(buf, "-hfsplus on");
 2412        Xorriso_record_cmd_linE
 2413 
 2414        /* Report commands for blessings and creator-type */
 2415        ret= Findjob_new(&job, "/", 0);
 2416        if(ret <= 0) {
 2417          Xorriso_no_findjob(xorriso, "xorriso", 0);
 2418          {ret= -1; goto ex;}
 2419        }
 2420        Findjob_set_action_target(job, 53, NULL, 0);
 2421        xorriso->show_hfs_cmd_count= *cmd_count;
 2422        xorriso->show_hfs_cmds= cmds;
 2423        xorriso->show_hfs_cmd_flag= (flag & 1) | ((!!mkisofs) << 1);
 2424        ret= Xorriso_findi(xorriso, job, NULL, (off_t) 0, NULL, "/",
 2425                           &dir_stbuf, 0, 0);
 2426        *cmd_count= xorriso->show_hfs_cmd_count;
 2427        if(ret <= 0)
 2428          goto ex;
 2429        have_hfsplus= 1;
 2430        cared_for_apm= 1;
 2431      }
 2432 
 2433    } else if(strcmp(name, "MIPS-BE boot path  :") == 0) {
 2434      if(mkisofs)
 2435        sprintf(buf, "-mips-boot ");
 2436      else
 2437        sprintf(buf, "-boot_image any mips_path=");
 2438      Text_shellsafe(textpt, buf, 1);
 2439 
 2440    } else if(strcmp(name, "MIPS-LE boot path  :") == 0) {
 2441      if(mkisofs)
 2442        sprintf(buf, "-mipsel-boot ");
 2443      else
 2444        sprintf(buf, "-boot_image any mipsel_path=");
 2445      Text_shellsafe(textpt, buf, 1);
 2446 
 2447    } else if(strcmp(name, "SUN SPARC disklabel:") == 0) {
 2448      if(mkisofs)
 2449        sprintf(buf, "-sparc-label ");
 2450      else
 2451        sprintf(buf, "-boot_image any sparc_label=");
 2452      Text_shellsafe(textpt, buf, 1);
 2453 
 2454    } else if(strcmp(name, "SPARC GRUB2 path   :") == 0) {
 2455      if(mkisofs) {
 2456        sprintf(buf, "-B ,");
 2457        Xorriso_record_cmd_linE
 2458        sprintf(buf, "--grub2-sparc-core ");
 2459      } else
 2460        sprintf(buf, "-boot_image grub grub2_sparc_core=");
 2461      Text_shellsafe(textpt, buf, 1);
 2462      cared_for_sparc= 1;
 2463 
 2464    } else if(strcmp(name, "SUN SPARC partition:") == 0) {
 2465      have_sparc_part= 1;
 2466      partno= id_tag= perms= num_blocks= 0;
 2467      start_cyl= 0xffffffff;
 2468      sscanf(contentpt, "%lu 0x%lx 0x%lx %lu %lu",
 2469             &partno, &id_tag, &perms, &start_cyl, &mbr_num_blocks);
 2470      if(partno > 0 && partno < 9 && start_cyl == 0 && 
 2471         mbr_num_blocks >= img_blocks - 600 && mbr_num_blocks <= img_blocks &&
 2472         ((partno == 1 && id_tag == 4) || (partno > 1 && id_tag == 2)))
 2473        full_sparc_part|= (1 << (partno - 1));
 2474 
 2475    } else if(strcmp(name, "PALO header version:") == 0) {
 2476      if(mkisofs)
 2477        sprintf(buf, "-hppa-hdrversion %.f", num[0]);
 2478      else
 2479        sprintf(buf, "-boot_image any hppa_hdrversion=%.f", num[0]);
 2480 
 2481    } else if(strcmp(name, "HP-PA cmdline      :") == 0) {
 2482      if(mkisofs)
 2483        sprintf(buf, "-hppa-cmdline ");
 2484      else
 2485        sprintf(buf, "-boot_image any hppa_cmdline=");
 2486      Text_shellsafe(textpt, buf, 1);
 2487 
 2488    } else if(strcmp(name, "HP-PA 32-bit kernel:") == 0) {
 2489      if(mkisofs)
 2490        sprintf(buf, "-hppa-kernel-32 ");
 2491      else
 2492        sprintf(buf, "-boot_image any hppa_kernel_32=");
 2493      Text_shellsafe(textpt, buf, 1);
 2494 
 2495    } else if(strcmp(name, "HP-PA 64-bit kernel:") == 0) {
 2496      if(mkisofs)
 2497        sprintf(buf, "-hppa-kernel-64 ");
 2498      else
 2499        sprintf(buf, "-boot_image any hppa_kernel_64=");
 2500      Text_shellsafe(textpt, buf, 1);
 2501 
 2502    } else if(strcmp(name, "HP-PA ramdisk      :") == 0) {
 2503      if(mkisofs)
 2504        sprintf(buf, "-hppa-ramdisk ");
 2505      else
 2506        sprintf(buf, "-boot_image any hppa_ramdisk=");
 2507      Text_shellsafe(textpt, buf, 1);
 2508 
 2509    } else if(strcmp(name, "HP-PA bootloader   :") == 0) {
 2510      if(mkisofs)
 2511        sprintf(buf, "-hppa-bootloader ");
 2512      else
 2513        sprintf(buf, "-boot_image any hppa_bootloader=");
 2514      Text_shellsafe(textpt, buf, 1);
 2515 
 2516    } else if(strcmp(name, "DEC Alpha ldr adr  :") == 0) {
 2517      if(!have_alpha_ldr_path) {
 2518        sprintf(xorriso->info_text,
 2519                "Cannot enable DEC Alpha boot loader because it is not a data file in the ISO filesystem");
 2520        if(!(flag & 5))
 2521          Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "SORRY", 0);
 2522      }
 2523 
 2524    } else if(strcmp(name, "DEC Alpha ldr path :") == 0) {
 2525      if(mkisofs)
 2526        sprintf(buf, "-alpha-boot ");
 2527      else
 2528        sprintf(buf, "-boot_image any alpha_boot=");
 2529      Text_shellsafe(textpt, buf, 1);
 2530 
 2531    }
 2532    
 2533    if(buf[0])
 2534      Xorriso_record_cmd_linE
 2535  }
 2536 
 2537  if(appended_as_gpt == 2) {
 2538    if(mkisofs)
 2539      sprintf(buf, "-appended_part_as_gpt");
 2540    else
 2541      sprintf(buf, "-boot_image any appended_part_as=gpt");
 2542    Xorriso_record_cmd_linE
 2543  }
 2544 
 2545  if(have_sparc_part) {
 2546    if(full_sparc_part == 255) {
 2547      if(mkisofs) {
 2548        sprintf(buf, "-G ");
 2549        Xorriso_add_intvl_adr(xorriso, buf, (uint64_t) 0, (uint64_t) 15, "s",
 2550                              imported_iso);
 2551        Xorriso_record_cmd_linE
 2552        did_sysarea= 1;
 2553        sprintf(buf, "-B ...");
 2554        Xorriso_record_cmd_linE
 2555      } else {
 2556        sprintf(buf, "-boot_image any system_area=");
 2557        Xorriso_add_intvl_adr(xorriso, buf, (uint64_t) 0, (uint64_t) 15, "s",
 2558                              imported_iso);
 2559        Xorriso_record_cmd_linE
 2560        did_sysarea= 1;
 2561        for(i= 2; i <= 8; i++) {
 2562          sprintf(buf, "-append_partition %d 0x00 .", i);
 2563          Xorriso_record_cmd_linE
 2564        }
 2565      }
 2566      cared_for_sparc= 1;
 2567    } else if(!cared_for_sparc) {
 2568      sprintf(xorriso->info_text,
 2569        "Cannot enable SUN Disk Label because of non-trivial partition layout");
 2570      if(!(flag & 5))
 2571        Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "SORRY", 0);
 2572    }
 2573  }
 2574  if(have_sysarea && !did_sysarea) {
 2575    /* Zeroize old partition tables from -indev */
 2576    if(mkisofs)
 2577      sprintf(buf, "-G ");
 2578    else
 2579      sprintf(buf, "-boot_image any system_area=");
 2580    Xorriso_add_intvl_adr(xorriso, buf, (uint64_t) 0, (uint64_t) 15, "s",
 2581                          imported_iso | ptable_killer);
 2582    Xorriso_record_cmd_linE
 2583    did_sysarea= 1;
 2584  }
 2585  if(have_sysarea) {
 2586    strcpy(buf, "systemarea.img/");
 2587    Xorriso_add_offset_size(xorriso, buf, (off_t) 0, (off_t) 16 * 2048, 0);
 2588    Xorriso_record_boot_imglinE
 2589  }
 2590  if(iso_mbr_part_type >= 0) {
 2591    if(mkisofs)
 2592      sprintf(buf, "-iso_mbr_part_type 0x%2.2x",
 2593                   (unsigned int) iso_mbr_part_type);
 2594    else
 2595      sprintf(buf, "-boot_image any iso_mbr_part_type=0x%2.2x",
 2596                   (unsigned int) iso_mbr_part_type);
 2597    Xorriso_record_cmd_linE
 2598 
 2599  } else if(iso_gpt_part_idx >= 0) {
 2600    if(mkisofs)
 2601      sprintf(buf, "-iso_mbr_part_type ");
 2602    else
 2603      sprintf(buf, "-boot_image any iso_mbr_part_type=");
 2604    Xorriso__format_guid(gpts[iso_gpt_part_idx].type_guid, buf + strlen(buf),
 2605                         0);
 2606    Xorriso_record_cmd_linE
 2607    
 2608  }
 2609 
 2610  /* Issue commands related to El Torito */
 2611  if(elto_count <= 0)
 2612    goto after_el_torito;
 2613 
 2614  if(efi_boot_part == 1) {
 2615    if(mkisofs)
 2616      sprintf(buf, "-efi-boot-part --efi-boot-image");
 2617    else
 2618      sprintf(buf, "-boot_image any efi_boot_part=--efi-boot-image");
 2619    Xorriso_record_cmd_linE
 2620  }
 2621  if(cat_path[0]) {
 2622    if(mkisofs)
 2623      sprintf(buf, "-c ");
 2624    else
 2625      sprintf(buf, "-boot_image any cat_path=");
 2626    Text_shellsafe(cat_path, buf, 1);
 2627  } else {
 2628    if(mkisofs)
 2629      sprintf(buf, "--boot-catalog-hide");
 2630    else
 2631      sprintf(buf, "-boot_image any cat_hidden=on");
 2632  }
 2633  Xorriso_record_cmd_linE
 2634  for(idx= 0; idx < elto_count; idx++) {
 2635    if(strcmp(et_imgs[idx].pltf, "UEFI") == 0 &&
 2636       et_imgs[idx].extract_size <= 0) {
 2637      ret= Xorriso_obtain_indev_readsize(xorriso, &indev_blocks, 0);
 2638      if(ret > 0) {
 2639        if(indev_blocks > et_imgs[idx].lba &&
 2640           indev_blocks - et_imgs[idx].lba <= Xorriso_max_endless_uefi_sizE)
 2641          et_imgs[idx].extract_size= indev_blocks - et_imgs[idx].lba;
 2642      }
 2643      if(et_imgs[idx].extract_size <= 0)
 2644  continue;
 2645    }
 2646    sprintf(buf, "eltorito_img%d_", idx + 1);
 2647    for(j= 0; j < 4 && et_imgs[idx].pltf[j] != 0; j++) {
 2648      buf[strlen(buf) + 1]= 0;
 2649      buf[strlen(buf)]= tolower(et_imgs[idx].pltf[j]);
 2650    }
 2651    strcat(buf, ".img/");
 2652    Xorriso_add_offset_size(xorriso, buf, ((off_t) et_imgs[idx].lba) * 2048,
 2653                            ((off_t) et_imgs[idx].extract_size) * 2048, 0);
 2654    Xorriso_record_boot_imglinE
 2655 
 2656    if(et_imgs[idx].ld_seg != 0 && et_imgs[idx].ld_seg != 0x07c0) {
 2657      if(!(flag & 5)) {
 2658        sprintf(xorriso->info_text,
 2659               "Cannot enable EL Torito boot image #%d because its Load Segment is neither 0x0 nor 0x7c0",
 2660               idx + 1);
 2661        Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "SORRY", 0);
 2662      }
 2663  continue;
 2664    }
 2665    if(idx > 0) {
 2666      if(mkisofs)
 2667        sprintf(buf, "-eltorito-alt-boot");
 2668      else
 2669        sprintf(buf, "-boot_image any next");
 2670      Xorriso_record_cmd_linE
 2671    }
 2672    if(et_imgs[idx].path[0] == 0) {
 2673      /* Check whether appended partition */;
 2674      for(i= 0; i < mbr_count; i++)
 2675        if((mbrpts[i].appended || !mbrpts[i].has_path) &&
 2676           mbrpts[i].start_block == ((uint64_t) et_imgs[idx].lba) * 4 &&
 2677           (mbrpts[i].block_count == (uint64_t) et_imgs[idx].ldsiz ||
 2678            et_imgs[idx].ldsiz == 0 || et_imgs[idx].ldsiz == 1)) 
 2679      break;
 2680      if (i < mbr_count) {
 2681        if(!mbrpts[i].appended) {
 2682          mbrpts[i].appended= 1;
 2683          if(!appended_as_gpt) {
 2684            sprintf(buf, "-append_partition %lu 0x%lx ", (unsigned long) i + 1,
 2685                          (unsigned long) mbrpts[i].ptype);
 2686            Xorriso_add_intvl_adr(xorriso, buf,
 2687                                  (uint64_t) mbrpts[i].start_block,
 2688                                  ((uint64_t) mbrpts[i].start_block) +
 2689                                  mbrpts[i].block_count - 1,
 2690                                  "d", imported_iso);
 2691            Xorriso_record_cmd_linE
 2692 
 2693 #ifdef Not_any_more_because_padding_is_now_after_partitions
 2694            appended_partition= 1;
 2695 #endif
 2696 
 2697            buf[0]= 0;
 2698          }
 2699        }
 2700        sprintf(app_pseudo_paths[idx],
 2701                "--interval:appended_partition_%d_start_%lus_size_%lud:all::",
 2702                i + 1,
 2703                (unsigned long) et_imgs[idx].lba,
 2704                (unsigned long) mbrpts[i].block_count);
 2705        et_imgs[idx].path= app_pseudo_paths[idx];
 2706      }
 2707      if (et_imgs[idx].path[0] == 0 && efi_boot_part != 2) {
 2708        for(i= 0; i < gpt_count; i++) {
 2709          if(have_protective_msdos && (
 2710             gpts[i].start_block == ((uint64_t) et_imgs[idx].lba) * 4 &&
 2711             (gpts[i].block_count == (uint64_t) et_imgs[idx].ldsiz ||
 2712             et_imgs[idx].ldsiz == 0 || et_imgs[idx].ldsiz == 1)))
 2713        break;
 2714        }
 2715        if (i < gpt_count) {
 2716          sprintf(app_pseudo_paths[idx],
 2717                  "--interval:appended_partition_%d_start_%lus_size_%lud:all::",
 2718                  i + 1,
 2719                  (unsigned long) et_imgs[idx].lba,
 2720                  (unsigned long) gpts[i].block_count);
 2721          et_imgs[idx].path= app_pseudo_paths[idx];
 2722        }
 2723      }
 2724 
 2725      if (et_imgs[idx].path[0] == 0) {
 2726 
 2727        /* >>> need way to exploit .extract_size by cutting out from ISO */;
 2728 
 2729      }
 2730 
 2731      if (et_imgs[idx].path[0] == 0) {
 2732        if(!(flag & 5)) {
 2733          sprintf(xorriso->info_text,
 2734               "Cannot enable EL Torito boot image #%d because it is not a data file in the ISO filesystem",
 2735               idx + 1);
 2736          Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "SORRY", 0);
 2737        }
 2738        buf[0]= 0;
 2739  continue;
 2740      }
 2741    }
 2742    if(et_imgs[idx].platform_id != 0xef) {
 2743      if(mkisofs) {
 2744        if(prev_pltf != et_imgs[idx].platform_id) {
 2745          sprintf(buf, "-eltorito-platform 0x%2.2x", et_imgs[idx].platform_id);
 2746          Xorriso_record_cmd_linE
 2747        }
 2748        prev_pltf= et_imgs[idx].platform_id;
 2749        sprintf(buf, "-b ");
 2750      } else {
 2751        sprintf(buf, "-boot_image %s bin_path=", et_imgs[idx].boot_image_type);
 2752      }
 2753    } else {
 2754      if(mkisofs)
 2755        sprintf(buf, "-e ");
 2756      else
 2757        sprintf(buf, "-boot_image %s efi_path=", et_imgs[idx].boot_image_type);
 2758    }
 2759    Text_shellsafe(et_imgs[idx].path, buf, 1);
 2760    Xorriso_record_cmd_linE
 2761    if(!mkisofs) {
 2762      sprintf(buf, "-boot_image any platform_id=0x%2.2x",
 2763                   et_imgs[idx].platform_id);
 2764      Xorriso_record_cmd_linE
 2765    }
 2766    if(strcmp(et_imgs[idx].emul, "none") == 0) {
 2767      if(mkisofs)
 2768        sprintf(buf, "-no-emul-boot");
 2769      else
 2770        sprintf(buf, "-boot_image any emul_type=no_emulation");
 2771    } else if(strcmp(et_imgs[idx].emul, "hd") == 0) {
 2772      if(mkisofs)
 2773        sprintf(buf, "-hard-disk-boot");
 2774      else
 2775        sprintf(buf, "-boot_image any emul_type=hard_disk");
 2776    } else {
 2777      if(mkisofs)
 2778        buf[0]= 0;
 2779      else
 2780        sprintf(buf, "-boot_image any emul_type=diskette");
 2781    }
 2782    if(buf[0])
 2783      Xorriso_record_cmd_linE
 2784    if(et_imgs[idx].ldsiz >= 0) {
 2785      if(mkisofs)
 2786        sprintf(buf, "-boot-load-size %d", et_imgs[idx].ldsiz);
 2787      else
 2788        sprintf(buf, "-boot_image any load_size=%d", et_imgs[idx].ldsiz * 512);
 2789      Xorriso_record_cmd_linE
 2790    }
 2791    if(et_imgs[idx].boot_info_table) {
 2792      if(mkisofs)
 2793        sprintf(buf, "-boot-info-table");
 2794      else
 2795        sprintf(buf, "-boot_image any boot_info_table=on");
 2796      Xorriso_record_cmd_linE
 2797    }
 2798    if(et_imgs[idx].grub2_boot_info) {
 2799      if(mkisofs)
 2800        sprintf(buf, "--grub2-boot-info");
 2801      else
 2802        sprintf(buf, "-boot_image grub grub2_boot_info=on");
 2803      Xorriso_record_cmd_linE
 2804    }
 2805    if(et_imgs[idx].id_string[0] != 0) {
 2806      if(mkisofs)
 2807        sprintf(buf, "-eltorito-id ");
 2808      else
 2809        sprintf(buf, "-boot_image any id_string=");
 2810      Text_shellsafe(et_imgs[idx].id_string, buf, 1);
 2811      Xorriso_record_cmd_linE
 2812    }
 2813    if(et_imgs[idx].sel_crit[0] != 0) {
 2814      if(mkisofs)
 2815        sprintf(buf, "-eltorito-selcrit ");
 2816      else
 2817        sprintf(buf, "-boot_image any sel_crit=");
 2818      Text_shellsafe(et_imgs[idx].sel_crit, buf, 1);
 2819      Xorriso_record_cmd_linE
 2820    }
 2821    if(et_imgs[idx].do_gpt_basdat) {
 2822      if(mkisofs)
 2823        sprintf(buf, "-isohybrid-gpt-basdat");
 2824      else
 2825        sprintf(buf, "-boot_image isolinux partition_entry=gpt_basdat");
 2826      Xorriso_record_cmd_linE
 2827    }
 2828    if(et_imgs[idx].do_gpt_hfsplus) {
 2829      if(mkisofs)
 2830        sprintf(buf, "-isohybrid-gpt-hfsplus");
 2831      else
 2832        sprintf(buf, "-boot_image isolinux partition_entry=gpt_hfsplus");
 2833      Xorriso_record_cmd_linE
 2834    }
 2835    if(et_imgs[idx].do_apm_hfsplus) {
 2836      if(mkisofs)
 2837        sprintf(buf, "-isohybrid-apm-hfsplus");
 2838      else
 2839        sprintf(buf, "-boot_image isolinux partition_entry=apm_hfsplus");
 2840      Xorriso_record_cmd_linE
 2841    }
 2842  }
 2843 after_el_torito:
 2844 
 2845  if((apm_count > 0 && !cared_for_apm) && !(flag & 5)) {
 2846    sprintf(xorriso->info_text,
 2847            "Cannot make proposal to produce APM of loaded image");
 2848    Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "SORRY", 0);
 2849  }
 2850 
 2851 #ifdef Not_any_more_because_padding_is_now_after_partitions
 2852 
 2853  if(appended_partition) {
 2854    if(mkisofs)
 2855      sprintf(buf, "-no-pad");
 2856    else
 2857      sprintf(buf, "-padding 0");
 2858    Xorriso_record_cmd_linE
 2859  }
 2860 
 2861 #endif /* Not_any_more_because_padding_is_now_after_partitions */
 2862 
 2863  ret= 1;
 2864 ex:
 2865  xorriso->show_hfs_cmds= NULL;
 2866  Findjob_destroy(&job, 0);
 2867  Xorriso_free_meM(apms);
 2868  Xorriso_free_meM(gpts);
 2869  Xorriso_free_meM(mbrpts);
 2870  if(app_pseudo_paths != NULL) {
 2871    for(i= 0; i < elto_count; i++)
 2872      if(app_pseudo_paths[i] != NULL)
 2873        Xorriso_free_meM(app_pseudo_paths[i]);
 2874    Xorriso_free_meM(app_pseudo_paths);
 2875  }
 2876  Xorriso_free_meM(et_imgs);
 2877  Xorriso_free_meM(lines);
 2878  Xorriso_free_meM(buf);
 2879  return(ret);
 2880 
 2881 #undef Xorriso_record_cmd_linE
 2882 #undef Xorriso_record_boot_imglinE
 2883 #undef Xorriso_max_endless_uefi_sizE
 2884 
 2885 }
 2886 
 2887 
 2888 /* @param flag bit0= currently not significant:
 2889                      report is about El Torito rather than System Area
 2890                bit1= report -as mkisofs options in cmds
 2891                bit2= no sorry messages
 2892                bit15= dispose cmds and boot_imgs
 2893 */
 2894 static int Xorriso_report_to_cmd(struct XorrisO *xorriso,
 2895                                  char **et_lines, int et_line_count,
 2896                                  char **sa_lines, int sa_line_count,
 2897                                  char ***cmds, int *cmd_count,
 2898                                  char ***boot_imgs, int *boot_img_count,
 2899                                  int flag)
 2900 {
 2901  int ret= 0, i;
 2902 
 2903  if(flag & (1 << 15))
 2904    {ret= 1; goto ex;}
 2905  *cmds= NULL;
 2906  *cmd_count= 0;
 2907 
 2908  /* Count commands */
 2909  ret= Xorriso_scan_report_lines(xorriso, et_lines, et_line_count,
 2910                                 sa_lines, sa_line_count, *cmds, cmd_count,
 2911                                 *boot_imgs, boot_img_count,
 2912                                 1 | (flag & 6));
 2913  if(ret <= 0)
 2914    goto ex;
 2915 
 2916  if(*cmd_count <= 0 && *boot_img_count <= 0)
 2917    {ret= 2; goto ex;}
 2918  if(*cmd_count > 0) {
 2919    Xorriso_alloc_meM(*cmds, char *, *cmd_count);
 2920    for(i= 0; i < *cmd_count; i++)
 2921      (*cmds)[i]= NULL;
 2922  }
 2923  if(*boot_img_count > 0) {
 2924    Xorriso_alloc_meM(*boot_imgs, char *, *boot_img_count);
 2925    for(i= 0; i < *boot_img_count; i++)
 2926      (*boot_imgs)[i]= NULL;
 2927  }
 2928  
 2929  /* Record commands */
 2930  ret= Xorriso_scan_report_lines(xorriso, et_lines, et_line_count, 
 2931                                 sa_lines, sa_line_count, *cmds, cmd_count,
 2932                                 *boot_imgs, boot_img_count,
 2933                                 flag & 6);
 2934  if(ret <= 0)
 2935    goto ex;
 2936 
 2937  ret= 1;
 2938 ex:
 2939  if(ret <= 0 || (flag & (1 << 15))) {
 2940    if(*cmds != NULL) {
 2941      for(i= 0; i < *cmd_count; i++)
 2942        if((*cmds)[i] != NULL)
 2943          Xorriso_free_meM((*cmds)[i]);
 2944      Xorriso_free_meM(*cmds);
 2945      *cmds= NULL;
 2946    }
 2947    if(*boot_imgs != NULL) {
 2948      for(i= 0; i < *boot_img_count; i++)
 2949        if((*boot_imgs)[i] != NULL)
 2950          Xorriso_free_meM((*boot_imgs)[i]);
 2951      Xorriso_free_meM(*boot_imgs);
 2952      *boot_imgs= NULL;
 2953    }
 2954  }
 2955  return(ret); 
 2956 }
 2957 
 2958 
 2959 
 2960 static void Xorriso_report_lines(struct XorrisO *xorriso,
 2961                                 char **lines, int line_count)
 2962 {
 2963  int i;
 2964 
 2965  for(i = 0; i < line_count ; i++) {
 2966    sprintf(xorriso->result_line, "%s\n", lines[i]);
 2967    Xorriso_result(xorriso,0);
 2968  }
 2969 } 
 2970 
 2971 
 2972 /* @param flag bit0= report El Torito rather than System Area
 2973                bit1= with form "cmd" do not report but rather execute
 2974 */
 2975 int Xorriso_report_system_area(struct XorrisO *xorriso, char *form, int flag)
 2976 {
 2977  int ret, line_count, cmd_count= 0, et_line_count= 0, sa_line_count= 0;
 2978  int do_cmd= 0, as_mkisofs= 0, i, bin_count, boot_img_count= 0;
 2979  char **lines = NULL, **et_lines= NULL, **sa_lines= NULL, **cmds= NULL;
 2980  char **boot_imgs= NULL;
 2981  uint8_t guid[16];
 2982  IsoImage *image;
 2983 
 2984  if(strcmp(form, "cmd") == 0 || strcmp(form, "as_mkisofs") == 0 || (flag & 2))
 2985    do_cmd= 1;
 2986  if(strcmp(form, "as_mkisofs") == 0)
 2987    as_mkisofs= 1;
 2988 
 2989  if(strcmp(form, "help") == 0) {
 2990    if(flag & 1)
 2991      ret= iso_image_report_el_torito(NULL, &et_lines, &et_line_count, 1);
 2992    else
 2993      ret= iso_image_report_system_area(NULL, &sa_lines, &sa_line_count, 1);
 2994    if(ret <= 0)
 2995      goto ex;
 2996    sprintf(xorriso->result_line,
 2997 "------------------------------------------------------------------------------\n");
 2998    Xorriso_result(xorriso, 0);
 2999    if(flag & 1)
 3000    sprintf(xorriso->result_line, "With -report_el_torito \"plain\":\n");
 3001    else
 3002      sprintf(xorriso->result_line, "With -report_system_area \"plain\":\n");
 3003    Xorriso_result(xorriso, 0);
 3004    sprintf(xorriso->result_line,
 3005 "------------------------------------------------------------------------------\n");
 3006    Xorriso_result(xorriso, 0);
 3007    sprintf(xorriso->result_line, "\n");
 3008    Xorriso_result(xorriso, 0);
 3009 
 3010  } else if(strcmp(form, "") == 0 || strcmp(form, "plain") == 0 || do_cmd) {
 3011    ret= Xorriso_get_volume(xorriso, &image, 0);
 3012    if(ret <= 0)
 3013      goto ex;
 3014    if(do_cmd || (flag & 1))
 3015      ret= iso_image_report_el_torito(image, &et_lines, &et_line_count, 0);
 3016    if(ret < 0)
 3017      goto ex;
 3018    if(do_cmd || !(flag & 1))
 3019      ret= iso_image_report_system_area(image, &sa_lines, &sa_line_count, 0);
 3020    if(ret < 0)
 3021      goto ex;
 3022    if(do_cmd) {
 3023      ret= Xorriso_report_to_cmd(xorriso, et_lines, et_line_count,
 3024                                 sa_lines, sa_line_count, &cmds, &cmd_count,
 3025                                 &boot_imgs, &boot_img_count,
 3026                                 (flag & 1) | (as_mkisofs << 1));
 3027      if(ret <= 0)
 3028        goto ex;
 3029    }
 3030 
 3031  } else if(strncmp(form, "gpt_crc_of:", 11) == 0 && !(flag & 1)) {
 3032    ret = Xorriso_gpt_crc(xorriso, form + 11, 0);
 3033    goto ex;
 3034 
 3035  } else if(strcmp(form, "make_guid") == 0 && !(flag & 1)) {
 3036    ret= Xorriso_make_guid(xorriso, xorriso->result_line, 0);
 3037    if(ret < 0)
 3038      goto ex;
 3039    strcat(xorriso->result_line, "\n");
 3040    Xorriso_result(xorriso,0);
 3041    goto ex;
 3042 
 3043  } else if(strcmp(form, "gpt_disk_guid") == 0 && !(flag & 1)) {
 3044    ret= Xorriso_get_volume(xorriso, &image, 0);
 3045    if(ret <= 0)
 3046      goto ex;
 3047    ret= iso_image_report_system_area(image, &sa_lines, &sa_line_count, 0);
 3048    if(ret <= 0)
 3049      goto ex;
 3050    for(i= 0; i < sa_line_count; i++) {
 3051      if(strncmp(sa_lines[i], "GPT disk GUID      :      ", 26) == 0) {
 3052        ret= Hex_to_bin(sa_lines[i] + 26, 16, &bin_count, guid, 0);
 3053        if(ret < 0 || bin_count != 16)
 3054    break;
 3055        Xorriso_format_guid(xorriso, guid, xorriso->result_line, 0);
 3056        strcat(xorriso->result_line, "\n");
 3057        Xorriso_result(xorriso,0);
 3058        ret= 1;
 3059        goto ex;
 3060      }
 3061    }
 3062    ret= 1;
 3063    goto ex;
 3064    
 3065  } else {
 3066    sprintf(xorriso->info_text,
 3067            "%s form parameter not recognized: ",
 3068            flag & 1 ? "-report_el_torito" : "-report_system_area");
 3069    Text_shellsafe(form, xorriso->info_text, 1);
 3070    Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
 3071    ret= 0; goto ex;
 3072  }
 3073  if(ret < 0)
 3074    goto ex;
 3075  if(flag & 1) {
 3076    lines= et_lines;
 3077    line_count= et_line_count;
 3078  } else {
 3079    lines= sa_lines;
 3080    line_count= sa_line_count;
 3081  }
 3082  if(!do_cmd) {
 3083    if(lines == NULL || ret == 0) {
 3084      if(flag & 1)
 3085        strcpy(xorriso->info_text, "No El Torito information was loaded");
 3086      else
 3087        strcpy(xorriso->info_text, "No System Area was loaded");
 3088      Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "NOTE", 0);
 3089      ret= 2; goto ex;
 3090    }
 3091    if(line_count == 0) {
 3092      if(flag & 1)
 3093        strcpy(xorriso->info_text, "No El Torito information available");
 3094      else
 3095        strcpy(xorriso->info_text, "System Area only contains 0-bytes");
 3096      Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "NOTE", 0);
 3097      ret= 2; goto ex;
 3098    }
 3099  }
 3100  if(flag & 2) {
 3101    if(cmd_count > 0) {
 3102      ret= Xorriso_execute_option(xorriso,
 3103                "-boot_image any discard -boot_image any system_area=/dev/zero",
 3104                1 | 16);
 3105      if(ret <= 0)
 3106        goto ex;
 3107      for(i= 0; i < cmd_count; i++) {
 3108        ret= Xorriso_execute_option(xorriso, cmds[i], 1 | 16);
 3109        if(ret <= 0)
 3110          goto ex;
 3111      }
 3112      sprintf(xorriso->info_text,
 3113              "Replayed %d boot related commands", cmd_count);
 3114      Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "NOTE", 0);
 3115    } else {
 3116      Xorriso_msgs_submit(xorriso, 0,
 3117                          "No proposals available for boot related commands",
 3118                          0, "NOTE", 0);
 3119      ret= 2; goto ex;
 3120    }
 3121  } else if(do_cmd) {
 3122    Xorriso_report_lines(xorriso, cmds, cmd_count);
 3123  } else {
 3124    Xorriso_report_lines(xorriso, lines, line_count);
 3125  }
 3126  ret= 1;
 3127 ex:;
 3128  Xorriso_report_to_cmd(xorriso, NULL, 0, NULL, 0, &cmds, &cmd_count,
 3129                        &boot_imgs, &boot_img_count, 1 << 15);
 3130  if(et_lines != NULL)
 3131    iso_image_report_el_torito(NULL, &et_lines, &et_line_count, 1 << 15);
 3132  if(sa_lines != NULL)
 3133    iso_image_report_system_area(NULL, &sa_lines, &sa_line_count, 1 << 15);
 3134  return(ret);
 3135 }
 3136 
 3137 
 3138 /* @param flag bit15= dispose imgs
 3139  */
 3140 int Xorriso_list_boot_images(struct XorrisO *xorriso,
 3141                              char ***imgs, int *img_count, int flag)
 3142 {
 3143  int ret, cmd_count= 0, et_line_count= 0, sa_line_count= 0, boot_img_count= 0;
 3144  char **et_lines= NULL, **sa_lines= NULL, **cmds= NULL, **boot_imgs= NULL;
 3145  IsoImage *image;
 3146 
 3147  if(flag & (1 << 15)) {
 3148    boot_imgs= *imgs;
 3149    boot_img_count= *img_count;
 3150    Xorriso_report_to_cmd(xorriso, NULL, 0, NULL, 0, &cmds, &cmd_count,
 3151                          &boot_imgs, &boot_img_count, 1 << 15);
 3152    *imgs= NULL;
 3153    *img_count= 0;
 3154    return(1);
 3155  }
 3156 
 3157  *imgs= NULL;
 3158  *img_count= 0;
 3159 
 3160  ret= Xorriso_get_volume(xorriso, &image, 0);
 3161  if(ret <= 0)
 3162    goto ex;
 3163  ret= iso_image_report_el_torito(image, &et_lines, &et_line_count, 0);
 3164  if(ret < 0)
 3165    goto ex;
 3166  ret= iso_image_report_system_area(image, &sa_lines, &sa_line_count, 0);
 3167  if(ret < 0)
 3168    goto ex;
 3169  ret= Xorriso_report_to_cmd(xorriso, et_lines, et_line_count,
 3170                             sa_lines, sa_line_count, &cmds, &cmd_count,
 3171                             &boot_imgs, &boot_img_count, 4);
 3172  if(ret <= 0)
 3173    goto ex;
 3174  *imgs= boot_imgs;
 3175  *img_count= boot_img_count;
 3176  boot_imgs= NULL;
 3177  boot_img_count= 0;
 3178  ret= 1;
 3179 ex:;
 3180  Xorriso_report_to_cmd(xorriso, NULL, 0, NULL, 0, &cmds, &cmd_count,
 3181                        &boot_imgs, &boot_img_count, 1 << 15);
 3182  if(et_lines != NULL)
 3183    iso_image_report_el_torito(NULL, &et_lines, &et_line_count, 1 << 15);
 3184  if(sa_lines != NULL)
 3185    iso_image_report_system_area(NULL, &sa_lines, &sa_line_count, 1 << 15);
 3186  return(ret);
 3187 }
 3188