New API function isoburn_igopt_set_part_offset(), requiring libisofs 0.6.35

This commit is contained in:
Thomas Schmitt 2010-09-05 11:36:53 +00:00
parent 4e4b789753
commit 0e755f48c9
4 changed files with 121 additions and 2 deletions

View File

@ -487,6 +487,39 @@ int isoburn_prepare_disc_aux(struct burn_drive *in_d, struct burn_drive *out_d,
iso_write_opts_set_overwrite_buf(wopts, iso_write_opts_set_overwrite_buf(wopts,
nwa>0 ? out_o->target_iso_head : NULL); nwa>0 ? out_o->target_iso_head : NULL);
if (opts->partition_offset > 0) {
if (nwa > 0) {
/* >>> refuse because for now this works only for single session with
no_emul_toc
<<< to be removed when multi session stuff is fully ready
*/
isoburn_msgs_submit(in_o, 0x00060000,
"Programming error: non-zero NWA combined with partition offset",
0, "FATAL", 0);
{ret= -4; goto ex;}
}
iso_write_opts_set_part_offset(wopts, opts->partition_offset,
opts->partition_secs_per_head,
opts->partition_heads_per_cyl);
}
#ifdef Libisoburn_partition_offseT
#if Libisoburn_partition_offseT >= 16
else {
/* <<< For preliminary testing of emulated TOC and partition offset.
Problem is that only this macro can prepare the overwrite buffer
for partition offset yet. Emulated TOC does not work yet.
*/
iso_write_opts_set_part_offset(wopts,
(uint32_t) Libisoburn_partition_offseT,
0, 0);
}
#endif
#endif
ret = iso_image_create_burn_source(in_o->image, wopts, &wsrc); ret = iso_image_create_burn_source(in_o->image, wopts, &wsrc);
if (ret < 0) { if (ret < 0) {
isoburn_report_iso_error(ret, "Cannot create burn source", 0, "FAILURE", 0); isoburn_report_iso_error(ret, "Cannot create burn source", 0, "FAILURE", 0);
@ -877,6 +910,9 @@ int isoburn_igopt_new(struct isoburn_imgen_opts **new_o, int flag)
o->data_start_lba= -1; o->data_start_lba= -1;
o->system_area_data= NULL; o->system_area_data= NULL;
o->system_area_options= 0; o->system_area_options= 0;
o->partition_offset= 0;
o->partition_secs_per_head= 0;
o->partition_heads_per_cyl= 0;
o->vol_creation_time= 0; o->vol_creation_time= 0;
o->vol_modification_time= 0; o->vol_modification_time= 0;
o->vol_expiration_time= 0; o->vol_expiration_time= 0;
@ -1157,3 +1193,26 @@ int isoburn_igopt_get_pvd_times(struct isoburn_imgen_opts *opts,
} }
int isoburn_igopt_set_part_offset(struct isoburn_imgen_opts *opts,
uint32_t block_offset_2k,
int secs_512_per_head, int heads_per_cyl)
{
if (block_offset_2k > 0 && block_offset_2k < 16)
return(0);
opts->partition_offset = block_offset_2k;
opts->partition_secs_per_head = secs_512_per_head;
opts->partition_heads_per_cyl = heads_per_cyl;
return(1);
}
int isoburn_igopt_get_part_offset(struct isoburn_imgen_opts *opts,
uint32_t *block_offset_2k,
int *secs_512_per_head, int *heads_per_cyl)
{
*block_offset_2k = opts->partition_offset;
*secs_512_per_head = opts->partition_secs_per_head;
*heads_per_cyl = opts->partition_heads_per_cyl;
return 1;
}

View File

@ -36,10 +36,20 @@ int isoburn_toc_entry_new(struct isoburn_toc_entry **objpt,
int isoburn_toc_entry_destroy(struct isoburn_toc_entry **o, int flag); int isoburn_toc_entry_destroy(struct isoburn_toc_entry **o, int flag);
/* >>> TWINTREE : provisory test of partition offset with emulated TOC.
.target_iso_head must become dynamically allocated
#define Libisoburn_partition_offseT 16
*/
/* Size of target_iso_head which is to be written during /* Size of target_iso_head which is to be written during
isoburn_activate_session() isoburn_activate_session()
*/ */
#ifdef Libisoburn_partition_offseT
#define Libisoburn_target_head_sizE (32*2048 +Libisoburn_partition_offseT*2048)
#else
#define Libisoburn_target_head_sizE (32*2048) #define Libisoburn_target_head_sizE (32*2048)
#endif
struct isoburn { struct isoburn {
@ -520,6 +530,17 @@ struct isoburn_imgen_opts {
and timezone 0 */ and timezone 0 */
char vol_uuid[17]; char vol_uuid[17];
/* 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;
}; };

View File

@ -224,7 +224,7 @@ void isoburn_version(int *major, int *minor, int *micro);
*/ */
#define isoburn_libisofs_req_major 0 #define isoburn_libisofs_req_major 0
#define isoburn_libisofs_req_minor 6 #define isoburn_libisofs_req_minor 6
#define isoburn_libisofs_req_micro 34 #define isoburn_libisofs_req_micro 35
/** The minimum version of libburn to be used with this version of libisoburn /** The minimum version of libburn to be used with this version of libisoburn
at compile time. at compile time.
@ -1222,6 +1222,44 @@ int isoburn_igopt_set_system_area(struct isoburn_imgen_opts *o,
int isoburn_igopt_get_system_area(struct isoburn_imgen_opts *o, int isoburn_igopt_get_system_area(struct isoburn_imgen_opts *o,
char data[32768], int *options); char data[32768], int *options);
/** >>> TWINTREE : Under Construction.
Do not use yet for multi-session
Control production of a second set of volume descriptors (ISO 9660 superblock)
and directory trees, together with a partition table entry in the MBR which
has non-zero start address.
The second volume descriptor set and trees will allow to mount the ISO image
at the start of the first partition, while it is still possible to mount it
via the normal fist volume descriptor set and tree at the start of the device.
This makes few sense on optical media. Nevertheless it creates a conventional
partition table on USB sticks which then are mountable on Linux via /dev/sdb
and /dev/sdb1 alike.
>>> Not combinable with multi-session yet.
@since 0.6.2
@param opts
The option set to be manipulated.
@param block_offset_2k
The offset of the partition start relative to device start.
This is counted in 2 kB blocks. The partition table will show the
according number of 512 byte sectors.
Default is 0 which causes no second set and trees.
If it is not 0 then it must not be smaller than 16.
@param secs_512_per_head
Number of 512 byte sectors per head. 1 to 63. 0=automatic.
@param heads_per_cyl
Number of heads per cylinder. 1 to 255. 0=automatic.
@return 1 success, <=0 failure
*/
int isoburn_igopt_set_part_offset(struct isoburn_imgen_opts *opts,
uint32_t block_offset_2k,
int secs_512_per_head, int heads_per_cyl);
int isoburn_igopt_get_part_offset(struct isoburn_imgen_opts *opts,
uint32_t *block_offset_2k,
int *secs_512_per_head, int *heads_per_cyl);
/** Explicitely set the four timestamps of the emerging ISO image. /** Explicitely set the four timestamps of the emerging ISO image.
Default with all parameters is 0. Default with all parameters is 0.
@since 0.5.4 @since 0.5.4
@ -1260,6 +1298,7 @@ int isoburn_igopt_get_pvd_times(struct isoburn_imgen_opts *opts,
time_t *expiration_time, time_t *effective_time, time_t *expiration_time, time_t *effective_time,
char uuid[17]); char uuid[17]);
/* ----------------------------------------------------------------------- */ /* ----------------------------------------------------------------------- */
/* End of Options for image generation */ /* End of Options for image generation */
/* ----------------------------------------------------------------------- */ /* ----------------------------------------------------------------------- */

View File

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