New boot_image boot specs partition_offset, partition_hd_cyl, partition_sec_hd

This commit is contained in:
Thomas Schmitt 2010-09-05 11:37:45 +00:00
parent 0e755f48c9
commit 21bd5b5d42
9 changed files with 183 additions and 39 deletions

View File

@ -207,6 +207,9 @@ int Xorriso_new(struct XorrisO ** xorriso,char *progname, int flag)
m->system_area_disk_path[0]= 0; m->system_area_disk_path[0]= 0;
m->system_area_options= 0; m->system_area_options= 0;
m->patch_system_area= 0; m->patch_system_area= 0;
m->partition_offset= 0;
m->partition_secs_per_head= 0;
m->partition_heads_per_cyl= 0;
m->vol_creation_time= 0; m->vol_creation_time= 0;
m->vol_modification_time= 0; m->vol_modification_time= 0;
m->vol_expiration_time= 0; m->vol_expiration_time= 0;

View File

@ -791,6 +791,40 @@ treatment_patch:;
} else } else
was_ok= 0; was_ok= 0;
} else if(strncmp(treatpt, "partition_offset=", 17)==0) {
u= 0;
sscanf(treatpt + 17, "%u", &u);
if(u > 0 && u < 16) {
sprintf(xorriso->info_text,
"-boot_image %s partition_offset= : Non-zero number too small (<16).",
formpt);
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
return(0);
}
xorriso->partition_offset= u;
} else if(strncmp(treatpt, "partition_hd_cyl=", 17)==0) {
u= 0;
sscanf(treatpt + 17, "%u", &u);
if(u > 255) {
sprintf(xorriso->info_text,
"-boot_image %s partition_hd_cyl= : Number too large (>255).", formpt);
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
return(0);
}
xorriso->partition_heads_per_cyl= u;
} else if(strncmp(treatpt, "partition_sec_hd=", 17)==0) {
u= 0;
sscanf(treatpt + 17, "%u", &u);
if(u > 63) {
sprintf(xorriso->info_text,
"-boot_image %s partition_sec_hd= : Number too large (>63).", formpt);
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
return(0);
}
xorriso->partition_secs_per_head= u;
} else if(strncmp(treatpt, "platform_id=", 12)==0) { } else if(strncmp(treatpt, "platform_id=", 12)==0) {
if(strncmp(treatpt + 12, "0x", 2) == 0) if(strncmp(treatpt + 12, "0x", 2) == 0)
sscanf(treatpt + 14, "%x", &u); sscanf(treatpt + 14, "%x", &u);

View File

@ -512,7 +512,7 @@ int Xorriso_write_to_channel(struct XorrisO *xorriso,
bit15= with bit1 or bit2: close depicted log file bit15= with bit1 or bit2: close depicted log file
*/ */
{ {
char *rpt, *npt, *text; char *rpt, *npt, *text= NULL;
int ret= 1, info_redirected= 0, result_redirected= 0; int ret= 1, info_redirected= 0, result_redirected= 0;
char prefix[16]; char prefix[16];
FILE *logfile_fp, *pktlog_fp; FILE *logfile_fp, *pktlog_fp;
@ -520,11 +520,11 @@ bit15= with bit1 or bit2: close depicted log file
static int num_channels= 4; static int num_channels= 4;
static char channel_prefixes[4][4]= {".","R","I","M"}; static char channel_prefixes[4][4]= {".","R","I","M"};
text= in_text; /* might change due to backslash encoding */
if(channel_no<0 || channel_no>=num_channels) if(channel_no<0 || channel_no>=num_channels)
{ret= -1; goto ex;} {ret= -1; goto ex;}
text= in_text; /* might change due to backslash encoding */
/* Logfiles */ /* Logfiles */
logfile_fp= xorriso->logfile_fp[channel_no]; logfile_fp= xorriso->logfile_fp[channel_no];
pktlog_fp= xorriso->pktlog_fp; pktlog_fp= xorriso->pktlog_fp;
@ -1278,7 +1278,25 @@ int Xorriso_status(struct XorrisO *xorriso, char *filter, FILE *fp, int flag)
Text_shellsafe(xorriso->system_area_disk_path, sfe, 0)); Text_shellsafe(xorriso->system_area_disk_path, sfe, 0));
if(!(is_default && no_defaults)) if(!(is_default && no_defaults))
Xorriso_status_result(xorriso,filter,fp,flag&2); Xorriso_status_result(xorriso,filter,fp,flag&2);
if(xorriso->system_area_disk_path[0] || !part_table_implicit) {
is_default= (xorriso->partition_offset == 0);
sprintf(line,"-boot_image any partition_offset=%lu\n",
(unsigned long int) xorriso->partition_offset);
if(!(is_default && no_defaults))
Xorriso_status_result(xorriso,filter,fp,flag&2);
is_default= (xorriso->partition_secs_per_head == 0);
sprintf(line,"-boot_image any partition_sec_hd=%lu\n",
(unsigned long int) xorriso->partition_secs_per_head);
if(!(is_default && no_defaults))
Xorriso_status_result(xorriso,filter,fp,flag&2);
is_default= (xorriso->partition_heads_per_cyl == 0);
sprintf(line,"-boot_image any partition_hd_cyl=%lu\n",
(unsigned long int) xorriso->partition_heads_per_cyl);
if(!(is_default && no_defaults))
Xorriso_status_result(xorriso,filter,fp,flag&2);
if((xorriso->system_area_disk_path[0] || !part_table_implicit) &&
(xorriso->partition_offset == 0 || (xorriso->system_area_options & 2))) {
is_default= ((xorriso->system_area_options & 3) == 0); is_default= ((xorriso->system_area_options & 3) == 0);
sprintf(line,"-boot_image %s partition_table=%s\n", sprintf(line,"-boot_image %s partition_table=%s\n",
xorriso->system_area_options & 2 ? "isolinux" : "grub", xorriso->system_area_options & 2 ? "isolinux" : "grub",

View File

@ -308,6 +308,15 @@ do_set:;
0, "FAILURE", 1); 0, "FAILURE", 1);
{ret= 0; goto ex;} {ret= 0; goto ex;}
} }
ret= isoburn_igopt_set_part_offset(sopts, xorriso->partition_offset,
xorriso->partition_secs_per_head,
xorriso->partition_heads_per_cyl);
if(ret != ISO_SUCCESS) {
Xorriso_process_msg_queues(xorriso,0);
Xorriso_report_iso_error(xorriso, "", ret,
"Error when setting partition offset", 0, "FAILURE", 1);
{ret= 0; goto ex;}
}
ret= 1; ret= 1;
ex:; ex:;
if(fp != NULL && fp != stdin) if(fp != NULL && fp != stdin)
@ -522,6 +531,18 @@ int Xorriso_write_session(struct XorrisO *xorriso, int flag)
"on attempt to write", 2); "on attempt to write", 2);
if(ret<=0) if(ret<=0)
return(0); return(0);
/* <<< TWINTREE: preliminary */
if(xorriso->partition_offset > 0) {
s= isoburn_disc_get_status(drive);
if(s != BURN_DISC_BLANK) {
sprintf(xorriso->info_text,
"Output drive not blank with non-zero partition offset");
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
{ret= 0; goto ex;}
}
}
if(xorriso->out_drive_handle == xorriso->in_drive_handle) { if(xorriso->out_drive_handle == xorriso->in_drive_handle) {
source_drive= drive; source_drive= drive;
} else { } else {
@ -680,6 +701,11 @@ int Xorriso_write_session(struct XorrisO *xorriso, int flag)
((!!(xorriso->do_md5 & 8)) * isoburn_igopt_file_stability); ((!!(xorriso->do_md5 & 8)) * isoburn_igopt_file_stability);
if(xorriso->no_emul_toc & 1) if(xorriso->no_emul_toc & 1)
ext|= isoburn_igopt_no_emul_toc; ext|= isoburn_igopt_no_emul_toc;
/* <<< TWINTREE: preliminary */
if(xorriso->partition_offset > 0)
ext|= isoburn_igopt_no_emul_toc;
isoburn_igopt_set_extensions(sopts, ext); isoburn_igopt_set_extensions(sopts, ext);
isoburn_igopt_set_relaxed(sopts, relax); isoburn_igopt_set_relaxed(sopts, relax);
isoburn_igopt_set_sort_files(sopts, 1); isoburn_igopt_set_sort_files(sopts, 1);

View File

@ -9,7 +9,7 @@
.\" First parameter, NAME, should be all caps .\" First parameter, NAME, should be all caps
.\" Second parameter, SECTION, should be 1-8, maybe w/ subsection .\" Second parameter, SECTION, should be 1-8, maybe w/ subsection
.\" other parameters are allowed: see man(7), man(1) .\" other parameters are allowed: see man(7), man(1)
.TH XORRISO 1 "Jul 30, 2010" .TH XORRISO 1 "Sep 04, 2010"
.\" Please adjust this date whenever revising the manpage. .\" Please adjust this date whenever revising the manpage.
.\" .\"
.\" Some roff macros, for reference: .\" Some roff macros, for reference:
@ -2393,6 +2393,22 @@ then those parameters get updated when the new System Area is written.
Special "system_area=/dev/zero" causes 32k of NUL-bytes. Special "system_area=/dev/zero" causes 32k of NUL-bytes.
Use this to discard an MBR which eventually was loaded with the ISO image. Use this to discard an MBR which eventually was loaded with the ISO image.
.br .br
\fBpartition_offset=\fR2kb_block_adr causes a partition table where the
first partition begins at the given block address. This is counted in 2 kB
blocks, not in 512 byte blocks. If the block address is non-zero then it must
be at least 16. A non-zero partition offset causes two susperblocks to be
generated and two sets of directory trees. The image is then mountable from its
absolute start as well as from the partition start.
.br
Preliminary restrictions: Non-zero offset works only with blank output media
and implies -compliance no_emul_toc.
.br
\fBpartition_sec_hd=\fRnumber gives the number of sectors per head for
partition offset. 0 chooses a default value.
.br
\fBpartition_hd_cyl=\fRnumber gives the number of heads per cylinder for
partition offset. 0 chooses a default value.
.br
.TP .TP
.B Character sets: .B Character sets:
.PP .PP

View File

@ -2129,6 +2129,19 @@ of the existing sessions, unless one can assume overwriteable media.
when the new System Area is written. when the new System Area is written.
Special "system_area=/dev/zero" causes 32k of NUL-bytes. Use this Special "system_area=/dev/zero" causes 32k of NUL-bytes. Use this
to discard an MBR which eventually was loaded with the ISO image. to discard an MBR which eventually was loaded with the ISO image.
*partition_offset=*2kb_block_adr causes a partition table where the
first partition begins at the given block address. This is counted
in 2 kB blocks, not in 512 byte blocks. If the block address is
non-zero then it must be at least 16. A non-zero partition offset
causes two susperblocks to be generated and two sets of directory
trees. The image is then mountable from its absolute start as well
as from the partition start.
Preliminary restrictions: Non-zero offset works only with blank
output media and implies -compliance no_emul_toc.
*partition_sec_hd=*number gives the number of sectors per head for
partition offset. 0 chooses a default value.
*partition_hd_cyl=*number gives the number of heads per cylinder
for partition offset. 0 chooses a default value.
 
File: xorriso.info, Node: Charset, Next: Exception, Prev: Bootable, Up: Options File: xorriso.info, Node: Charset, Next: Exception, Prev: Bootable, Up: Options
@ -4071,6 +4084,7 @@ File: xorriso.info, Node: ConceptIdx, Prev: CommandIdx, Up: Top
* Ownership, global in ISO image, -uid: SetWrite. (line 162) * Ownership, global in ISO image, -uid: SetWrite. (line 162)
* Ownership, in ISO image, -chown: Manip. (line 42) * Ownership, in ISO image, -chown: Manip. (line 42)
* Ownership, in ISO image, -chown_r: Manip. (line 47) * Ownership, in ISO image, -chown_r: Manip. (line 47)
* Partition offset, _definiton: Bootable. (line 142)
* Partition table, _definiton: Bootable. (line 124) * Partition table, _definiton: Bootable. (line 124)
* Pathspec, _definition: SetInsert. (line 120) * Pathspec, _definition: SetInsert. (line 120)
* Pattern expansion, _definition: Processing. (line 22) * Pattern expansion, _definition: Processing. (line 22)
@ -4183,37 +4197,37 @@ Node: Filter75390
Node: Writing79739 Node: Writing79739
Node: SetWrite86028 Node: SetWrite86028
Node: Bootable97977 Node: Bootable97977
Node: Charset106184 Node: Charset107016
Node: Exception108938 Node: Exception109770
Node: DialogCtl113453 Node: DialogCtl114285
Node: Inquiry115798 Node: Inquiry116630
Node: Navigate119928 Node: Navigate120760
Node: Verify127526 Node: Verify128358
Node: Restore135946 Node: Restore136778
Node: Emulation142602 Node: Emulation143434
Node: Scripting150325 Node: Scripting151157
Node: Frontend155887 Node: Frontend156719
Node: Examples157088 Node: Examples157920
Node: ExDevices158257 Node: ExDevices159089
Node: ExCreate158891 Node: ExCreate159723
Node: ExDialog160165 Node: ExDialog160997
Node: ExGrowing161427 Node: ExGrowing162259
Node: ExModifying162229 Node: ExModifying163061
Node: ExBootable162730 Node: ExBootable163562
Node: ExCharset163277 Node: ExCharset164109
Node: ExPseudo164105 Node: ExPseudo164937
Node: ExCdrecord164999 Node: ExCdrecord165831
Node: ExMkisofs165314 Node: ExMkisofs166146
Node: ExGrowisofs166317 Node: ExGrowisofs167149
Node: ExException167441 Node: ExException168273
Node: ExTime167895 Node: ExTime168727
Node: ExIncBackup168354 Node: ExIncBackup169186
Node: ExRestore171826 Node: ExRestore172658
Node: ExRecovery172795 Node: ExRecovery173627
Node: Files173361 Node: Files174193
Node: Seealso174589 Node: Seealso175421
Node: Legal175113 Node: Legal175945
Node: CommandIdx176035 Node: CommandIdx176867
Node: ConceptIdx189841 Node: ConceptIdx190673
 
End Tag Table End Tag Table

View File

@ -44,7 +44,7 @@
@c man .\" First parameter, NAME, should be all caps @c man .\" First parameter, NAME, should be all caps
@c man .\" Second parameter, SECTION, should be 1-8, maybe w/ subsection @c man .\" Second parameter, SECTION, should be 1-8, maybe w/ subsection
@c man .\" other parameters are allowed: see man(7), man(1) @c man .\" other parameters are allowed: see man(7), man(1)
@c man .TH XORRISO 1 "Jul 30, 2010" @c man .TH XORRISO 1 "Sep 04, 2010"
@c man .\" Please adjust this date whenever revising the manpage. @c man .\" Please adjust this date whenever revising the manpage.
@c man .\" @c man .\"
@c man .\" Some roff macros, for reference: @c man .\" Some roff macros, for reference:
@ -2861,6 +2861,23 @@ then those parameters get updated when the new System Area is written.
Special "system_area=/dev/zero" causes 32k of NUL-bytes. Special "system_area=/dev/zero" causes 32k of NUL-bytes.
Use this to discard an MBR which eventually was loaded with the ISO image. Use this to discard an MBR which eventually was loaded with the ISO image.
@* @*
@cindex Partition offset, _definiton
@strong{partition_offset=}2kb_block_adr causes a partition table where the
first partition begins at the given block address. This is counted in 2 kB
blocks, not in 512 byte blocks. If the block address is non-zero then it must
be at least 16. A non-zero partition offset causes two susperblocks to be
generated and two sets of directory trees. The image is then mountable from its
absolute start as well as from the partition start.
@*
Preliminary restrictions: Non-zero offset works only with blank output media
and implies -compliance no_emul_toc.
@*
@strong{partition_sec_hd=}number gives the number of sectors per head for
partition offset. 0 chooses a default value.
@*
@strong{partition_hd_cyl=}number gives the number of heads per cylinder for
partition offset. 0 chooses a default value.
@*
@end table @end table
@c man .TP @c man .TP
@c man .B Character sets: @c man .B Character sets:

View File

@ -19,6 +19,10 @@
#define Xorriso_private_includeD yes #define Xorriso_private_includeD yes
/* for uint32_t */
#include <stdint.h>
/** The source code release timestamp */ /** The source code release timestamp */
#include "xorriso_timestamp.h" #include "xorriso_timestamp.h"
#ifndef Xorriso_timestamP #ifndef Xorriso_timestamP
@ -302,6 +306,18 @@ struct XorrisO { /* the global context of xorriso */
area of the image, if no area of the image, if no
system_area_disk_path is set. system_area_disk_path is set.
*/ */
/* TWINTREE: The number of unclaimed 2K blocks before
start of partition 1 as of the MBR in system area.
If not 0 this will cause double volume descriptor sets
and double tree.
*/
uint32_t partition_offset;
/* TWINTREE: Partition table parameter: 1 to 63, 0= disabled/default */
int partition_secs_per_head;
/* TWINTREE: 1 to 255, 0= disabled/default */
int partition_heads_per_cyl;
/* User settable PVD time stamps */ /* User settable PVD time stamps */
time_t vol_creation_time; time_t vol_creation_time;
time_t vol_modification_time; time_t vol_modification_time;

View File

@ -1 +1 @@
#define Xorriso_timestamP "2010.09.05.113621" #define Xorriso_timestamP "2010.09.05.113655"