Compare commits

..

57 Commits

Author SHA1 Message Date
beb0ce5522 Libisoburn has just been released 2008-07-18 19:17:48 +00:00
659f88bec7 Corrected outdated statement about minimum library requirements 2008-07-18 13:49:10 +00:00
a52ad2fcf5 Documented changes and release timestamp 2008-07-18 13:30:50 +00:00
f3cb096f46 Version leap to 0.2.2 2008-07-18 13:29:11 +00:00
3cb1741725 Branched for release 2008-07-18 11:13:46 +00:00
a68624cc5c Removed MULTI construction site remarks 2008-07-17 18:44:41 +00:00
a745366913 Recognizing growisofs follow-up sessions on xorriso overwriteables 2008-07-17 18:29:50 +00:00
31809252e8 Rectified usage of original xorriso options underneath growisofs 2008-07-17 11:13:32 +00:00
58ba5aeff6 Ability to emulate a featured bug with mkisofs -C : read 16 block too early 2008-07-17 11:07:42 +00:00
4088bf38a6 Recognizing "b" as speed factor for BD media 2008-07-16 14:00:01 +00:00
404d120b75 Required libburn version is now 0.5.0 2008-07-16 13:11:10 +00:00
ad1762c790 Required libburn version is now 0.5.0 2008-07-16 13:08:09 +00:00
35ff5db496 Updated xorriso standalone configure.ac version number BURN_*_VERSION 2008-07-16 13:07:17 +00:00
d10f3fa7a1 New option -pacifier, more compatible pacifier with -as mkisofs 2008-07-16 13:06:31 +00:00
d382bdba17 New option tsize= with -as cdrecord 2008-07-15 12:18:08 +00:00
af36e5e127 Generating automatic build timestamp 2008-07-15 06:29:58 +00:00
69b0edc261 Small correction with a sed expression 2008-07-14 17:39:12 +00:00
88d94ad7b7 New option -isosize with -as cdrecord 2008-07-14 12:50:53 +00:00
8b5af86a64 New flag options with isoburn_read_iso_head() 2008-07-14 12:04:51 +00:00
cf9bc140b1 Did LT_CURRENT++, LT_AGE++ which was forgotten with revision 1885 2008-07-14 11:45:30 +00:00
a9c0fb6e58 Required libburn version is now 0.4.9 2008-07-14 11:44:39 +00:00
06bcc637d6 New options --grow_overwriteable_iso and write_start_address= with -as cdrecord 2008-07-12 18:48:15 +00:00
c02edc329d New info mode 2 with isoburn_read_iso_head() 2008-07-12 18:18:09 +00:00
7765835374 Some documentation updates 2008-07-10 17:25:19 +00:00
d8b6e69429 Installing softlink xorrecord pointing to the xorriso binary 2008-07-10 16:43:42 +00:00
eddb70823e Reacted on compiler warning 2008-07-10 16:39:36 +00:00
ed03897759 cdrecord emulation by start names xorrecord, cdrecord, wodim, cdrskin 2008-07-10 16:27:35 +00:00
c104b0a073 Header file forgotten with rev 1903 2008-07-10 14:44:59 +00:00
b45fd0553e Small correction in API introduction text 2008-07-10 14:18:33 +00:00
25fd92f2c4 Enabled -multi and -msinfo with -as cdrecord 2008-07-10 14:16:57 +00:00
41aa050551 Completed (unused) dist rule of standalone-xorriso 2008-07-09 20:11:34 +00:00
766129ec66 Opportunity to generate build timestamp via make buildstamped 2008-07-09 15:56:23 +00:00
d825fc1a3a Fixed bug with -as mkisofs -x and pattern expansion 2008-07-09 06:08:03 +00:00
eb9f0f6d6a Avoided to use MMC code with -as mkisofs -M by prepending stdio: to address 2008-07-09 05:51:08 +00:00
d17ddda7db Avoided misleading message about emptied ISO image during -as mkisofs -C 2008-07-08 13:20:17 +00:00
4d3ef02838 Header file forgotten with rev 1897 2008-07-08 10:26:00 +00:00
d42e7b2d9f Installing softlinks xorrisofs and osirrox pointing to the xorriso binary 2008-07-08 09:27:05 +00:00
4ea0e15acb Made leafname triggered emulation more similar to -as emulation 2008-07-08 08:25:07 +00:00
e5ba798b14 Clarification about -grow_blindly predicted_nwa 2008-07-07 15:04:00 +00:00
673a0e9d2f Correction about isoburn_igopt_get_effective_lba() with blind growing 2008-07-07 15:03:03 +00:00
7a7232f16e Correction about -as mkisofs -C if already an input device was set 2008-07-07 15:02:02 +00:00
52d89cc7cc Semi-permanent emulation by start names xorrisofs,genisofs,mkisofs,genioimage 2008-07-07 10:29:38 +00:00
048bbbe1ef Fixed bug about -as mkisofs without -C 2008-07-07 09:55:07 +00:00
1e95e13263 Improved effective drive address with -as mkisofs -M 2008-07-06 11:03:02 +00:00
3cd9763879 Updated xorriso homepage 2008-07-05 19:21:22 +00:00
94638d6e9b Cared for a peculiarity of growisofs when using mkisofs -C 2008-07-05 18:43:57 +00:00
9fa0a6f441 New options -C and -M for -as mkisofs 2008-07-05 18:23:46 +00:00
362ecda0f3 Fixed a bug with -grow_blindly to overwriteable media 2008-07-05 18:02:03 +00:00
f96fdc339a New option -grow_blindly 2008-07-05 13:36:48 +00:00
88ef7d06f4 New API function isoburn_prepare_blind_grow() for -as mkisofs -multi 2008-07-05 13:25:06 +00:00
837f60c2e4 Supporting option -as cdrecord -waiti 2008-07-04 06:59:31 +00:00
ea36885829 Flushing stdout after each result text to deconfuse stdout/stderr with SSH 2008-07-03 13:29:44 +00:00
40d9dcf8bb Extended -as cdrecord blank= by blank type format_overwrite 2008-06-27 13:02:00 +00:00
e35f0b6841 Bug fix: -as cdrecord -atip falsely announced overwriteable DVD-RW to sdvdbackup 2008-06-27 12:41:26 +00:00
f882d323b1 Documented changes and release timestamp 2008-06-22 15:40:47 +00:00
071a3869db Version leap to 0.2.1 2008-06-22 14:04:05 +00:00
4fba3a4365 Removed duplicated help text snippet 2008-06-22 11:12:26 +00:00
25 changed files with 1744 additions and 336 deletions

View File

@ -16,9 +16,11 @@ libisoburn_libisoburn_la_SOURCES = \
libisoburn/isofs_wrap.c \
libisoburn/libisoburn.h \
version.h
libisoburn_libisoburn_la_LIBADD = \
-lisofs \
-lburn
-lburn
libinclude_HEADERS = \
libisoburn/libisoburn.h
@ -39,7 +41,39 @@ xorriso_xorriso_SOURCES = \
xorriso/xorriso.c \
xorriso/xorrisoburn.h \
xorriso/xorrisoburn.c \
xorriso/xorriso_timestamp.h
xorriso/xorriso_timestamp.h \
xorriso/xorriso_buildstamp.h
# Install symbolic links to the xorriso binary
#
install-exec-hook:
if test -e $(bindir)/xorrisofs ; then rm $(bindir)/xorrisofs ; else echo ; fi
ln -s xorriso $(bindir)/xorrisofs
if test -e $(bindir)/osirrox ; then rm $(bindir)/osirrox ; else echo ; fi
ln -s xorriso $(bindir)/osirrox
if test -e $(bindir)/xorrecord ; then rm $(bindir)/xorrecord ; else echo ; fi
ln -s xorriso $(bindir)/xorrecord
# Trying to create a build timestamp file
#
buildstamp:
date -u '+#define Xorriso_build_timestamP "%Y.%m.%d.%H%M%S"' >xorriso/xorriso_buildstamp.h
cat xorriso/xorriso_buildstamp.h
# For now make buildstamped has to be performed explicitely.
buildstamped: buildstamp
make
#
# Processing of the "all:" rule happens too late.
# How to create a dependency of xorriso.c on buildstamp ?
# Not working:
# Add xorriso_buildstamp.h to xorriso_xorriso_SOURCES and make it depend
# on buildstamp. It runs. But at quite random occasions.
# xorriso/xorriso_buildstamp.h: buildstamp
#
# all: buildstamp
## Build test applications
@ -55,13 +89,6 @@ test_compare_file_CFLAGS =
test_compare_file_LDADD =
test_compare_file_SOURCES = test/compare_file.c
# ts A80110 - A80210 : we need as minimal demo something better than test.c
# test/test
# test_test_CPPFLAGS = -Ilibisofs -Ilibburn -Ilibisoburn
# test_test_LDADD = $(libisoburn_libisoburn_la_OBJECTS) $(THREAD_LIBS) -lburn -lisofs
# test_test_SOURCES = test/test.c
## ========================================================================= ##
@ -126,6 +153,7 @@ EXTRA_DIST = \
COPYING \
INSTALL \
xorriso/changelog.txt \
xorriso/xorriso_buildstamp_none.h \
xorriso/README \
$(man_MANS)

17
README
View File

@ -4,7 +4,7 @@
libisoburn. By Vreixo Formoso <metalpain2002@yahoo.es>
and Thomas Schmitt <scdbackup@gmx.net>
Integrated sub project of libburnia-project.org.
http://files.libburnia-project.org/releases/libisoburn-0.2.0.pl00.tar.gz
http://files.libburnia-project.org/releases/libisoburn-0.2.2.pl00.tar.gz
Copyright (C) 2006-2008 Vreixo Formoso, Thomas Schmitt.
Provided under GPL version 2.
------------------------------------------------------------------------------
@ -26,18 +26,18 @@ By using this software you agree to the disclaimer at the end of this text:
Compilation, First Glimpse, Installation
Dynamic library and compile time header requirements for libisoburn-0.2.0 :
- libburn.so.4 , version libburn-0.4.8 or higher
Dynamic library and compile time header requirements for libisoburn-0.2.2 :
- libburn.so.4 , version libburn-0.5.0 or higher
- libisofs.so.6 , version libisofs-0.6.6 or higher
libisoburn and xorriso will not start with libraries which are older than their
headers seen at compile time. So compile in the oldest possible installation
setup unless you have reason to enforce a newer bug fix level.
Obtain libisoburn-0.2.0.pl00.tar.gz, take it to a directory of your choice
Obtain libisoburn-0.2.2.pl00.tar.gz, take it to a directory of your choice
and do:
tar xzf libisoburn-0.2.0.pl00.tar.gz
cd libisoburn-0.2.0
tar xzf libisoburn-0.2.2.pl00.tar.gz
cd libisoburn-0.2.2
Within that directory execute:
@ -67,6 +67,11 @@ xorriso binary depending on libburn.so, libisofs.so, libisoburn.so.
After installation documentation is available via
man xorriso
Several alias links point to the xorriso binary:
xorrisofs starts xorriso with -as mkisofs emulation already enabled
xorrecord starts xorriso with -as cdrecord emulation already enabled
osirrox starts with -osirrox image-to-disk copying already enabled
Drives and Disk File Objects

View File

@ -1,4 +1,4 @@
AC_INIT([libisoburn], [0.2.0], [http://libburnia-project.org])
AC_INIT([libisoburn], [0.2.2], [http://libburnia-project.org])
AC_PREREQ([2.50])
dnl AC_CONFIG_HEADER([config.h])
@ -21,7 +21,7 @@ dnl
dnl These three are only copies to provide libtool with unused LT_RELEASE
ISOBURN_MAJOR_VERSION=0
ISOBURN_MINOR_VERSION=2
ISOBURN_MICRO_VERSION=0
ISOBURN_MICRO_VERSION=2
dnl ISOBURN_VERSION=$ISOBURN_MAJOR_VERSION.$ISOBURN_MINOR_VERSION.$ISOBURN_MICRO_VERSION
AC_SUBST(ISOBURN_MAJOR_VERSION)
@ -33,15 +33,16 @@ dnl Libtool versioning
dnl Generate libisoburn.so.1.x.y
dnl SONAME will become LT_CURRENT - LT_AGE
dnl
dnl ts A80622
dnl This is the release version 0.2.0 = libisoburn.so.1.9.0
dnl ts A80718
dnl This is the release version 0.2.2 = libisoburn.so.1.11.0
dnl ### This is the development version after above stable release
dnl LT_CURRENT++, LT_AGE++ have not happened happened yet.
dnl ### LT_CURRENT++, LT_AGE++ has happened meanwhile.
dnl
dnl SONAME = 10 - 9 = 1 . Library name = libburn.so.1.9.0
dnl SONAME = 12 - 11 = 1 . Library name = libburn.so.1.11.0
LT_RELEASE=$ISOBURN_MAJOR_VERSION.$ISOBURN_MINOR_VERSION
LT_CURRENT=10
LT_AGE=9
LT_CURRENT=12
LT_AGE=11
LT_REVISION=0
LT_CURRENT_MINUS_AGE=`expr $LT_CURRENT - $LT_AGE`
@ -99,7 +100,7 @@ AC_CHECK_HEADER(libburn/libburn.h)
AC_CHECK_HEADER(libisofs/libisofs.h)
dnl Check for proper library versions
LIBBURN_REQUIRED=0.4.8
LIBBURN_REQUIRED=0.5.0
LIBISOFS_REQUIRED=0.6.6
PKG_CHECK_MODULES(LIBBURN, libburn-1 >= $LIBBURN_REQUIRED)
PKG_CHECK_MODULES(LIBISOFS, libisofs-1 >= $LIBISOFS_REQUIRED)

View File

@ -625,6 +625,23 @@ int isoburn_disc_track_lba_nwa(struct burn_drive *d,
}
int isoburn_get_msc2(struct isoburn *o,
struct burn_write_opts *opts, int *msc2, int flag)
{
int ret, lba, nwa;
if(o->fabricated_msc2>=0)
*msc2= o->fabricated_msc2;
else {
ret= isoburn_disc_track_lba_nwa(o->drive, opts, 0, &lba, &nwa);
if(ret<=0)
return(ret);
*msc2= nwa;
}
return(1);
}
void isoburn_disc_write(struct burn_write_opts *opts, struct burn_disc *disc)
{
int ret;
@ -925,7 +942,8 @@ int isoburn_report_iso_error(int iso_error_code, char msg_text[], int os_errno,
/* @param flag bit0-7: info return mode
0= do not return anything in info (do not even touch it)
1= return volume id
1= copy volume id to info (info needs 33 bytes)
2= do not touch info (caller will copy 64 kB header to it)
bit14= -reserved -
bit15= -reserved-
@return 1 seems to be a valid ISO image , 0 format not recognized, <0 error
@ -954,6 +972,8 @@ int isoburn_read_iso_head_parse(struct burn_drive *d, unsigned char *data,
break;
else
info[i]= 0;
} else if(info_mode==2) {
;
} else {
isoburn_msgs_submit(NULL, 0x00060000,
"Program error: Unknown info mode with isoburn_read_iso_head()",
@ -967,7 +987,9 @@ int isoburn_read_iso_head_parse(struct burn_drive *d, unsigned char *data,
/* API
@param flag bit0-7: info return mode
0= do not return anything in info (do not even touch it)
1= return volume id
1= copy volume id to info (info needs 33 bytes)
2= copy 64 kB header to info (needs 65536 bytes)
bit13= do not read head from media but use first 64 kB from info
bit14= check both half buffers (not only second)
return 2 if found in first block
bit15= return-1 on read error
@ -978,25 +1000,31 @@ int isoburn_read_iso_head(struct burn_drive *d, int lba,
int *image_blocks, char *info, int flag)
{
unsigned char buffer[64*1024];
int ret;
int ret, info_mode;
off_t data_count;
info_mode= flag&255;
*image_blocks= 0;
ret = burn_read_data(d, ((off_t) lba) * (off_t) 2048, (char *) buffer,
if(flag&(1<<13)) {
memcpy(buffer, info, 64*1024);
} else {
ret = burn_read_data(d, ((off_t) lba) * (off_t) 2048, (char *) buffer,
(off_t) 64*1024, &data_count, 2); /* no error messages */
if(ret<=0)
return(-1*!!(flag&(1<<15)));
if(ret<=0)
return(-1*!!(flag&(1<<15)));
if(info_mode==2)
memcpy(info, buffer, 64*1024);
}
if(flag&(1<<14)) {
ret= isoburn_read_iso_head_parse(d, buffer, image_blocks, info,
flag&255);
ret= isoburn_read_iso_head_parse(d, buffer, image_blocks, info, info_mode);
if(ret<0)
return(ret);
if(ret>0)
return(2);
}
ret= isoburn_read_iso_head_parse(d, buffer+32*1024, image_blocks, info,
flag&255);
info_mode);
return(ret);
}
@ -1008,7 +1036,7 @@ int isoburn_read_iso_head(struct burn_drive *d, int lba,
int isoburn_emulate_toc(struct burn_drive *d, int flag)
{
int ret, image_size= 0, lba, track_blocks, session_count= 0, read_flag= 0;
int scan_start= 0, scan_count= 0;
int scan_start= 0, scan_count= 0, probe_minus_16= 0, growisofs_nwa;
struct isoburn *o;
struct isoburn_toc_entry *item;
char msg[160], size_text[80], *sev;
@ -1045,7 +1073,22 @@ int isoburn_emulate_toc(struct burn_drive *d, int flag)
}
read_flag= 0;
if(flag&2)
read_flag= (1<<15)|((session_count>0)<<14);
read_flag|= (1<<15)|((session_count>0)<<14);
else {
/* growisofs aligns to 16 rather than 32. Overwriteable TOC emulation
relies on not accidentially seeing inter-session trash data.
But one can safely access 16 blocks earlier because a xorriso header
would have overwritten with the unused 16 blocks at its start.
If libisoburn alignment would increase, then this would not be
possible any more.
*/
if(probe_minus_16)
read_flag|= (1<<14);
probe_minus_16= 0;
}
ret= isoburn_read_iso_head(d, lba, &track_blocks, NULL, read_flag);
if(ret<=0) {
if(session_count>0) {
@ -1084,9 +1127,16 @@ int isoburn_emulate_toc(struct burn_drive *d, int flag)
item->start_lba= lba;
item->track_blocks= track_blocks;
lba+= track_blocks;
/* growisofs aligns to 16 rather than 32 */
growisofs_nwa= lba;
if(growisofs_nwa % 16)
growisofs_nwa+= 16 - (growisofs_nwa % 16);
if(lba % Libisoburn_nwa_alignemenT)
lba+= Libisoburn_nwa_alignemenT - (lba % Libisoburn_nwa_alignemenT);
scan_start= lba;
if(lba - growisofs_nwa == 16)
probe_minus_16= 1;
}
if(last_pacifier != start_time)
sev= "UPDATE";
@ -1399,6 +1449,8 @@ int isoburn_drive_set_msgs_submit(struct burn_drive *d,
}
/* @param flag bit0= with adr_mode 3: adr_value might be 16 blocks too high
*/
int isoburn_set_msc1(struct burn_drive *d, int adr_mode, char *adr_value,
int flag)
{
@ -1470,7 +1522,12 @@ not_found:;
} else if(adr_mode==3) {
o->fabricated_msc1= adr_num;
if((flag & 1) && o->fabricated_msc1 >= 16) {
/* adr_num is possibly 16 blocks too high */
ret= isoburn_read_iso_head(d, o->fabricated_msc1, &size,volid, 1|(1<<14));
if(ret==2)
o->fabricated_msc1-= 16;
}
} else if(adr_mode==4) {
/* search for volume id that is equal to adr_value */
best_lba= -1;

View File

@ -85,6 +85,19 @@ int ds_read_block(IsoDataSource *src, uint32_t lba, uint8_t *buffer)
icd = (struct isoburn_cached_drive *) src->data;
d = (struct burn_drive*) icd->drive;
if(d == NULL) {
/* This would happen if libisoburn saw output data in the fifo and
performed early drive release and afterwards libisofs still tries
to read data.
That would constitute a bad conceptual problem in libisoburn.
*/
isoburn_msgs_submit(NULL, 0x00060000,
"Programming error: Drive released while libisofs still attempts to read",
0, "FATAL", 0);
return ISO_ASSERT_FAILURE;
}
tiles = (struct isoburn_cache_tile *) icd->tiles;
aligned_lba= lba & ~(Libisoburn_tile_blockS - 1);
@ -189,6 +202,19 @@ static void ds_free_data(IsoDataSource *src)
src->data= NULL;
}
int isoburn_data_source_shutdown(IsoDataSource *src, int flag)
{
struct isoburn_cached_drive *icd;
if(src==NULL)
return(0);
icd= (struct isoburn_cached_drive *) src->data;
icd->drive= NULL;
return(1);
}
IsoDataSource *isoburn_data_source_new(struct burn_drive *d)
{
IsoDataSource *ret;

View File

@ -119,6 +119,7 @@ int isoburn_new(struct isoburn **objpt, int flag)
o->drive= NULL;
o->emulation_mode= 0;
o->fabricated_msc1= -1;
o->fabricated_msc2= -1;
o->zero_nwa= Libisoburn_overwriteable_starT;
o->min_start_byte= o->zero_nwa * 2048;
o->nwa= o->zero_nwa;
@ -130,6 +131,7 @@ int isoburn_new(struct isoburn **objpt, int flag)
for(i=0;i<Libisoburn_target_head_sizE;i++)
o->target_iso_head[i]= 0;
o->image= NULL;
o->iso_data_source= NULL;
o->read_pacifier= NULL;
o->read_pacifier_handle= NULL;
o->msgs_submit= NULL;
@ -175,7 +177,8 @@ int isoburn_destroy(struct isoburn **objpt, int flag)
isoburn_toc_entry_destroy(&(o->toc), 1); /* all */
if(o->iso_source!=NULL)
burn_source_free(o->iso_source);
if(o->iso_data_source!=NULL)
iso_data_source_unref(o->iso_data_source);
free((char *) o);
*objpt= NULL;
return(1);
@ -334,10 +337,14 @@ int isoburn_msgs_submit(struct isoburn *o, int error_code, char msg_text[],
}
/* @param flag bit0= modifying rather than growing
bit1= prepare for early release of input drive:
wait until input and then disable image data source
*/
static
int isoburn_prepare_disc_aux(struct burn_drive *in_d, struct burn_drive *out_d,
struct burn_disc **disc,
struct isoburn_imgen_opts *opts, int new_img)
struct isoburn_imgen_opts *opts, int flag)
{
struct burn_source *wsrc;
struct burn_session *session;
@ -345,7 +352,18 @@ int isoburn_prepare_disc_aux(struct burn_drive *in_d, struct burn_drive *out_d,
struct isoburn *in_o, *out_o;
IsoWriteOpts *wopts= NULL;
enum burn_disc_status state;
int ret, fifo_chunks, lba, nwa;
int ret, fifo_chunks, lba, nwa, i, new_img, early_indev_release;
size_t buffer_size= 0, buffer_free= 0;
char msg[160];
new_img= flag&1;
early_indev_release= flag&2;
if(new_img && early_indev_release) {
isoburn_msgs_submit(in_o, 0x00060000,
"Programming error: Wrong session setup: new_img && early_indev_release",
0, "FATAL", 0);
{ret= -4; goto ex;}
}
ret= isoburn_find_emulator(&in_o, in_d, 0);
if(ret<0 || in_o==NULL)
@ -404,22 +422,16 @@ int isoburn_prepare_disc_aux(struct burn_drive *in_d, struct burn_drive *out_d,
iso_write_opts_set_default_gid(wopts, opts->gid);
iso_write_opts_set_output_charset(wopts, opts->output_charset);
iso_write_opts_set_fifo_size(wopts, fifo_chunks);
ret = isoburn_disc_track_lba_nwa(out_d, NULL, 0, &lba, &nwa);
opts->effective_lba= nwa;
ret= isoburn_get_msc2(out_o, NULL, &nwa, 0);
if (ret != 1) {
isoburn_msgs_submit(out_o, 0x00060000,
"Cannot determine next writeable address", 0, "FAILURE", 0);
{ret= -3; goto ex;}
}
if (nwa == 0 && state == BURN_DISC_APPENDABLE) {
isoburn_msgs_submit(out_o, 0x00060000,
"Encountered 0 as next writeable address of appendable",
0, "FAILURE", 0);
{ret= -4; goto ex;}
}
iso_write_opts_set_ms_block(wopts, nwa);
opts->effective_lba= nwa;
iso_write_opts_set_appendable(wopts, !new_img);
iso_write_opts_set_overwrite_buf(wopts,
nwa>0 ? out_o->target_iso_head : NULL);
@ -429,6 +441,30 @@ int isoburn_prepare_disc_aux(struct burn_drive *in_d, struct burn_drive *out_d,
isoburn_report_iso_error(ret, "Cannot create burn source", 0, "FAILURE", 0);
{ret= -1; goto ex;}
}
if (early_indev_release) {
for(i= 0; i<300; i++) {
/* <<< ??? */
if((i%30) == 0) {
sprintf(msg, "Waiting for data in fifo since %d seconds", i/30);
isoburn_msgs_submit(in_o, 0x00060000, msg, 0, "DEBUG", 0);
}
usleep(100000);
ret= iso_ring_buffer_get_status(wsrc, &buffer_size, &buffer_free);
if(ret >0 && buffer_size != buffer_free)
break;
}
/* <<< ??? */
sprintf(msg,
"After %.1f seconds: %d bytes of output available (fifo state=%d)",
((double) i+1) / 10.0, (int) (buffer_size - buffer_free), ret);
isoburn_msgs_submit(in_o, 0x00060000, msg, 0, "DEBUG", 0);
if(in_o->iso_data_source!=NULL)
isoburn_data_source_shutdown(in_o->iso_data_source, 0);
}
/* TODO check return values for failure. propertly clean-up on error */
@ -474,6 +510,30 @@ int isoburn_prepare_new_image(struct burn_drive *d, struct burn_disc **disc,
}
/* API since 0.2.2 */
int isoburn_prepare_blind_grow(struct burn_drive *d, struct burn_disc **disc,
struct isoburn_imgen_opts *opts,
struct burn_drive *out_drive, int nwa)
{
int ret;
struct isoburn *o= NULL;
ret= isoburn_find_emulator(&o, out_drive, 0);
if(ret<0 || o==NULL)
return(-1);
if(nwa >= 0)
o->fabricated_msc2= nwa;
if(o->nwa == o->zero_nwa)
o->nwa= o->zero_nwa= 0;
else
o->zero_nwa= 0;
ret= isoburn_prepare_disc_aux(d, out_drive, disc, opts, 2);
if (ret<=0)
return ret;
return(1);
}
/* API @since 0.1.0
@param flag bit0= this is a regular end, not an abort
give up source reference

View File

@ -60,9 +60,17 @@ struct isoburn {
*/
int fabricated_msc1;
/* If >= 0, this address is used in isoburn_disc_track_lba_nwa()
as reply parameter nwa.
(The other nwa parameters below apply only to the effective write address
on random access media. msc2 is handed to libisofs but not to libburn.)
*/
int fabricated_msc2;
/* The nwa to be used for a first session on the present kind of overwriteable
media (usually Libisoburn_overwriteable_starT, but might be forced to 0)
*/
*/
int zero_nwa;
/* Start address as given by image examination (bytes, not blocks) */
@ -71,6 +79,7 @@ struct isoburn {
/* Aligned start address to be used for processing (counted in blocks) */
int nwa;
/* Truncate to .nwa an eventual regular file serving as output drive */
int truncate;
@ -99,6 +108,10 @@ struct isoburn {
/* Libisofs image context */
IsoImage *image;
/* The block data source from which the existing image is read.
*/
IsoDataSource *iso_data_source;
/* The burn source which transfers data from libisofs to libburn.
It has its own fifo.
*/
@ -190,6 +203,19 @@ int isoburn_msgs_submit(struct isoburn *o, int error_code, char msg_text[],
*/
int isoburn_set_start_byte(struct isoburn *o, off_t value, int flag);
/** Obtains the image address offset to be used with image generation.
This is either the (emulated) drive nwa or a value set by
isoburn_prepare_blind_grow().
In any case this is the address to tell to iso_write_opts_set_ms_block().
@param o The isoburn object to be inquired
@param opts If not NULL: write parameters to be set on drive before query
@param msc2 The value to be used with iso_write_opts_set_ms_block()
@param flag unused yet
@return <=0 is failure , >0 success
*/
int isoburn_get_msc2(struct isoburn *o,
struct burn_write_opts *opts, int *msc2, int flag);
/** Get a data source suitable for read from a drive using burn_read_data()
function.
@param d drive to read from. Must be grabbed.
@ -200,6 +226,19 @@ int isoburn_set_start_byte(struct isoburn *o, off_t value, int flag);
IsoDataSource *
isoburn_data_source_new(struct burn_drive *d);
/** Disable read capabilities of a data source which was originally created
by isoburn_data_source_new(). After this any attempt to read will yield
a FATAL programming error event.
This is usually done to allow libburn to release the drive while libisofs
still holds a reference to the data source object. libisofs is not supposed
to use this object for reading any more, nevertheless. The disabled state
of the data source is a safety fence around this daring situation.
@param src The data source to be disabled
@param flag unused yet
@return <=0 is failure , >0 success
*/
int isoburn_data_source_shutdown(IsoDataSource *src, int flag);
/**
* Options for image reading.

View File

@ -212,6 +212,9 @@ create_blank_image:;
*/
ds = isoburn_data_source_new(d);
if(o->iso_data_source!=NULL)
iso_data_source_unref(o->iso_data_source);
o->iso_data_source= ds;
iso_image_attach_data(o->image, o->read_pacifier_handle,
isoburn_idle_free_function);
if(o->read_pacifier_handle==NULL)
@ -221,7 +224,7 @@ create_blank_image:;
ret = iso_image_import(o->image, ds, ropts, &features);
iso_tree_set_report_callback(o->image, NULL);
iso_read_opts_free(ropts);
iso_data_source_unref(ds);
if (ret < 0) {
isoburn_report_iso_error(ret, "Cannot import image", 0, "FAILURE", 0);
return ret;
@ -277,6 +280,8 @@ int isoburn_activate_session(struct burn_drive *drive)
if (o->emulation_mode != 1)
return 1; /* don't need to activate session */
if (o->fabricated_msc2 >= 0)
return 1; /* blind growing: do not alter anything outside the session */
if (!(o->fabricated_disc_status == BURN_DISC_APPENDABLE ||
(o->fabricated_disc_status == BURN_DISC_BLANK &&

View File

@ -75,23 +75,35 @@ job parameters. It rather states its desires which libisoburn tries to
fulfill, or else will refuse to start the write run.
Setup for Growing or Modifying
Setup for Growing, Modifying or Blind Growing
The connector function family offers two alternative API calls for performing
the setup for two alternative image generation strategies.
The connector function family offers alternative API calls for performing
the setup for several alternative image generation strategies.
Growing:
If input and output drive is the same, then isoburn_prepare_disc() is to
If input and output drive are the same, then isoburn_prepare_disc() is to
be used. It will lead to an add-on session on appendable or overwriteable
media with existing ISO image. With blank media it will produce a first
session.
Modifying:
If the output drive is not the input drive, then it has to bear blank media
or overwriteable without a valid ISO image. To prepare for such an image
generation run, use isoburn_prepare_new_image(). The run will copy file data
from an eventual input drive with valid image, add any newly introduced data
from the local filesystem, and produce a first session on output media.
If the output drive is not the input drive, and if it bears blank media
or overwriteable without a valid ISO image, then one may produce a consolidated
image with old and new data. This will copy file data from an eventual input
drive with valid image, add any newly introduced data from the local
filesystem, and produce a first session on output media.
To prepare for such an image generation run, use isoburn_prepare_new_image().
Blind Growing:
This method reads the old image from one drive and writes the add-on session
to a different drive. That output drive is nevertheless supposed to
finally lead to the same media from where the session was loaded. Usually it
will be stdio:/dev/fd/1 (i.e. stdout) being piped into some burn program
like with this classic gesture:
mkisofs -M $dev -C $msc1,$nwa | cdrecord -waiti dev=$dev
Blind growing is prepared by the call isoburn_prepare_blind_grow().
The input drive should be released immediately after this call in order
to allow the consumer of the output stream to access that drive for writing.
After either of these setups, some peripheral libburn drive parameter settings
like burn_write_opts_set_simulate(), burn_write_opts_set_multi(),
@ -195,8 +207,8 @@ void isoburn_version(int *major, int *minor, int *micro);
@since 0.1.0
*/
#define isoburn_libburn_req_major 0
#define isoburn_libburn_req_minor 4
#define isoburn_libburn_req_micro 8
#define isoburn_libburn_req_minor 5
#define isoburn_libburn_req_micro 0
/** The minimum version of libisofs to be used with this version of libisoburn
@ -232,7 +244,7 @@ int isoburn_libburn_req(int *major, int *minor, int *micro);
*/
#define isoburn_header_version_major 0
#define isoburn_header_version_minor 2
#define isoburn_header_version_micro 0
#define isoburn_header_version_micro 2
/** Note:
Above version numbers are also recorded in configure.ac because libtool
wants them as parameters at build time.
@ -421,7 +433,7 @@ int isoburn_disc_erasable(struct burn_drive *d);
void isoburn_disc_erase(struct burn_drive *drive, int fast);
/** Program isoburn_disc_get_msc1() to return a fabricated value.
/** Set up isoburn_disc_get_msc1() to return a fabricated value.
This makes only sense between aquiring the drive and reading the
image. After isoburn_read_image() it will confuse the coordination
of libisoburn and libisofs.
@ -438,7 +450,11 @@ void isoburn_disc_erase(struct burn_drive *drive, int fast);
4= start lba of last session with volume id
given by adr_value
@parm adr_value A string describing the value to be eventually used.
@param flag Bitfield for control purposes. Unused yet. Submit 0.
@param flag Bitfield for control purposes.
bit0= @since 0.2.2
with adr_mode 3: adr_value might be 16 blocks too high
(e.g. -C stemming from growisofs). Probe for ISO head
at adr_value-16 and eventually adjust setting.
*/
int isoburn_set_msc1(struct burn_drive *d, int adr_mode, char *adr_value,
int flag);
@ -558,7 +574,7 @@ void isoburn_toc_track_get_entry(struct isoburn_toc_track *t,
void isoburn_toc_disc_free(struct isoburn_toc_disc *disc);
/** Try whether at the data at the given address look like a ISO 9660
/** Try whether the data at the given address look like a ISO 9660
image header and obtain its alleged size. Depending on the info mode
one other string of text information can be retrieved too.
@since 0.1.6
@ -567,9 +583,16 @@ void isoburn_toc_disc_free(struct isoburn_toc_disc *disc);
@param image_blocks The number of 2048 bytes blocks
@param info Caller provided memory, enough to take eventual info reply
@param flag bit0-7: info return mode
0= do not return anything in info (do not even touch it)
1= return volume id (info needs 33 bytes)
@return 1 seems to be a valid ISO image , 0 format not recognized, <0 error
0= do not return anything in info (do not even touch it)
1= copy volume id to info (info needs 33 bytes)
2= @since 0.2.2 :
copy 64 kB header to info (needs 65536 bytes)
bit13= @since 0.2.2:
do not read head from media but use first 64 kB from info
bit14= check both half buffers (not only second)
return 2 if found in first block
bit15= return-1 on read error
@return >0 seems to be a valid ISO image, 0 format not recognized, <0 error
*/
int isoburn_read_iso_head(struct burn_drive *d, int lba,
int *image_blocks, char *info, int flag);
@ -1031,6 +1054,9 @@ off_t isoburn_disc_available_space(struct burn_drive *d,
case of random access media this will always be 0. Succesfull return is
not a guarantee that there is a ISO-9660 image at all. The call will fail,
nevertheless,if isoburn_disc_get_status() returns not BURN_DISC_APPENDABLE.
Note: The result of this call may be fabricated by a previous call of
isoburn_set_msc1() which can override the rule to load the most recent
session.
Wrapper for: burn_disc_get_msc1()
@since 0.1.0
@param d The drive to inquire
@ -1068,7 +1094,8 @@ int isoburn_get_min_start_byte(struct burn_drive *d, off_t *start_byte,
int flag);
/** Create a disc object for writing the new session from the created or loaded
/** To choose the expansion method of Growing:
Create a disc object for writing the new session from the created or loaded
iso_volset which has been manipulated via libisofs, to the same media from
where the image was eventually loaded. This struct burn_disc is ready for
use by a subsequent call to isoburn_disc_write().
@ -1085,9 +1112,10 @@ int isoburn_prepare_disc(struct burn_drive *drive, struct burn_disc **disc,
struct isoburn_imgen_opts *opts);
/** Create a disc object for producing a new image from a previous image
/** To choose the expansion method of Modifying:
Create a disc object for producing a new image from a previous image
plus the changes made by user. The generated burn_disc is suitable
to be written to any grabbed libburn drive with blank writeable media.
to be written to a grabbed drive with blank writeable media.
But you must not use the same drive for input and output, because data
will be read from the source drive while at the same time the target
drive is already writing.
@ -1095,15 +1123,11 @@ int isoburn_prepare_disc(struct burn_drive *drive, struct burn_disc **disc,
is done and the drive is BURN_DRIVE_IDLE again after asynchronous
burn_disc_write().
@since 0.1.0
@param in_drive The input drive,grabbed with isoburn_drive_scan_and_grab().
@param in_drive The input drive, grabbed with isoburn_drive_aquire() or
one of its alternatives.
@param disc Returns the newly created burn_disc object.
@param opts Options for image generation and data transport to media.
@param out_drive The libburn drive which shall be write target.
If the drive was grabbed via libisoburn then it can later
access the libisofs source fifo via
isoburn_get_fifo_status().
Mere libburn drives cannot obtain this info.
In that case out_drive may be NULL, as well.
@param out_drive The output drive, from isoburn_drive_aquire() et.al..
@return <=0 error , 1 = success
*/
int isoburn_prepare_new_image(struct burn_drive *in_drive,
@ -1111,7 +1135,52 @@ int isoburn_prepare_new_image(struct burn_drive *in_drive,
struct isoburn_imgen_opts *opts,
struct burn_drive *out_drive);
/** @since 0.1.0
/** To choose the expansion method of Blind Growing:
Create a disc object for writing an add-on session from the created or
loaded IsoImage which has been manipulated via libisofs, to a different
drive than the one from where it was loaded.
Usually output will be stdio:/dev/fd/1 (i.e. stdout) being piped
into some burn program like with this classic gesture:
mkisofs -M $dev -C $msc1,$nwa | cdrecord -waiti dev=$dev
Parameter translation into libisoburn:
$dev is the address by which parameter in_drive of this call was aquired
$msc1 was set by isoburn_set_msc1() before image reading
or was detected from the in_drive media
$nwa is a parameter of this call
or can be used as detected from the in_drive media
This call waits for libisofs output to become available and then detaches
the input drive object from the data source object by which libisofs was
reading from the input drive.
So, as far as libisofs is concerned, that drive may be released immediately
after this call in order to allow the consumer to access the drive for
writing.
The consumer should wait for input to become available and only then open
its burn drive. With cdrecord this is caused by option -waiti.
The resulting burn_disc object has to be disposed when all its writing
is done and the drive is BURN_DRIVE_IDLE again after asynchronous
burn_disc_write().
@since 0.2.2
@param in_drive The input drive,grabbed with isoburn_drive_scan_and_grab().
@param disc Returns the newly created burn_disc object.
@param opts Options for image generation and data transport to media.
@param out_drive The output drive, from isoburn_drive_aquire() et.al..
typically stdio:/dev/fd/1 .
@param nwa The address (2048 byte block count) where the add-on
session will be finally stored on a mountable media
or in a mountable file.
If nwa is -1 then the address is used as determined from
the in_drive media.
@return <=0 error , 1 = success
*/
int isoburn_prepare_blind_grow(struct burn_drive *d, struct burn_disc **disc,
struct isoburn_imgen_opts *opts,
struct burn_drive *out_drive, int nwa);
/**
Revoke isoburn_prepare_new_image() or isoburn_prepare_disc() instead of
running isoburn_disc_write().
libisofs reserves resources and maybe already starts generating the
@ -1193,8 +1262,7 @@ int isoburn_drive_wrote_well(struct burn_drive *d);
int isoburn_activate_session(struct burn_drive *drive);
/** @since 0.1.0
Wait after normal end of operations until libisofs ended all write
/** Wait after normal end of operations until libisofs ended all write
threads and freed resource reservations.
This call is not mandatory. But without it, messages from the ending
threads might appear after the application ended its write procedure.
@ -1210,21 +1278,6 @@ int isoburn_sync_after_write(struct burn_drive *input_drive,
struct burn_drive *output_drive, int flag);
#if 0
/* >>> NOT YET IMPLEMENTED <<< */
/** Write a new session to a disc.
This is a synchronous call equivalent to isoburn_prepare_disc +
isoburn_disc_write + isoburn_activate_session
@param pacifier_func If not NULL: a function to produce appeasing messages.
See burn_abort_pacifier() in libburn.h for an example.
*/
/* TODO implement this */
int isoburn_perform_write(struct burn_write_opts *o,
int (*pacifier_func)(void *handle, int patience,
int elapsed));
#endif /* 0 */
/** Release an aquired drive.
Wrapper for: burn_drive_release()
@since 0.1.0

View File

@ -4,7 +4,7 @@
xorriso. By Thomas Schmitt <scdbackup@gmx.net>
Integrated sub project of libburnia-project.org but also published via:
http://scdbackup.sourceforge.net/xorriso_eng.html
http://scdbackup.sourceforge.net/xorriso-0.2.0.pl00.tar.gz
http://scdbackup.sourceforge.net/xorriso-0.2.2.pl00.tar.gz
Copyright (C) 2006-2008 Thomas Schmitt, provided under GPL version 2.
------------------------------------------------------------------------------
@ -36,10 +36,10 @@ The tarball contains anything that is needed except libc and libpthread.
libreadline and the readline-dev headers will make dialog mode more convenient,
but are not mandatory.
Obtain xorriso-0.2.0.pl00.tar.gz, take it to a directory of your choice and do:
Obtain xorriso-0.2.2.pl00.tar.gz, take it to a directory of your choice and do:
tar xzf xorriso-0.2.0.pl00.tar.gz
cd xorriso-0.2.0
tar xzf xorriso-0.2.2.pl00.tar.gz
cd xorriso-0.2.2
Within that directory execute:
@ -69,6 +69,11 @@ It gets installed with "make install" but may also be placed manually in the
./man1 directory below one of the directories mentioned in environment
variable $MANPATH.
The installation creates several alias links pointing to the xorriso binary:
xorrisofs starts xorriso with -as mkisofs emulation already enabled
xorrecord starts xorriso with -as cdrecord emulation already enabled
osirrox starts with -osirrox image-to-disk copying already enabled
Drives and Disk File Objects
@ -161,8 +166,8 @@ and a matching dynamically linked xorriso binary.
This binary is leaner but depends on properly installed libraries of suitable
revision.
Dynamic library and compile time header requirements for libisoburn-0.2.0 :
- libburn.so.4 , version libburn-0.4.8 or higher
Dynamic library and compile time header requirements for libisoburn-0.2.2 :
- libburn.so.4 , version libburn-0.5.0 or higher
- libisofs.so.6 , version libisofs-0.6.6 or higher
libisoburn and xorriso will not start with libraries which are older than their
headers seen at compile time. So compile in the oldest possible installation

View File

@ -2951,7 +2951,7 @@ Corrected mistake in xorriso man page
xorriso/xorriso.c
Removed duplicated help text snippet
22 Jun 2008 [1783]
2008.06.22.090001 [1873]
configure.ac
README
libisoburn/libisoburn.h
@ -2964,7 +2964,7 @@ xorriso/make_xorriso_standalone.sh
xorriso/configure_ac.txt
Version leap to 0.2.0
[]
22 Jun 2008 [1874]
xorriso/changelog.txt
Documented changes and release timestamp
@ -2976,10 +2976,349 @@ Documented changes and release timestamp
* New options -map_l, -compare_l, -update_l, -extract_l
* New API functions isoburn_set_msgs_submit(), isoburn_drive_set_msgs_submit()
2008.06.22.111236 [1875]
xorriso/xorriso.c
Removed duplicated help text snippet
2008.06.22.135202 [1876]
configure.ac
README
libisoburn/libisoburn.h
xorriso/README
xorriso/xorriso_timestamp.h
xorriso/xorriso_private.h
xorriso/xorrisoburn.h
xorriso/xorriso_eng.html
xorriso/make_xorriso_standalone.sh
xorriso/configure_ac.txt
Version leap to 0.2.1
22 Jun 2008 [1877]
xorriso/changelog.txt
Documented changes and release timestamp
------------------------------------ cycle - xorriso-0.2.1 - 2008.06.22.135202
------------------------------------ cycle - xorriso-0.2.1 -
------------------------------------ cycle - xorriso-0.2.1 -
2008.06.27.124201 [1880]
xorriso/xorrisoburn.c
Bug fix: -as cdrecord -atip falsely announced overwriteable DVD-RW to sdvdbackup
2008.06.27.130235 [1881]
xorriso/xorriso.c
Extended -as cdrecord blank= by blank type format_overwrite
------------------------------------ cycle - xorriso-0.2.1 - 2008.06.27.130235
2008.07.03.133023 [1882]
xorriso/xorriso.c
Flushing stdout after each result text to deconfuse stdout/stderr with SSH
2008.07.04.070001 [1884]
xorriso/xorriso.c
Supporting option -as cdrecord -waiti
2008.07.05.132528 [1885]
libisoburn/libisoburn.h
libisoburn/isoburn.h
libisoburn/isoburn.c
libisoburn/isofs_wrap.c
libisoburn/burn_wrap.c
libisoburn/data_source.c
New API function isoburn_prepare_blind_grow() for -as mkisofs -multi
2008.07.05.133721 [1886]
xorriso/xorriso_private.h
xorriso/xorriso.c
xorriso/xorrisoburn.c
xorriso/xorriso.1
New option -grow_blindly
2008.07.05.180241 [1887]
libisoburn/isoburn.c
Fixed a bug with -grow_blindly to overwriteable media
2008.07.05.182424 [1888]
xorriso/xorriso.h
xorriso/xorriso.c
xorriso/xorriso.1
New options -C and -M for -as mkisofs
2008.07.05.184434 [1889]
xorriso/xorriso.c
Cared for a peculiarity of growisofs when using mkisofs -C
5 Jul 2008 [1890]
xorriso/xorriso_eng.html
Updated xorriso homepage
------------------------------------ cycle - xorriso-0.2.1 - 2008.07.05.184434
* New API function isoburn_prepare_blind_grow()
* New option -grow_blindly
* New options -C and -M for -as mkisofs emulation
2008.07.06.110336 [1891]
xorriso/xorriso.c
xorriso/xorrisoburn.h
xorriso/xorrisoburn.c
Improved effective drive address with -as mkisofs -M
2008.07.07.095531 [1892]
xorriso/xorriso.c
Fixed bug about -as mkisofs without -C
2008.07.07.102941 [1893]
xorriso/xorriso.h
xorriso/xorriso_private.h
xorriso/xorriso.c
Semi-permanent emulation by start names xorrisofs,genisofs,mkisofs,genioimage
------------------------------------ cycle - xorriso-0.2.1 - 2008.07.07.102941
2008.07.07.150241 [1894]
xorriso/xorriso.c
Correction about -as mkisofs -C if already an input device was set
2008.07.07.150337 [1895]
libisoburn/isoburn.c
Correction about isoburn_igopt_get_effective_lba() with blind growing
7 Jul 2008 [1896]
xorriso/xorriso.1
Clarification about -grow_blindly predicted_nwa
2008.07.07.150337 [1897]
xorriso/xorriso.c
xorriso/xorriso.1
Made leafname triggered emulation more similar to -as emulation
2008.07.08.092732 [1898]
Makefile.am
README
xorriso/xorriso_makefile_am.txt
xorriso/README
Installing softlinks xorrisofs and osirrox pointing to the xorriso binary
2008.07.08.102622 [1899]
xorriso/xorriso_private.h
Header file forgotten with rev 1897
2008.07.08.132054 [1900]
xorriso/xorriso.c
xorriso/xorrisoburn.c
Avoided misleading message about emptied ISO image during -as mkisofs -C
8 Jul 2008 [1901]
xorriso/xorriso_eng.html
Documented newest progress
------------------------------------ cycle - xorriso-0.2.1 - 2008.07.08.132054
* Can serve growisofs if started as xorrisofs, genisofs, mkisofs, genisoimage
* make install creates xorriso aliases as symbolic links: osirrox, xorrisofs
2008.07.09.055133 [1901]
xorriso/xorriso.c
Avoided to use MMC code with -as mkisofs -M by prepending stdio: to address
2008.07.09.055133 [1902]
xorriso/xorriso.h
xorriso/xorriso.c
Fixed bug with -as mkisofs -x and pattern expansion
------------------------------------ cycle - xorriso-0.2.1 - 2008.07.09.055133
2008.07.09.155540 [1903]
Makefile.am
xorriso/xorriso_private.h
+ xorriso/xorriso_buildstamp.h
+ xorriso/xorriso_buildstamp_none.h
xorriso/xorriso_makefile_am.txt
xorriso/make_xorriso_standalone.sh
Opportunity to generate build timestamp via make buildstamped
9 Jul 2008 [1904]
xorriso/xorriso_makefile_am.txt
Completed (unused) dist rule of standalone-xorriso
2008.07.10.141731 [1905]
xorriso/xorriso.c
xorriso/xorrisoburn.h
xorriso/xorrisoburn.c
xorriso/xorriso.1
Enabled -multi and -msinfo with -as cdrecord
2008.07.10.141913 [1906]
libisoburn/libisoburn.h
Small correction in API introduction text
2008.07.10.144535 [1907]
xorriso/xorriso_private.h
Header file forgotten with rev 1903
2008.07.10.162809 [1908]
xorriso/xorriso_private.h
xorriso/xorriso.c
xorriso/xorriso.1
cdrecord emulation by start names xorrecord, cdrecord, wodim, cdrskin
2008.07.10.164015 [1909]
xorriso/xorriso.c
Reacted on compiler warning
2008.07.10.164412 [1910]
Makefile.am
README
xorriso/xorriso_makefile_am.txt
xorriso/README
Installing softlink xorrecord pointing to the xorriso binary
10 Jul 2008 [1911]
xorriso/xorriso.1
xorriso/xorriso_eng.html
xorriso/convert_man_to_html.sh
Some documentation updates
------------------------------------ cycle - xorriso-0.2.1 - 2008.07.10.164412
* New options -multi and -msinfo for -as cdrecord emulation
* make install creates xorriso alias as symbolic link: xorrecord
2008.07.12.181846 [1912]
libisoburn/libisoburn.h
libisoburn/burn_wrap.c
New info mode 2 with isoburn_read_iso_head()
2008.07.12.184833 [1913]
xorriso/xorriso.c
xorriso/xorrisoburn.h
xorriso/xorrisoburn.c
xorriso/xorriso.1
New options --grow_overwriteable_iso and write_start_address= with -as cdrecord
2008.07.14.114515 [1918]
libisoburn/libisoburn.h
Required libburn version is now 0.4.9
2008.07.14.114613 [1919]
configure.ac
Did LT_CURRENT++, LT_AGE++ which was forgotten with revision 1885
2008.07.14.120527 [1920]
libisoburn/libisoburn.h
libisoburn/burn_wrap.c
New flag options with isoburn_read_iso_head()
2008.07.14.125133 [1921]
xorriso/xorriso.c
xorriso/xorrisoburn.c
xorriso/xorriso.1
New option -isosize with -as cdrecord
14 Jul 2008 [1923]
xorriso/convert_man_to_html.sh
Small correction with a sed expression
2008.07.15.063040 [1924]
xorriso/xorriso_makefile_am.txt
Generating automatic build timestamp
2008.07.15.121754 [1925]
xorriso/xorriso.c
xorriso/xorrisoburn.h
xorriso/xorrisoburn.c
xorriso/xorriso.1
New option tsize= with -as cdrecord
------------------------------------ cycle - xorriso-0.2.1 - 2008.07.15.121754
* New options --grow_overwriteable_iso and write_start_address= with -as cdrecord
* New options -isosize and tsize= with -as cdrecord
2008.07.16.130711 [1933]
xorriso/xorriso.h
xorriso/xorriso_private.h
xorriso/xorriso.c
xorriso/xorrisoburn.c
xorriso/xorriso.1
New option -pacifier, more compatible pacifier with -as mkisofs
2008.07.16.130758 [1934]
xorriso/configure_ac.txt
Updated xorriso standalone configure.ac version number BURN_*_VERSION
2008.07.16.130841 [1935]
libisoburn/libisoburn.h
Required libburn version is now 0.5.0
2008.07.16.131110 [1936]
configure.ac
Required libburn version is now 0.5.0
2008.07.16.140043 [1937]
xorriso/xorriso.c
xorriso/xorriso.1
Recognizing "b" as speed factor for BD media
------------------------------------ cycle - xorriso-0.2.1 - 2008.07.16.140043
* New option -pacifier, more compatible pacifier with -as mkisofs
2008.07.17.110812 [1939]
libisoburn/libisoburn.h
libisoburn/burn_wrap.c
Ability to emulate a featured bug with mkisofs -C : read 16 block too early
2008.07.17.111411 [1940]
xorriso/xorriso.h
xorriso/xorriso.c
xorriso/xorrisoburn.c
xorriso/xorriso.1
Rectified usage of original xorriso options underneath growisofs
2008.07.17.183024 [1941]
libisoburn/burn_wrap.c
Recognizing growisofs follow-up sessions on xorriso overwriteables
2008.07.17.184520 [1942]
libisoburn/burn_wrap.c
xorriso/xorriso.c
xorriso/xorrisoburn.c
Removed MULTI construction site remarks
------------------------------------ cycle - xorriso-0.2.1 - 2008.07.17.184520
2008.07.18.120001 [1944]
configure.ac
README
libisoburn/libisoburn.h
xorriso/README
xorriso/xorriso_timestamp.h
xorriso/xorriso_private.h
xorriso/xorrisoburn.h
xorriso/xorriso_eng.html
xorriso/make_xorriso_standalone.sh
xorriso/configure_ac.txt
Version leap to 0.2.2
18 Jul 2008 []
xorriso/changelog.txt
Documented changes and release timestamp
---------------------------------- release - xorriso-0.2.2 - 2008.07.18.120001
* New API function isoburn_prepare_blind_grow()
* New option -grow_blindly
* Options -C and -M for -as mkisofs emulation
* Can serve growisofs if started as xorrisofs, genisofs, mkisofs, genisoimage
* make install creates aliases as symbolic links: osirrox, xorrisofs, xorrecord
* Options for -as cdrecord emulation: -multi, -msinfo, -isosize, tsize,
--grow_overwriteable_iso, write_start_address,
* New option -pacifier, more compatible pacifier with -as mkisofs
------------------------------------ cycle - xorriso-0.2.3 -
------------------------------------ cycle - xorriso-0.2.3 -
===============================================================================
@ -2990,12 +3329,11 @@ Documented changes and release timestamp
------------------------------------------------- important
------------------------------------------------- development
??? Clarify handling of links in ISO and on disk during restore
- mkisofs,cdrecord multi session
> Relative addressing and pattern matching :
iso_rr_pattern on
cd /u/FERTIG
@ -3033,9 +3371,22 @@ Documented changes and release timestamp
- Error code for libisoburn data source read errors.
- Proper reaction on severity of errors issued by data_source
(currently even a FATAL gets converted to ISO_FILE_READ_ERROR
in iso_stream_read())
- #define ISO_ERR_PRIO(e) ((e & 0x00700000) << 8)
(rather than 0x00F00000, see ticket 135)
- the error handling system should be comprehensively documented
and eventually rectified where needed.
- With softlink /X/YZ and Joliet enabled:
libisofs: HINT : Can't add YZ to Joliet tree. This kind of files can only be added to a Rock Ridget tree. Skipping.
HINT is not a suitable severity for this. Better: WARNING, SORRY, MISHAP
One should at least give the full path of /X/YZ or the type of the file.
------ feature enhancements :
- Data files >= 4 GiB.

View File

@ -1,4 +1,4 @@
AC_INIT([xorriso], [0.2.0], [http://libburnia-project.org])
AC_INIT([xorriso], [0.2.2], [http://libburnia-project.org])
AC_PREREQ([2.50])
dnl AC_CONFIG_HEADER([config.h])
@ -8,8 +8,8 @@ AC_CANONICAL_TARGET
AM_INIT_AUTOMAKE([subdir-objects])
BURN_MAJOR_VERSION=0
BURN_MINOR_VERSION=4
BURN_MICRO_VERSION=9
BURN_MINOR_VERSION=5
BURN_MICRO_VERSION=1
AC_SUBST(BURN_MAJOR_VERSION)
AC_SUBST(BURN_MINOR_VERSION)
AC_SUBST(BURN_MICRO_VERSION)

View File

@ -47,7 +47,7 @@ then
-e 's/have a look at section EXAMPLES/have a look at section <A HREF="#EXAMPLES">EXAMPLES<\/A>/' \
-e 's/<b>Session model:<\/b>/\&nbsp;<BR><b>Session model:<\/b>/' \
-e 's/<b>Media types and states:<\/b>/\&nbsp;<BR><b>Media types and states:<\/b>/' \
-e 's/<b>Creating, Growing, Modifying:<\/b>/\&nbsp;<BR><b>Creating, Growing, Modifying:<\/b>/' \
-e 's/<b>Creating, Growing, Modifying, Blind/\&nbsp;<BR><b>Creating, Growing, Modifying, Blind/' \
-e 's/<b>Libburn drives:<\/b>/\&nbsp;<BR><b>Libburn drives:<\/b>/' \
-e 's/^-dev /\&nbsp;\&nbsp;-dev /' \
-e 's/^-devices /\&nbsp;\&nbsp;-devices /' \

View File

@ -25,7 +25,7 @@
current_dir=$(pwd)
lone_dir="$current_dir"/"xorriso-standalone"
xorriso_rev=0.2.0
xorriso_rev=0.2.2
# For unstable uploads:
# xorriso_pl=""
# For stable releases:
@ -124,12 +124,17 @@ copy_files \
xorriso/xorrisoburn.[ch] \
xorriso/xorriso.[ch1] \
xorriso/xorriso_private.h \
\
xorriso/xorriso_timestamp.h \
\
xorriso/changelog.txt \
xorriso/xorriso_eng.html \
xorriso/man_1_xorriso.html \
"$lone_dir"/xorriso
copy_files xorriso/xorriso_buildstamp_none.h \
"$lone_dir"/xorriso/xorriso_buildstamp.h
create_dir "$lone_dir"/test
copy_files \
test/compare_file.c \

View File

@ -2,7 +2,7 @@
.\" First parameter, NAME, should be all caps
.\" Second parameter, SECTION, should be 1-8, maybe w/ subsection
.\" other parameters are allowed: see man(7), man(1)
.TH XORRISO 1 "Jun, 21, 2008"
.TH XORRISO 1 "Jul, 17, 2008"
.\" Please adjust this date whenever revising the manpage.
.\"
.\" Some roff macros, for reference:
@ -50,11 +50,10 @@ Changes file properties in the ISO image.
.br
Updates ISO subtrees incrementally to match given disk subtrees.
.br
Can write result as completely new image to optical media or
filesystem objects.
Writes result either as completely new image or as add-on session
to optical media or filesystem objects.
.br
Can write result as add-on session to appendable multi-session media,
to overwriteable media, to regular files, and to block devices.
Can perform multi-session tasks as emulation of mkisofs and cdrecord.
.br
Can restore files from ISO image to disk filesystem (see osirrox).
.br
@ -72,7 +71,7 @@ Session model
.br
Media types and states
.br
Creating, Growing, Modifying
Creating, Growing, Modifying, Blind Growing
.br
Libburn drives
.br
@ -121,7 +120,8 @@ filesystems. This expansion method is referred as emulated growing.
.PP
xorriso provides both ways of growing as well as an own method named
\fBmodifying\fR which produces a completely new ISO image from the old
one and the modifications. See paragraph Creating, Growing, Modifying below.
one and the modifications.
See paragraph Creating, Growing, Modifying, Blind Growing below.
.PP
xorriso adopts the concept of multi-session by loading an eventual image
directory tree, allowing to manipulate it by several actions, and to write
@ -196,7 +196,7 @@ contain unrecognizable data in the first 32 data blocks.
media. Often only the first and the last session are visible. Sometimes
not even that. Option -rom_toc_scan might or might not help in such cases.
.SS
.B Creating, Growing, Modifying:
.B Creating, Growing, Modifying, Blind Growing:
.br
A new empty ISO image gets \fBcreated\fR
if there is no input drive with a valid
@ -229,11 +229,25 @@ named pipes, character devices, sockets.
On the other hand modified sessions cannot be written to appendable media
but to blank media only.
.br
Modifying takes place whenever input drive and output drive are not the same.
This is achieved by options -indev and -outdev.
.br
So for this method one needs either two optical drives or has to work with
filesystem objects as source and/or target media.
.br
Modifying takes place if input drive and output drive are not the same and
if option -grow_blindly is set to its default "off".
This is achieved by options -indev and -outdev.
.PP
If option -grow_blindly is set to a non-negative number and if -indev and
-outdev are both set to different drives, then \fBblind growing\fR is
performed. It produces an add-on session which is ready for being written
to the given block address. This is the usage model of
.br
mkisofs -M $indev -C $msc1,$msc2 -o $outdev
.br
which gives much room for wrong parameter combinations and should thus only be
employed if a strict distinction between ISO formatter xorriso and the burn
program is desired. -C $msc1,$msc2 is equivalent to:
.br
-load sbsector $msc1 -grow_blindly $msc2
.SS
.B Libburn drives:
.br
@ -245,8 +259,8 @@ Rock Ridge info must be present in existing ISO images and it will be generated
by the program unconditionally.
.PP
Output drive, i.e. target for writing, can be any libburn drive.
Some drive types do not support the method of growing but only the method
of modifying. They all are suitable for newly created images.
Some drive types do not support the method of growing but only the methods
of modifying and blind growing. They all are suitable for newly created images.
.br
All drive file objects have to offer rw-permission to the user of xorriso.
Even those which will not be useable for reading an ISO image.
@ -277,7 +291,8 @@ their path in the filesystem. E.g.:
If path leads to a regular file or to a block device then the emulated drive
is random access readable and can be used for the method of growing if it
already contains a valid ISO 9660 image. Any other file type is not readable
via "stdio:" and can only be used as target for the method of modifying.
via "stdio:" and can only be used as target for the method of modifying or
blind growing.
Non existing paths in existing directories are handled as empty regular files.
.PP
A very special kind of pseudo drive are open file descriptors. They are
@ -289,7 +304,7 @@ To prevent a fatal intermingling of ISO image and text messages, all result
texts get redirected to stderr if -*dev "-" or "stdio:/dev/fd/1" is among
the start arguments of the program.
.br
Standard output is currently suitable for creating a single new session
Standard output is currently suitable for creating one session
per program run without dialog. Use in other situations is discouraged
and several restrictions apply:
.br
@ -427,13 +442,15 @@ without aquiring a new one.
.TP
\fB\-indev\fR address
Set input drive and load an eventual ISO image. If the new input drive differs
from -outdev then switch from growing to modifying. The same rules and
restrictions apply as with -dev.
from -outdev then switch from growing to modifying or to blind growing.
It depends on the setting of -grow_blindly which of both gets activated.
The same rules and restrictions apply as with -dev.
.TP
\fB\-outdev\fR address
Set output drive and if it differs from the input drive then switch from
growing to modifying. Unlike -dev and -indev this action does not load a
new ISO image. So it can be performed even if there are pending changes.
growing to modifying or to blind growing. Unlike -dev and -indev this action
does not load a new ISO image. So it can be performed even if there are pending
changes.
.br
-outdev can be performed without previous -dev or -indev. In that case an
empty ISO image with no changes pending is created. It can either be populated
@ -446,6 +463,21 @@ apply. See above paragraph "Libburn drives".
An empty address string "" gives up the current output drive
without aquiring a new one. No writing is possible without an output drive.
.TP
\fB\-grow_blindly\fR "off"|predicted_nwa
If predicted_nwa is a non-negative number then perform blind growing rather
than modifying if -indev and -outdev are set to different drives.
"off" or "-1" switch to modifying, which is the default.
.br
predicted_nwa is the block address where the add-on session of blind
growing will finally end up. It is the responsibility of the user to ensure
this final position and the presence of the older sessions. Else the
overall ISO image will not be mountable or will produce read errors when
accessing file content. xorriso will write the session to the address
as obtained from examining -outdev and not necessarily to predicted_nwa.
.br
During a run of blind growing, the input drive gets released before output
begins. The output drive gets released when writing is done.
.TP
\fB\-load\fR entity id
Load a particular (possibly outdated) ISO image from a -dev or -indev which
hosts more than one session. Usually all available sessions are shown with
@ -908,8 +940,8 @@ Discard the manipulated ISO image. End program without loading a new image.
\fB\-commit\fR
Perform the write operation. Afterwards eventually make the
-outdev the new -dev and load the image from there.
Switch from eventual modifiying mode to growing mode.
(A subsequent -outdev will activate modification mode.)
Switch to growing mode.
(A subsequent -outdev will activate modification mode or blind growing.)
-commit is performed automatically at end of program if there
are uncommitted manipulations pending.
So, to perform a final write operation with no new -dev
@ -1196,12 +1228,14 @@ User id to be used for all files when the new ISO tree gets written to media.
\fB\-gid\fR gid
Group id to be used for all files when the new ISO tree gets written to media.
.TP
\fB\-speed\fR number[k|m|c|d]
\fB\-speed\fR number[k|m|c|d|b]
Set the burn speed. Default is 0 = maximum speed.
Speed can be given in media dependent numbers or as a
desired throughput per second in MMC compliant kB (= 1000)
or MB (= 1000 kB). Media x-speed factor can be set explicity
by "c" for CD and "d" for DVD. Example speeds:
by "c" for CD, "d" for DVD, "b" for BD, "x" is optional.
.br
Example speeds:
.br
706k = 706kB/s = 4c = 4xCD
.br
@ -1717,25 +1751,22 @@ as ISO 9660 image producer and cdrecord as burn program.
xorriso does not strive for their comprehensive emulation.
Nevertheless it is ready to perform some of its core tasks under control
of commands which in said programs trigger comparable actions.
The scope is for now only a single first data track to be written to blank or
overwriteable media. If possible the media will get closed afterwards.
Multi-session is yet only possible via xorriso's own commands.
.TP
\fB\-as\fR personality option [options] --
.br
Performs its variable length option list as sparse emulation of the program
depicted by the personality word. This is only allowed if no image changes
are pending. The input drive is given up.
depicted by the personality word.
.br
Personality "\fBmkisofs\fR" accepts the options listed with:
.br
-as mkisofs -help --
.br
Among them: -R (always on), -J, -graft-points, -o, -path-list, -m, -print-size,
-V, -v, -version, pathspecs as with xorriso -add. A lot of options are not
supported and lead to failure of the mkisofs emulation. Some are ignored,
but better do not rely on this tolerance.
Among them: -R (always on), -J, -o, -M, -C, -path-list, -m, -exclude-list,
-f, -print-size, -pad, -no-pad, -V, -v, -version, -graft-points,
pathspecs as with xorriso -add.
A lot of options are not supported and lead to failure of the mkisofs
emulation. Some are ignored, but better do not rely on this tolerance.
.br
-graft-points is equivalent to -pathspecs on. Note that pathspecs without "="
are interpreted differently than with xorriso option -add. Directories get
@ -1746,10 +1777,11 @@ Other than with the "cdrecord" personality there is no automatic -commit at
the end of a "mkisofs" option list. Verbosity settings -v (= "UPDATE") and
-quiet (= "SORRY") persist. The output file, eventually chosen with -o,
persists until things happen like -commit, -rollback, -dev, or end of xorriso.
-pacifier gets set to "mkisofs" if files are added to the image.
.br
If no output file was chosen before or during a "mkisofs" option list, then
standard output (-outdev "-") will get into effect before pathspecs get
added. If -o points to a regular file, then it will be truncated to 0 bytes
If pathspecs are given and if no output file was chosen before or during the
"mkisofs" option list, then standard output (-outdev "-") will get into effect.
If -o points to a regular file, then it will be truncated to 0 bytes
when finally writing begins. This truncation does not happen if the drive
is chosen by xorriso options before or after -as mkisofs.
Directories and symbolic links are no valid -o targets.
@ -1758,20 +1790,33 @@ Writing to stdout is possible only if -as "mkisofs" was among the start
arguments or if other start arguments pointed the output drive to
standard output.
.br
Personalites "\fBgenisoimage\fR" and "\fBgenisofs\fR"
Personalites "\fBxorrisofs\fR", "\fBgenisoimage\fR", and "\fBgenisofs\fR"
are aliases for "mkisofs".
.br
If xorriso is started with one of the leafnames "xorrisofs", "genisofs",
"mkisofs", or "genisoimage", then it automatically prepends -as "genisofs"
to the command line arguments. I.e. all arguments will be interpreted mkisofs
style until "--" is encountered. From then on, options are interpreted
as xorriso options.
.br
Personality "\fBcdrecord\fR" accepts the options listed with:
.br
-as cdrecord -help --
.br
Among them: -v, dev=, speed=, blank=, fs=, -eject, -atip, padsize=,
Among them: -v, dev=, speed=, blank=, fs=, -eject, -atip, padsize=, tsize=,
-isosize, -multi, -msinfo, --grow_overwriteable_iso, write_start_address=,
track source file path or "-" for standard input as track source.
.br
It ignores most other options of cdrecord and cdrskin but refuses on
-audio, -scanbus, -multi, -msinfo, --grow_overwriteable_iso,
and on blanking modes unknown to xorriso.
-audio, -scanbus, and on blanking modes unknown to xorriso.
.br
The scope is only a single data track per session to be written
to blank, overwriteable, or appendable media. The media gets closed if
closing is applicable and not option -multi is present.
.br
An eventually aquired input drive is given up.
This is only allowed if no image changes are pending.
.br
dev= must be given as xorriso device address. Adresses like 0,0,0 or ATA:1,1,0
are not supported.
@ -1779,9 +1824,37 @@ are not supported.
If a track source is given, then an automatic -commit happens at the end of
the "cdrecord" option list.
.br
--grow_overwriteable_iso enables emulation of multi-session on overwriteable
media. To enable emulation of a TOC, the first session needs -C 0,32 with
-as mkisofs (but no -M) and --grow_overwriteable_iso write_start_address=32s
with -as cdrecord.
.br
A much more elaborate libburn based cdrecord emulator is the program cdrskin.
.br
Personalites "\fBwodim\fR" and "\fBcdrskin\fR" are aliases for "cdrecord".
Personalites "\fBxorrecord\fR", "\fBwodim\fR", and "\fBcdrskin\fR" are aliases
for "cdrecord".
.br
If xorriso is started with one of the leafnames "xorrecord", "cdrskin",
"cdrecord", or "wodim", then it automatically prepends -as "cdrskin"
to the command line arguments. I.e. all arguments will be interpreted cdrecord
style until "--" is encountered and an eventual commit happens.
From then on, options are interpreted as xorriso options.
.TP
\fB\-pacifier\fR behavior_code
Control behavior of UPDATE pacifiers during write operations.
The following behavior codes are defined:
.br
"xorriso" is the default format:
.br
Writing: sector XXXXX of YYYYYY [fifo active, nn% fill]
.br
"cdrecord" looks like:
.br
X of Y MB written (fifo nn%) [buf mmm%]
.br
"mkisofs"
.br
nn% done, estimate finish Tue Jul 15 20:13:28 2008
.TP
.B Scripting, dialog and program control features:
.TP
@ -1921,9 +1994,11 @@ Manipulating an existing ISO image on the same media
.br
Copy modified ISO image from one media to another
.br
Write a ISO image into a pipe (single-session only)
Write a ISO image into a pipe
.br
Perform a single session run as of cdrtools traditions
Perform multi-session runs as of cdrtools traditions
.br
Let xorriso work underneath growisofs
.br
Adjust thresholds for verbosity, exit value and program abort
.br
@ -2071,21 +2146,67 @@ first and only session to the output drive.
.br
-commit -eject all
.SS
.B Write a ISO image into a pipe (single-session only)
.B Write a ISO image into a pipe
\fB$\fR xorriso -outdev - \\
.br
...
.br
| gzip >image.iso.gz
.SS
.B Perform a single session run as of cdrtools traditions
This shall illustrate how xorriso can act in either role.
.B Perform multi-session runs as of cdrtools traditions
Between both processes there can be performed arbitrary transportation
or filtering.
.br
\fB$\fR xorriso -as mkisofs -J -R /home/prepared_for_iso/tree | \\
The first session is written like this:
.br
xorriso -as cdrecord -v dev=/dev/sr0 blank=fast -eject -
\fB$\fR xorriso -as mkisofs prepared_for_iso/tree1 | \\
.br
xorriso -as cdrecord -v dev=/dev/sr0 blank=fast -multi -eject -
.br
Follow-up sessions are written like this:
.br
\fB$\fR m=$(xorriso -as cdrecord dev=/dev/sr0 -msinfo)
.br
\fB$\fR xorriso -as mkisofs -M /dev/sr0 -C $m prepared_for_iso/tree2 | \\
.br
xorriso -as cdrecord -v dev=/dev/sr0 -waiti -multi -eject -
.br
Always eject the drive tray between sessions. The old sessions
get read via stdio:/dev/sr0 and thus are prone to device driver
peculiarities.
.br
This example works for multi-session media only.
Add cdrskin option --grow_overwriteable_iso to all -as cdrecord runs
in order to enable multi-session emulation on overwriteable media.
.SS
.B Let xorriso work underneath growisofs
growisofs expects an ISO formatter program which understands options -C and
-M. If xorriso gets started by name "xorrisofs" then it is suitable for that.
.br
\fB$\fR export MKISOFS="xorrisofs"
.br
\fB$\fR growisofs -Z /dev/dvd /some/files
.br
\fB$\fR growisofs -M /dev/dvd /more/files
.br
If no "xorrisofs" is available on your system, then you will have to create
a link pointing to the xorriso binary and tell growisofs to use it. E.g. by:
.br
\fB$\fR ln -s $(which xorriso) "$HOME/xorrisofs"
.br
\fB$\fR export MKISOFS="$HOME/xorrisofs"
.br
One may quit mkisofs emulation by argument "--" and make
use of all xorriso commands. growisofs dislikes options which
start with "-o" but -outdev must be set to "-".
So use "outdev" instead:
.br
\fB$\fR growisofs -Z /dev/dvd -- outdev - -update_r /my/files /files
.br
\fB$\fR growisofs -M /dev/dvd -- outdev - -update_r /my/files /files
.br
growisofs has excellent burn capabilities with DVD and BD.
It does not emulate session history on overwriteable media, though.
.SS
.B Adjust thresholds for verbosity, exit value and program abort
Be quite verbous, exit 32 if severity "FAILURE" was encountered,

View File

@ -765,8 +765,10 @@ bit15= with bit1 or bit2: close depicted log file
if(flag&(2|4))
return(1);
if(flag&1) {
if(channel_no==1 || channel_no==3)
if(channel_no==1 || channel_no==3) {
printf("%s",text);
fflush(stdout);
}
if(channel_no==2 || channel_no==3)
fprintf(stderr,"%s",text);
if(logfile_fp[channel_no]!=NULL) {
@ -1315,7 +1317,10 @@ completed:;
/* @param flag bit0=with year and seconds
bit1=timestamp format YYYY.MM.DD.hhmmss
bit1-3= form
0= ls -l format
1= timestamp format YYYY.MM.DD.hhmmss
2= Wdy Mon Day hh:mm:ss Year
*/
char *Ftimetxt(time_t t, char timetext[40], int flag)
{
@ -1323,16 +1328,23 @@ char *Ftimetxt(time_t t, char timetext[40], int flag)
struct tm tms, *tmpt;
static char months[12][4]= { "Jan", "Feb", "Mar", "Apr", "May", "Jun",
"Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
static char days[7][4]= {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
int form;
form= (flag>>1)&7;
tmpt= localtime_r(&t, &tms);
rpt= timetext;
rpt[0]= 0;
if(tmpt==0)
sprintf(rpt+strlen(rpt), "%12.f", (double) t);
else if (flag&2)
else if (form==1)
sprintf(rpt+strlen(rpt), "%4.4d.%2.2d.%2.2d.%2.2d%2.2d%2.2d",
1900+tms.tm_year, tms.tm_mon, tms.tm_mday,
tms.tm_hour, tms.tm_min, tms.tm_sec);
else if (form==2)
sprintf(rpt+strlen(rpt), "%s %s %2.2d %2.2d:%2.2d:%2.2d %4.4d",
days[tms.tm_wday], months[tms.tm_mon], tms.tm_mday,
tms.tm_hour, tms.tm_min, tms.tm_sec, 1900+tms.tm_year);
else if (flag&1)
sprintf(rpt+strlen(rpt), "%2d %3s %4.4d %2.2d:%2.2d:%2.2d",
tms.tm_mday, months[tms.tm_mon], 1900+tms.tm_year,
@ -1386,6 +1398,30 @@ single_letters:;
}
int Wait_for_input(int fd, int microsec, int flag)
{
struct timeval wt;
fd_set rds,wts,exs;
int ready;
FD_ZERO(&rds);
FD_ZERO(&wts);
FD_ZERO(&exs);
FD_SET(fd,&rds);
FD_SET(fd,&exs);
wt.tv_sec= microsec/1000000;
wt.tv_usec= microsec%1000000;
ready= select(fd+1,&rds,&wts,&exs,&wt);
if(ready<=0)
return(0);
if(FD_ISSET(fd,&exs))
return(-1);
if(FD_ISSET(fd,&rds))
return(1);
return(0);
}
/* ------------------------------------------------------------------------ */
@ -2779,6 +2815,7 @@ int Xorriso_new(struct XorrisO ** xorriso,char *progname, int flag)
if(getcwd(m->initial_wdx,sizeof(m->initial_wdx)-1)==NULL)
m->initial_wdx[0]= 0;
m->no_rc= 0;
m->argument_emulation= 0;
m->rc_filename_count= Xorriso_rc_nuM;
for(i=0;i<m->rc_filename_count-1;i++)
@ -2823,6 +2860,7 @@ int Xorriso_new(struct XorrisO ** xorriso,char *progname, int flag)
m->outdev[0]= 0;
m->out_drive_handle= NULL;
m->dev_fd_1= -1;
m->grow_blindly_msc2= -1;
m->ban_stdio_write= 0;
m->do_dummy= 0;
m->do_close= 0;
@ -2885,6 +2923,7 @@ int Xorriso_new(struct XorrisO ** xorriso,char *progname, int flag)
m->insert_count= 0;
m->insert_bytes= 0;
m->error_count= 0;
m->pacifier_style= 0;
m->pacifier_interval= 1.0;
m->pacifier_count= 0;
m->pacifier_total= 0;
@ -2905,6 +2944,16 @@ int Xorriso_new(struct XorrisO ** xorriso,char *progname, int flag)
goto failure;
if(strcmp(leafname, "osirrox")==0)
m->allow_restore= 1;
else if(strcmp(leafname, "xorrisofs")==0 || strcmp(leafname, "genisofs")==0 ||
strcmp(leafname, "mkisofs")==0 || strcmp(leafname, "genisoimage")==0) {
m->argument_emulation= 1;
m->pacifier_style= 1;
Xorriso_protect_stdout(*xorriso, 0);
} else if(strcmp(leafname, "xorrecord")==0 || strcmp(leafname, "wodim")==0 ||
strcmp(leafname, "cdrecord")==0 || strcmp(leafname, "cdrskin")==0) {
m->argument_emulation= 2;
m->pacifier_style= 2;
}
ret= Exclusions_new(&(m->disk_exclusions), 0);
if(ret<=0)
goto failure;
@ -4152,7 +4201,14 @@ int Xorriso_status(struct XorrisO *xorriso, char *filter, FILE *fp, int flag)
Text_shellsafe(xorriso->session_logfile,sfe,0));
if(!(is_default && no_defaults))
Xorriso_status_result(xorriso,filter,fp,flag&2);
is_default= (xorriso->pacifier_style==0);
sprintf(line,"-pacifier '%s'\n",
xorriso->pacifier_style==1 ? "mkisofs" :
xorriso->pacifier_style==2 ? "cdrecord" : "xorriso");
if(!(is_default && no_defaults))
Xorriso_status_result(xorriso,filter,fp,flag&2);
is_default= (strcmp(xorriso->return_with_text,"SORRY")==0 &&
xorriso->return_with_value==32);
sprintf(line,"-return_with %s %d\n",
@ -4216,6 +4272,13 @@ int Xorriso_status(struct XorrisO *xorriso, char *filter, FILE *fp, int flag)
Xorriso_status_result(xorriso,filter,fp,flag&2);
}
is_default= (xorriso->grow_blindly_msc2<0);
sprintf(sfe, "%d", xorriso->grow_blindly_msc2);
sprintf(line,"-grow_blindly %s\n",
xorriso->grow_blindly_msc2 < 0 ? "off" : sfe);
if(!(is_default && no_defaults))
Xorriso_status_result(xorriso,filter,fp,flag&2);
if(strcmp(xorriso->indev,xorriso->outdev)==0) {
sprintf(line,"-dev %s\n", Text_shellsafe(xorriso->indev,sfe,0));
Xorriso_status_result(xorriso,filter,fp,flag&2);
@ -7026,9 +7089,11 @@ int Xorriso_reaquire_outdev(struct XorrisO *xorriso, int flag)
int Xorriso_cdrskin(struct XorrisO *xorriso, char *whom, int argc, char **argv,
int flag)
{
int ret, i, k, mem_do_close, aq_ret, eject_ret;
int ret, i, k, mem_do_close, aq_ret, eject_ret, msc1, msc2, hflag;
int do_atip= 0, do_checkdrive= 0, do_eject= 0, do_scanbus= 0;
int do_toc= 0, do_verbous= 0, do_version= 0, do_help= 0;
int do_toc= 0, do_verbous= 0, do_version= 0, do_help= 0, do_waiti= 0;
int do_multi= 0, do_msinfo= 0, do_grow= 0, do_isosize= 0;
double write_start_address= -1.0, tsize= -1.0;
char track_source[SfileadrL], sfe[5*SfileadrL], dev_adr[SfileadrL], *cpt;
char mem_report_about_text[80], *report_about= "SORRY", blank_mode[80];
char speed[80];
@ -7044,9 +7109,7 @@ int Xorriso_cdrskin(struct XorrisO *xorriso, char *whom, int argc, char **argv,
"drive_scsi_dev_family=", "fallback_program=", "modesty_on_drive=",
"tao_to_sao_tsize=",
"direct_write_amount=", "write_start_address=", "msifile=",
"tsize=",
"direct_write_amount=", "msifile=",
""
};
@ -7059,8 +7122,8 @@ int Xorriso_cdrskin(struct XorrisO *xorriso, char *whom, int argc, char **argv,
"-cdi", "-preemp", "-nopreemp", "-copy", "-nocopy",
"-scms", "-shorttrack", "-noshorttrack", "-packet", "-noclose",
"-media-info", "-minfo",
"-isosize", "-load", "-lock", "-raw96r", "-sao", "-dao", "-swab",
"-tao", "-waiti", "-force", "-format",
"-load", "-lock", "-raw96r", "-sao", "-dao", "-swab",
"-tao", "-force", "-format",
"--adjust_speed_to_drive", "--allow_emulated_drives", "--allow_setuid",
"--allow_untested_media", "--any_track", "--demand_a_drive",
@ -7087,17 +7150,24 @@ int Xorriso_cdrskin(struct XorrisO *xorriso, char *whom, int argc, char **argv,
"\tblank=type\tblank a CD-RW disc (see blank=help)",
"\tfs=#\t\tSet fifo size to # (0 to disable, default is 4 MB)",
"\t-eject\t\teject the disk after doing the work",
"\t-dummy\t\tdo everything with laser turned off",
"\t-msinfo\t\tretrieve multi-session info for mkisofs >= 1.10",
"\t-toc\t\tretrieve and print TOC/PMA data",
"\t-atip\t\tretrieve media state, print \"Is *erasable\"",
"\t-multi\t\tgenerate a TOC that allows multi session",
"\t-waiti\t\twait until input is available before opening SCSI",
"\ttsize=#\t\tannounces exact size of source data",
"\tpadsize=#\tAmount of padding",
"\t-data\t\tSubsequent tracks are CD-ROM data mode 1 (default)",
"\t-isosize\tUse iso9660 file system size for next data track",
"\t-pad\t\tpadsize=30k",
"\t-nopad\t\tDo not pad",
"\t--grow_overwriteable_iso\temulate multi-session on DVD+RW",
"\twrite_start_address=#\t\twrite to given byte address on DVD+RW",
"\t-help\t\tprint this text to stderr and exit emulation",
"Actually this is the integrated ISO RockRidge filesystem manipulator xorriso",
"lending its libburn capabilities to a very limited cdrecord emulation.",
"Only a single data track can be burnt to blank or overwriteable media which",
"will be finalized afterwards if possible.",
"lending its libburn capabilities to a very limited cdrecord emulation. Only",
"a single data track can be burnt to blank, appendable or overwriteable media.",
"A much more elaborate cdrecord emulator is cdrskin from the same project.",
"@End_of_helptexT@"
};
@ -7111,7 +7181,8 @@ static char blank_help[][80]= {
"\tfast\t\tminimally blank the entire disk",
"\tminimal\t\tminimally blank the entire disk",
"\tdeformat\t\tblank a formatted DVD-RW",
"\tdeformat_quickest\t\tminimally blank a formatted DVD-RW to DAO only",
"\tdeformat_quickest\tminimally blank a formatted DVD-RW to DAO only",
"\tformat_overwrite\tformat a DVD-RW to \"Restricted Overwrite\"",
"@End_of_helptexT@"
};
@ -7124,7 +7195,7 @@ static char blank_help[][80]= {
speed[0]= 0;
if(xorriso->in_drive_handle != NULL) {
ret= Xorriso_option_dev(xorriso, "", 1); /* give up indev */
ret= Xorriso_option_dev(xorriso, "", 1|32); /* give up indev */
if(ret!=1)
return(ret);
}
@ -7177,6 +7248,8 @@ no_volunteer:;
strcmp(cpt,"deformat_quickest")==0 ||
strcmp(cpt,"deformat_sequential_quickest")==0) {
strcpy(blank_mode, cpt);
} else if(strcmp(cpt,"format_overwrite")==0) {
strcpy(blank_mode, "format_overwrite");
} else {
sprintf(xorriso->info_text,
"-as %s: blank=%s not supported. See blank=help .",
@ -7191,9 +7264,9 @@ no_volunteer:;
} else if(strncmp(argv[i], "-dev=", 5)==0 ||
strncmp(argv[i], "dev=", 4)==0) {
cpt= strchr(argv[i], '=')+1;
ret= Xorriso_option_dev(xorriso, cpt, 2|8); /* overwriteables as blank */
if(ret<=0)
goto ex;
strcpy(dev_adr, cpt);
} else if(strcmp(argv[i], "--devices")==0) {
do_scanbus= 2;
} else if(strncmp(argv[i],"driveropts=", 11)==0 ||
strncmp(argv[i],"-driveropts=", 12)==0) {
if(strcmp(argv[i]+11, "help")==0) {
@ -7210,8 +7283,18 @@ no_volunteer:;
ret= Xorriso_option_fs(xorriso, cpt, 0);
if(ret<=0)
goto ex;
} else if(strcmp(argv[i], "--grow_overwriteable_iso")==0) {
do_grow= 1;
} else if(strcmp(argv[i], "-help")==0) {
do_help= 1;
} else if(strcmp(argv[i], "-isosize")==0) {
do_isosize= 1;
} else if(strcmp(argv[i], "-inq")==0) {
do_checkdrive= 2;
} else if(strcmp(argv[i], "-msinfo")==0) {
do_msinfo= 1;
} else if(strcmp(argv[i], "-multi")==0) {
do_multi= 1;
} else if(strcmp(argv[i], "-nopad")==0) {
xorriso->padding= 0;
} else if(strcmp(argv[i], "-pad")==0) {
@ -7222,21 +7305,6 @@ no_volunteer:;
ret= Xorriso_option_padding(xorriso, cpt, 0);
if(ret<=0)
goto ex;
} else if(strncmp(argv[i], "-speed=", 7)==0 ||
strncmp(argv[i], "speed=", 6)==0) {
cpt= strchr(argv[i], '=')+1;
strncpy(speed, cpt, 79);
speed[79]= 0;
} else if(strcmp(argv[i], "-multi")==0) {
sprintf(xorriso->info_text, "-as %s: Option -multi not supported.", whom);
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
ret= 0; goto ex;
} else if(strcmp(argv[i], "-msinfo")==0) {
sprintf(xorriso->info_text, "-as %s: Option -msinfo not supported.",whom);
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
ret= 0; goto ex;
} else if(strcmp(argv[i], "--devices")==0) {
do_scanbus= 2;
} else if(strcmp(argv[i], "-scanbus")==0) {
sprintf(xorriso->info_text, "-as %s: Option -scanbus not supported.",
whom);
@ -7244,14 +7312,22 @@ no_volunteer:;
ret= 0; goto ex;
/* do_scanbus= 1; */
} else if(strncmp(argv[i], "-speed=", 7)==0 ||
strncmp(argv[i], "speed=", 6)==0) {
cpt= strchr(argv[i], '=')+1;
strncpy(speed, cpt, 79);
speed[79]= 0;
} else if(strcmp(argv[i], "-toc")==0) {
do_toc= 1;
} else if(strcmp(argv[i], "--grow_overwriteable_iso")==0) {
sprintf(xorriso->info_text,
"-as %s: Option --grow_overwriteable_iso not supported.",
whom);
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
ret= 0; goto ex;
} else if(strncmp(argv[i], "-tsize=", 7)==0 ||
strncmp(argv[i], "tsize=", 6)==0) {
cpt= strchr(argv[i], '=')+1;
tsize= Scanf_io_size(cpt, 1);
if(tsize > 1024.0*1024.0*1024.0*1024.0*1024.0) {
sprintf(xorriso->info_text, "-as %s: much too large: %s",whom, argv[i]);
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
ret= 0; goto ex;
}
} else if(strcmp(argv[i], "-v")==0 || strcmp(argv[i],"-verbose")==0) {
do_verbous++;
} else if(strcmp(argv[i], "-vv")==0) {
@ -7260,8 +7336,10 @@ no_volunteer:;
do_verbous+= 3;
} else if(strcmp(argv[i], "-version")==0) {
do_version= 1;
} else if(strcmp(argv[i], "-help")==0) {
do_help= 1;
} else if(strcmp(argv[i], "-waiti")==0) {
do_waiti= 1;
} else if(strncmp(argv[i], "write_start_address=", 20)==0) {
write_start_address= Scanf_io_size(argv[i]+20,0);
} else if(argv[i][0]=='-' && argv[i][1]!=0) {
sprintf(xorriso->info_text, "-as %s: Unknown option %s",
whom, Text_shellsafe(argv[i], sfe, 0));
@ -7290,6 +7368,29 @@ no_volunteer:;
Xorriso_option_version(xorriso, 0);
ret= 1; goto ex;
}
if(do_waiti) {
sprintf(xorriso->info_text,
"xorriso: Option -waiti pauses program until input appears at stdin\n");
Xorriso_info(xorriso,0);
sprintf(xorriso->result_line, "Waiting for data on stdin...\n");
Xorriso_result(xorriso, 1);
for(ret= 0; ret==0; )
ret= Wait_for_input(0,1000000,0);
if(ret<0 || feof(stdin)) {
Xorriso_msgs_submit(xorriso, 0,
"stdin produces exception rather than data", 0, "NOTE", 0);
}
sprintf(xorriso->info_text, "xorriso: Option -waiti pausing is done.\n");
}
if(dev_adr[0]) {
hflag= 2|32;
if(!do_grow)
hflag|= 8; /* consider overwriteables as blank */
ret= Xorriso_option_dev(xorriso, dev_adr, hflag);
if(ret<=0)
goto ex;
}
if(do_help) {
for(i= 0; strcmp(helptext[i], "@End_of_helptexT@")!=0; i++) {
sprintf(xorriso->info_text, "%s\n", helptext[i]);
@ -7313,7 +7414,7 @@ no_volunteer:;
}
if(!(do_checkdrive || do_atip || do_toc || blank_mode[0] || track_source[0] ||
do_eject))
do_eject || do_msinfo))
{ret= 1; goto ex;}
if(xorriso->out_drive_handle==NULL) {
@ -7321,6 +7422,15 @@ no_volunteer:;
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
ret= 0; goto ex;
}
if(do_msinfo) {
ret= Xorriso_msinfo(xorriso, &msc1, &msc2, 2 | !!do_grow);
if(ret<=0)
goto ex;
sprintf(xorriso->result_line, "%d,%d\n", msc1, msc2);
Xorriso_result(xorriso, 1);
}
if(speed[0]) {
ret= Xorriso_option_speed(xorriso, speed, 0);
if(ret<=0)
@ -7352,14 +7462,20 @@ no_volunteer:;
if(ret<=0)
goto ex;
}
if(blank_mode[0]) {
if(strcmp(blank_mode, "format_overwrite")==0) {
ret= Xorriso_option_blank(xorriso, "fast", 1);
if(ret<=0)
goto ex;
} else if(blank_mode[0]) {
ret= Xorriso_option_blank(xorriso, blank_mode, 0);
if(ret<=0)
goto ex;
}
if(track_source[0]) {
xorriso->do_close= 1;
ret= Xorriso_burn_track(xorriso, track_source, 0);
xorriso->do_close= !do_multi;
ret= Xorriso_burn_track(xorriso, (off_t) write_start_address,
track_source, (off_t) tsize,
(!!do_grow)|((!!do_isosize)<<1));
aq_ret= Xorriso_reaquire_outdev(xorriso, 2*(ret>0));
if(ret<=0 && ret<aq_ret)
goto ex;
@ -7389,10 +7505,10 @@ ex:;
int Xorriso_genisofs(struct XorrisO *xorriso, char *whom,
int argc, char **argv, int flag)
{
int ret, i, k, was_path= 0, was_other_option= 0, mem_graft_points;
int ret, i, k, was_path= 0, was_other_option= 0, mem_graft_points, mem;
int do_print_size= 0, idx_offset= 0, fd, idx;
char sfe[5*SfileadrL], adr[SfileadrL+8], ra_text[80], pathspec[2*SfileadrL];
char *ept, *add_pt, eff_path[SfileadrL];
char *ept, *add_pt, eff_path[SfileadrL], indev[SfileadrL+8], msc[80], *cpt;
/* mkisofs 2.01 options which are not scheduled for implementation, yet */
static char ignored_arg0_options[][41]= {
@ -7416,12 +7532,15 @@ int Xorriso_genisofs(struct XorrisO *xorriso, char *whom,
" -graft-points Allow to use graft points for filenames",
" -help Print option help",
" -J, -joliet Generate Joliet directory information",
" -no-pad Do not pad output",
" -o FILE, -output FILE Set output file name",
" -m GLOBFILE, -exclude GLOBFILE",
" Exclude file name",
" -exclude-list FILE File with list of file names to exclude",
" -pad Pad output by 300k (default)",
" -no-pad Do not pad output",
" -M FILE, -prev-session FILE Set path to previous session to merge",
" -C PARAMS, -cdrecord-params PARAMS",
" Magic paramters from cdrecord",
" -path-list FILE File with list of pathnames to process",
" -print-size Print estimated filesystem size and exit",
" -quiet Run quietly",
@ -7434,13 +7553,7 @@ int Xorriso_genisofs(struct XorrisO *xorriso, char *whom,
strcpy(ra_text, xorriso->report_about_text);
if(xorriso->in_drive_handle != NULL) {
ret= Xorriso_option_dev(xorriso, "", 1); /* give up indev */
if(ret!=1)
return(ret);
}
adr[0]= 0;
adr[0]= indev[0]= msc[0]= 0;
for(i= 0; i<argc; i++) {
if(strcmp(argv[i], "-version")==0) {
sprintf(xorriso->result_line,
@ -7458,10 +7571,26 @@ int Xorriso_genisofs(struct XorrisO *xorriso, char *whom,
goto not_enough_args;
i++;
adr[0]= 0;
if(strcmp(argv[i],"-")!=0)
if(strcmp(argv[i],"-")!=0 && strncmp(argv[i], "stdio:", 6)!=0)
strcpy(adr, "stdio:");
if(Sfile_str(adr+strlen(adr), argv[i], 0)<=0)
{ret= -1; goto ex;}
} else if(strcmp(argv[i], "-M")==0 || strcmp(argv[i], "-dev")==0 ||
strcmp(argv[i], "-prev-session")==0) {
if(i+1>=argc)
goto not_enough_args;
i++;
if(strncmp(argv[i], "stdio:", 6)!=0)
strcpy(indev, "stdio:");
if(Sfile_str(indev+strlen(indev), argv[i], 0)<=0)
{ret= -1; goto ex;}
} else if(strcmp(argv[i], "-C")==0 ||
strcmp(argv[i], "-cdrecord-params")==0) {
if(i+1>=argc)
goto not_enough_args;
i++;
strncpy(msc, argv[i], sizeof(msc)-1);
msc[sizeof(msc)-1]= 0;
} else if(strcmp(argv[i], "-help")==0) {
Xorriso_option_report_about(xorriso, "NOTE", 0);
for(i= 0; strcmp(helptext[i], "@End_of_helptexT@")!=0; i++) {
@ -7499,14 +7628,50 @@ int Xorriso_genisofs(struct XorrisO *xorriso, char *whom,
if(ret<=0)
goto ex;
}
if(!was_other_option)
{ret= 1; goto ex;}
if(xorriso->out_drive_handle==NULL) {
if(was_other_option && xorriso->out_drive_handle==NULL) {
ret= Xorriso_option_dev(xorriso, "-", 2|4); /* set outdev to stdout */
if(ret<=0)
return(ret);
}
if(msc[0]) {
cpt= strchr(msc, ',');
if(cpt==NULL) {
illegal_c:;
sprintf(xorriso->info_text,
"-as %s: unusable parameter with option -C: %s",
whom, Text_shellsafe(msc, sfe, 0));
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
{ret= 0; goto ex;}
} else if(cpt==msc || msc[1]==0)
goto illegal_c;
strncpy(sfe, msc, cpt-msc);
sfe[cpt-msc]= 0;
if(xorriso->in_drive_handle!=NULL && indev[0]) {
/* give up indev before setting the load address */
ret= Xorriso_option_dev(xorriso, "", 1);
if(ret<=0)
return(ret);
}
/* growisofs submits msc1+16 to avoid a theoretical bug in mkisofs.
Therefore this bug has to be emulated here. Sigh.
*/
ret= Xorriso_option_load(xorriso, "sbsector", sfe, 1);
if(ret<=0)
return(ret);
ret= Xorriso_option_grow_blindly(xorriso, cpt+1, 0);
if(ret<=0)
return(ret);
}
if(indev[0]) {
ret= Xorriso_option_dev(xorriso, indev, 1);
if(ret<=0)
goto ex;
}
if(!was_other_option)
{ret= 1; goto ex;}
xorriso->padding= 300*1024;
for(i= 0; i<argc; i++) {
@ -7563,6 +7728,12 @@ not_enough_args:;
} else if(strcmp(argv[i], "-o")==0) {
i++;
/* was already handled in first argument scan */;
} else if(strcmp(argv[i], "-M")==0 || strcmp(argv[i], "-dev")==0) {
i++;
/* was already handled in first argument scan */;
} else if(strcmp(argv[i], "-C")==0) {
i++;
/* was already handled in first argument scan */;
} else if(strcmp(argv[i], "-help")==0) {
/* was already handled in first argument scan */;
} else if(strcmp(argv[i], "-V")==0 || strcmp(argv[i], "-volid")==0) {
@ -7584,18 +7755,24 @@ not_enough_args:;
if(i+1>=argc)
goto not_enough_args;
i++;
mem= xorriso->do_disk_pattern;
xorriso->do_disk_pattern= 1;
if(strchr(argv[i], '/')!=NULL) {
idx= i;
ret= Xorriso_option_not_paths(xorriso, i+1, argv, &idx, 0);
} else
ret= Xorriso_option_not_leaf(xorriso, argv[i], 0);
xorriso->do_disk_pattern= mem;
if(ret<=0)
goto ex;
} else if(strcmp(argv[i], "-exclude-list")==0) {
if(i+1>=argc)
goto not_enough_args;
i++;
ret= Xorriso_option_not_leaf(xorriso, argv[i], 0);
mem= xorriso->do_disk_pattern;
xorriso->do_disk_pattern= 1;
ret= Xorriso_option_not_list(xorriso, argv[i], 0);
xorriso->do_disk_pattern= mem;
if(ret<=0)
goto ex;
} else if(strcmp(argv[i], "-v")==0 || strcmp(argv[i], "-quiet")==0) {
@ -7639,6 +7816,7 @@ not_enough_args:;
if(ret<=0)
goto ex;
was_path= 1;
xorriso->pacifier_style= 1;
}
}
if(do_print_size) {
@ -7658,6 +7836,38 @@ ex:;
}
int Xorriso_as_genisofs(struct XorrisO *xorriso, int argc, char **argv,
int *idx, int flag)
{
int end_idx, ret, idx_count, old_idx;
old_idx= *idx;
end_idx= Xorriso_end_idx(xorriso, argc, argv, *idx, 1);
(*idx)= end_idx;
idx_count= end_idx-old_idx;
if(end_idx<=0 || old_idx>=argc)
return(1);
ret= Xorriso_genisofs(xorriso, "genisofs", end_idx-old_idx, argv+old_idx, 0);
return(ret);
}
int Xorriso_as_cdrskin(struct XorrisO *xorriso, int argc, char **argv,
int *idx, int flag)
{
int end_idx, ret, idx_count, old_idx;
old_idx= *idx;
end_idx= Xorriso_end_idx(xorriso, argc, argv, *idx, 1);
(*idx)= end_idx;
idx_count= end_idx-old_idx;
if(end_idx<=0 || old_idx>=argc)
return(1);
ret= Xorriso_cdrskin(xorriso, "cdrskin", end_idx-old_idx, argv+old_idx, 0);
return(ret);
}
/* @param boss_iter Opaque handle to be forwarded to actions in ISO image
Set to NULL if calling this function from outside ISO world
@param flag bit2= -follow: this is not a command parameter
@ -8174,14 +8384,15 @@ int Xorriso_option_as(struct XorrisO *xorriso, int argc, char **argv,
ret= 0; goto ex;
}
if(strcmp(argv[*idx], "cdrecord")==0 || strcmp(argv[*idx], "wodim")==0 ||
strcmp(argv[*idx], "cdrskin")==0) {
strcmp(argv[*idx], "cdrskin")==0 || strcmp(argv[*idx], "xorrecord")==0) {
ret= Xorriso_cdrskin(xorriso, argv[*idx], end_idx-(*idx)-1, argv+(*idx)+1,
0);
if(ret<=0)
goto ex;
} else if(strcmp(argv[*idx], "mkisofs")==0 ||
strcmp(argv[*idx], "genisoimage")==0 ||
strcmp(argv[*idx], "genisofs")==0) {
strcmp(argv[*idx], "genisofs")==0 ||
strcmp(argv[*idx], "xorrisofs")==0) {
ret= Xorriso_genisofs(xorriso, argv[*idx], end_idx-(*idx)-1, argv+(*idx)+1,
0);
if(ret<=0)
@ -8661,7 +8872,10 @@ int Xorriso_option_commit(struct XorrisO *xorriso, int flag)
if(flag&1)
return(1);
strcpy(newdev, xorriso->outdev);
ret= Xorriso_option_dev(xorriso, newdev, 3|4);
if(xorriso->grow_blindly_msc2>=0)
ret= Xorriso_option_dev(xorriso, "", 3|4);
else
ret= Xorriso_option_dev(xorriso, newdev, 3|4);
return(ret);
}
@ -8992,6 +9206,7 @@ int Xorriso_option_cut_out(struct XorrisO *xorriso, char *disk_path,
bit3= regard overwriteable media as blank
bit4= if the drive is a regular disk file: truncate it to
the write start address
bit5= do not print toc of aquired drive
@return <=0 error , 1 success, 2 revoked by -reassure
*/
int Xorriso_option_dev(struct XorrisO *xorriso, char *in_adr, int flag)
@ -9026,7 +9241,7 @@ int Xorriso_option_dev(struct XorrisO *xorriso, char *in_adr, int flag)
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
return(0);
}
if((flag&1) && !(flag&4)) {
if((flag&1) && (xorriso->in_drive_handle != NULL || adr[0]) && !(flag&4)) {
ret= Xorriso_reassure(xorriso, (flag&2) ? "-dev" : "-indev",
"eventually discard the current image", 0);
if(ret<=0)
@ -9043,15 +9258,15 @@ int Xorriso_option_dev(struct XorrisO *xorriso, char *in_adr, int flag)
Text_shellsafe(xorriso->indev, sfe, 0));
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "NOTE", 0);
}
if((flag&2) && xorriso->in_drive_handle != NULL &&
if((flag&2) && xorriso->out_drive_handle != NULL &&
xorriso->in_drive_handle != xorriso->out_drive_handle) {
sprintf(xorriso->info_text,"Giving up -outdev %s",
Text_shellsafe(xorriso->outdev, sfe, 0));
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "NOTE", 0);
}
ret= Xorriso_give_up_drive(xorriso, flag&3);
ret= Xorriso_give_up_drive(xorriso, (flag&3)|((flag&32)>>2));
} else
ret= Xorriso_aquire_drive(xorriso, adr, (flag&3)|((flag&(8|16))>>1));
ret= Xorriso_aquire_drive(xorriso, adr, (flag&(3|32))|(((flag&(8|16))>>1)));
if(ret<=0)
return(ret);
if(xorriso->in_drive_handle == NULL)
@ -9660,6 +9875,25 @@ int Xorriso_option_gid(struct XorrisO *xorriso, char *gid, int flag)
}
/* Option -grow_blindly */
int Xorriso_option_grow_blindly(struct XorrisO *xorriso, char *msc2, int flag)
{
double num;
int l;
if(msc2[0]==0 || msc2[0]=='-' || strcmp(msc2, "off")==0) {
xorriso->grow_blindly_msc2= -1;
return(1);
}
num= Scanf_io_size(msc2, 0);
l= strlen(msc2);
if(msc2[l-1]<'0' || msc2[l-1]>'9')
num/= 2048.0;
xorriso->grow_blindly_msc2= num;
return(1);
}
/* Option -help and part of -prog_help */
int Xorriso_option_help(struct XorrisO *xorriso, int flag)
{
@ -9681,10 +9915,12 @@ int Xorriso_option_help(struct XorrisO *xorriso, int flag)
"disk files with prefix \"stdio:\", e.g. stdio:/tmp/pseudo_drive .",
" -dev address Set input and output drive and load eventual ISO image.",
" Set the image expansion method to growing.",
" -indev address Set input drive and load eventual ISO image. Switch from",
" growing to modifying.",
" -indev address Set input drive and load eventual ISO image. Use expansion",
" methods modifying or blind growing.",
" -outdev address",
" Set output drive and switch from growing to modifying.",
" Set output drive and use modifying or blind growing.",
" -grow_blindly \"off\"|predicted_nwa",
" Switch between modifying and blind growing.",
" -load \"session\"|\"track\"|\"lba\"|\"sbsector\"|\"volid\"|\"auto\" id",
" Load a particular (outdated) ISO image from a -dev or",
" -indev which hosts more than one session.",
@ -9839,7 +10075,7 @@ int Xorriso_option_help(struct XorrisO *xorriso, int flag)
" Append extra bytes to image stream. (Default is 300k)",
" -dummy \"on\"|\"off\"",
" If \"on\" simulate burning. Refuse if media cannot simulate.",
" -speed number[\"k\"|\"m\"|\"[x]CD\"|\"[x]DVD\"]",
" -speed number[\"k/s\"|\"m/s\"|\"[x]CD\"|\"[x]DVD\"|\"[x]BD\"]",
" Set the burn speed. Default is 0 = maximum speed.",
" -stream_recording \"on\"|\"off\"",
" Try to circumvent slow checkread on DVD-RAM and BD-RE.",
@ -9932,12 +10168,15 @@ int Xorriso_option_help(struct XorrisO *xorriso, int flag)
" Copy ISO file content into a byte interval of a disk file.",
"",
"Compatibility emulation (argument list may be ended by --):",
" -as mkisofs [-help|-o|-R|-J|-V|-P|-f|-m|-graft-points|-path-list|pathspecs]",
" -as mkisofs [-help|-version|-o|-R|-J|-V|-P|-f|-m|-exclude-list|-no-pad|",
" -M|-C|-graft-points|-path-list|pathspecs]",
" Perform some mkisofs gestures, understand pathspecs as mkisofs",
" does. Commit happens outside emulation at usual occasions.",
" -as cdrecord [-help|-v|dev=|speed=|blank=|fs=|-eject|-atip|padsize=|path|-]",
" Perform some cdrecord gestures, eventually write at most one",
" data track to blank or overwriteable media.",
" -pacifier \"xorriso\"|\"cdrecord\"|\"mkisofs\"",
" Choose format of UPDATE pacifier during write operations.",
"",
"General options:",
" -help Print this text",
@ -10104,7 +10343,8 @@ int Xorriso_option_list_formats(struct XorrisO *xorriso, int flag)
/* Option -load session|track|sbsector value */
/* @return <=0 error , 1 success, 2 revoked by -reassure
/* @param flag bit0= with adr_mode sbsector: adr_value is possibly 16 too high
@return <=0 error , 1 success, 2 revoked by -reassure
*/
int Xorriso_option_load(struct XorrisO *xorriso, char *adr_mode,
char *adr_value, int flag)
@ -10128,7 +10368,7 @@ int Xorriso_option_load(struct XorrisO *xorriso, char *adr_mode,
else if(strcmp(adr_mode, "track")==0)
xorriso->image_start_mode= 2;
else if(strcmp(adr_mode, "lba")==0 || strcmp(adr_mode, "sbsector")==0)
xorriso->image_start_mode= 3;
xorriso->image_start_mode= 3 | ((flag&1) << 16);
else if(strcmp(adr_mode, "volid")==0)
xorriso->image_start_mode= 4;
else {
@ -10781,7 +11021,7 @@ int Xorriso_option_not_paths(struct XorrisO *xorriso, int argc, char **argv,
end_idx= Xorriso_end_idx(xorriso, argc, argv, *idx,
xorriso->do_disk_pattern==1);
(xorriso->do_disk_pattern==1) | 2);
if(end_idx<=0)
return(end_idx);
num_descr= end_idx - *idx;
@ -10983,6 +11223,26 @@ int Xorriso_option_overwrite(struct XorrisO *xorriso, char *mode, int flag)
}
/* Option -pacifier */
int Xorriso_option_pacifier(struct XorrisO *xorriso, char *style, int flag)
{
if(strcmp(style, "xorriso")==0 || strcmp(style, "default")==0)
xorriso->pacifier_style= 0;
else if(strcmp(style, "mkisofs")==0 || strcmp(style, "genisofs")==0 ||
strcmp(style, "genisoimage")==0 || strcmp(style, "xorrisofs")==0)
xorriso->pacifier_style= 1;
else if(strcmp(style, "cdrecord")==0 || strcmp(style, "cdrskin")==0 ||
strcmp(style, "wodim")==0 || strcmp(style, "xorrecord")==0)
xorriso->pacifier_style= 2;
else {
sprintf(xorriso->info_text, "-pacifier: unknown behavior code '%s'", style);
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "SORRY", 0);
return(0);
}
return(1);
}
/* Option -padding */
int Xorriso_option_padding(struct XorrisO *xorriso, char *size, int flag)
{
@ -11486,17 +11746,24 @@ int Xorriso_option_speed(struct XorrisO *xorriso, char *speed, int flag)
} else if(*cpt=='x' || *cpt=='X')
cpt++;
if(*cpt=='c' || *cpt=='C') {
if (unit_found) {
;
} else if(*cpt=='c' || *cpt=='C') {
cd_speed:;
num*= 176.4;
} else if(*cpt=='d' || *cpt=='D') {
dvd_speed:;
num*= 1385;
} else if (!unit_found) {
} else if(*cpt=='b' || *cpt=='B') {
bd_speed:;
num*= 4495.625;
} else {
ret= Xorriso_get_profile(xorriso, &profile_number, profile_name, 2);
is_cd= (ret==2);
if(is_cd)
goto cd_speed;
else if (profile_name[0]=='B' && profile_name[1]=='D')
goto bd_speed;
else
goto dvd_speed;
}
@ -11931,7 +12198,8 @@ int Xorriso_count_args(struct XorrisO *xorriso, int argc, char **argv,
static char arg1_commands[][40]= {
"abort_on","add_plainly","blank","cd","cdi","cdx","close","dev",
"dummy","dialog","disk_pattern","eject","iso_rr_pattern","follow",
"format","fs","gid","history","indev","joliet","mark","not_leaf",
"format","fs","gid","grow_blindly",
"history","indev","joliet","mark","not_leaf",
"not_list","not_mgt","options_from_file","osirrox","outdev","overwrite",
"padding","path_list","pathspecs","pkt_output","print","prompt",
"prog","publisher","reassure","report_about","rom_toc_scan",
@ -12015,10 +12283,11 @@ return:
*/
/*
bit0= recursion
bit1= these are command line arguments (for xorriso->argument_emulation)
*/
{
int ret, was_dashed, end_ret, num1, num2;
char *cmd, *original_cmd, cmd_data[2*SfileadrL], *arg1, *arg2, type_text[5];
char *cmd, *original_cmd, cmd_data[2*SfileadrL], *arg1, *arg2;
if(xorriso==NULL)
return(0);
@ -12029,6 +12298,21 @@ return:
}
next_command:;
if(flag&2) {
ret= 1;
if(xorriso->argument_emulation==1)
ret= Xorriso_as_genisofs(xorriso, argc, argv, idx, 0);
else if(xorriso->argument_emulation==2)
ret= Xorriso_as_cdrskin(xorriso, argc, argv, idx, 0);
if(xorriso->argument_emulation>0) {
xorriso->argument_emulation= 0;
if(ret<=0)
goto eval_any_problems;
if((*idx)>=argc)
{ret= 1; goto ex;}
}
}
xorriso->prepended_wd= 0;
xorriso->request_to_abort= xorriso->request_not_to_ask= 0;
Xorriso_set_problem_status(xorriso, "", 0);
@ -12247,6 +12531,10 @@ next_command:;
(*idx)++;
ret= Xorriso_option_gid(xorriso,arg1,0);
} else if(strcmp(cmd,"grow_blindly")==0) {
(*idx)++;
ret= Xorriso_option_grow_blindly(xorriso,arg1,0);
} else if(strcmp(cmd,"help")==0) {
Xorriso_option_help(xorriso,0);
@ -12349,6 +12637,10 @@ next_command:;
(*idx)++;
ret= Xorriso_option_overwrite(xorriso,arg1,0);
} else if(strcmp(cmd,"pacifier")==0) {
(*idx)++;
ret= Xorriso_option_pacifier(xorriso, arg1, 0);
} else if(strcmp(cmd,"padding")==0) {
(*idx)++;
ret= Xorriso_option_padding(xorriso, arg1, 0);
@ -12485,13 +12777,17 @@ next_command:;
ret= Xorriso_option_temp_mem_limit(xorriso, arg1, 0);
} else if(strcmp(cmd,"test")==0) { /* This option does not exist. */
(*idx)+= 2;
ret= Xorriso_restore_is_identical(xorriso, NULL, arg2, arg1, type_text, 2);
if(ret>=0) {
sprintf(xorriso->info_text, "ISO node and disk file are %s\n",
ret>0 ? ret==2 ? "suspicious" : "identical" : "different");
Xorriso_info(xorriso, 0);
}
char buf[SfileadrL];
(*idx)+= 1;
ret= Xorriso_libburn_adr(xorriso, arg1, buf, 0);
if(ret>0)
sprintf(xorriso->info_text, " %s -> %s\n", arg1, buf);
else if(ret==0)
sprintf(xorriso->info_text, " not a libburn drive: %s\n", arg1);
else
sprintf(xorriso->info_text, " severe error with: %s\n", arg1);
Xorriso_info(xorriso, 0);
} else if(strcmp(cmd,"toc")==0) {
Xorriso_option_toc(xorriso, 0);
@ -12760,7 +13056,7 @@ protect_stdout:;
} else if(strcmp(cmd,"as")==0 && was_dashed) {
if(strcmp(arg1, "mkisofs")==0 || strcmp(arg1, "genisoimage")==0 ||
strcmp(arg1, "genisofs")==0)
strcmp(arg1, "genisofs")==0 || strcmp(arg1, "xorrisofs")==0)
goto protect_stdout;
} else {
@ -12875,7 +13171,7 @@ int Xorriso_main(int argc, char **argv)
/* Interpret program arguments */
i= 1;
ret= Xorriso_interpreter(xorriso,argc,argv,&i,0);
ret= Xorriso_interpreter(xorriso,argc,argv,&i,2);
if(ret==3)
goto end_sucessfully;
if(ret<=0)

View File

@ -19,7 +19,17 @@ struct XorrisO;
/* --------------------- Fundamental Management ------------------- */
/* Create a new xorriso object and tell it the program name to be used
with messages.
with messages and for decision of special behavior.
@param xorriso returns the newly created XorrisO object
@param progname typically argv[0] of main(). Some leafnames of the progname
path have special meaning and trigger special behavior:
"osirrox" allows image-to-disk copying: -osirrox "on"
"xorrisofs" activates permanent mkisofs emulation
"genisofs" alias of "xorrisofs"
"mkisofs" alias of "xorrisofs"
"genisoimage" alias of "xorrisofs"
@parm flag unused yet, submit 0
@return >0 success , <=0 failure, no object created
*/
int Xorriso_new(struct XorrisO ** xorriso, char *progname, int flag);
@ -315,6 +325,9 @@ int Xorriso_option_fs(struct XorrisO *xorriso, char *size, int flag);
/* Option -gid */
int Xorriso_option_gid(struct XorrisO *xorriso, char *gid, int flag);
/* Option -grow_blindly */
int Xorriso_option_grow_blindly(struct XorrisO *xorriso, char *msc2, int flag);
/* Option -help and part of -prog_help */
int Xorriso_option_help(struct XorrisO *xorriso, int flag);
@ -332,7 +345,8 @@ int Xorriso_option_joliet(struct XorrisO *xorriso, char *mode, int flag);
int Xorriso_option_list_formats(struct XorrisO *xorriso, int flag);
/* Option -load session|track|sbsector value */
/* @return <=0 error , 1 success, 2 revoked by -reassure
/* @param flag bit0= with adr_mode sbsector: adr_value is possibly 16 too high
@return <=0 error , 1 success, 2 revoked by -reassure
*/
int Xorriso_option_load(struct XorrisO *xorriso, char *adr_mode,
char *adr_value, int flag);
@ -394,6 +408,9 @@ int Xorriso_option_no_rc(struct XorrisO *xorriso, int flag);
/* Option -not_leaf */
int Xorriso_option_not_leaf(struct XorrisO *xorriso, char *pattern, int flag);
/* Option -not_list */
int Xorriso_option_not_list(struct XorrisO *xorriso, char *adr, int flag);
/* Option -not_paths */
int Xorriso_option_not_paths(struct XorrisO *xorriso, int argc, char **argv,
int *idx, int flag);
@ -409,6 +426,9 @@ int Xorriso_option_osirrox(struct XorrisO *xorriso, char *mode, int flag);
/* Option -overwrite "on"|"nondir"|"off" */
int Xorriso_option_overwrite(struct XorrisO *xorriso, char *mode, int flag);
/* Option -pacifier */
int Xorriso_option_pacifier(struct XorrisO *xorriso, char *style, int flag);
/* Option -padding */
int Xorriso_option_padding(struct XorrisO *xorriso, char *size, int flag);

View File

@ -0,0 +1,3 @@
#ifndef Xorriso_build_timestamP
#define Xorriso_build_timestamP "-none-given-"
#endif

View File

@ -0,0 +1,3 @@
#ifndef Xorriso_build_timestamP
#define Xorriso_build_timestamP "-none-given-"
#endif

View File

@ -60,7 +60,7 @@ and to MMC-5 for DVD or BD).
GPL software included:<BR>
</H2>
<DL>
<DT>libburn-0.4.9</DT>
<DT>libburn-0.5.1</DT>
<DD>reads and writes data from and to CD, DVD, BD-RE.</DD>
<DD>(founded by Derek Foreman and Ben Jansens,
furthered since August 2006 by
@ -68,7 +68,7 @@ Thomas Schmitt from team of libburnia-project.org)</DD>
<DT>libisofs-0.6.6</DT>
<DD>operates on ISO 9660 filesystem images.</DD>
<DD>(By Vreixo Formoso and Mario Danic from team of libburnia-project.org)</DD>
<DT>libisoburn-0.2.0</DT>
<DT>libisoburn-0.2.2</DT>
<DD>coordinates libburn and libisofs, emulates multi-session where needed.</DD>
<DD>(By Vreixo Formoso and Thomas Schmitt
from team of libburnia-project.org)</DD>
@ -107,12 +107,11 @@ Changes file properties in the ISO image.
Updates ISO subtrees incrementally to match given disk subtrees.
</LI>
<LI>
Can write result as completely new image to optical media or
filesystem objects.
Writes result as completely new image or as add-on session
to optical media or filesystem objects.
</LI>
<LI>
Can write result as add-on session to appendable multi-session media,
to overwriteable media, to regular files, and to block devices.
Can perform multi-session tasks as emulation of mkisofs and cdrecord.
</LI>
<LI>
Can restore single files and whole trees from ISO image to disk filesystem.
@ -280,6 +279,24 @@ with an external consumer of the generated ISO image. Any message
output will be redirected to stderr in this case.</DT>
<DD>$<KBD>&nbsp;xorriso -outdev - ...other.options... | consumer</KBD></DD>
<DT>
<HR>
</DT>
<DT>
Let xorriso serve underneath growisofs via its alias name "xorrisofs"
which enables mkisofs emulation:
</DT>
<DD>$<KBD>&nbsp;export MKISOFS="xorrisofs"</KBD></DD>
<DD>$<KBD>&nbsp;growisofs -Z /dev/dvd /some/files</KBD></DD>
<DD>$<KBD>&nbsp;growisofs -M /dev/dvd /more/files</KBD></DD>
<DT>
One may switch from mkisofs emulation to xorriso's own command mode:
</DT>
<DD>$<KBD>&nbsp;growisofs -M /dev/dvd -- outdev - -update_r /my/files /files
</KBD></DD>
<DT>
<HR>
</DT>
@ -315,8 +332,8 @@ are interested in using BD-R media.
<P>
<DL>
<DT><H3>Download as source code (see README):</H3></DT>
<DD><A HREF="xorriso-0.2.0.pl00.tar.gz">xorriso-0.2.0.pl00.tar.gz</A>
(1000 KB).
<DD><A HREF="xorriso-0.2.2.pl00.tar.gz">xorriso-0.2.2.pl00.tar.gz</A>
(1020 KB).
</DD>
</DL>
</DD>
@ -341,22 +358,30 @@ an <A HREF="http://www.opensource.org/">Open Source</A> approved license</DD>
<HR>
<P>
Bug fixes towards xorriso-0.1.8.pl00:
Bug fixes towards xorriso-0.2.0.pl00:
<UL>
<LI>
-chmod unintentionally performed o-x as first operation
</LI>
<LI>libburn could not access drives /dev/scdN without existing /dev/srN</LI>
</UL>
</P>
<P>
Enhancements towards previous stable version xorriso-0.1.8.pl00:
Enhancements towards previous stable version xorriso-0.2.0.pl00:
<UL>
<LI>New option -extract restores with arguments of -map or -update_r</LI>
<LI>
New options -cpax, -cp_rx, -cp_rax to restore files and trees from ISO to disk
<LI>New option -grow_blindly</LI>
<LI>Options -C and -M with -as mkisofs emulation</LI>
<LI>Options with -as cdrecord emulation:<BR>
-multi , -msinfo , --grow_overwriteable_iso , write_start_address= ,
-isosize , tsize=
</LI>
<LI>New option -paste_in to copy ISO files into parts of disk files</LI>
<LI>New options -map_l, -compare_l, -update_l, -extract_l</LI>
<LI>make install creates xorriso aliases as symbolic links:
osirrox, xorrisofs, xorrecord
</LI>
<LI>
Can serve growisofs if started as xorrisofs, genisofs, mkisofs, genisoimage
</LI>
</UL>
</P>
@ -364,16 +389,15 @@ New options -cpax, -cp_rx, -cp_rax to restore files and trees from ISO to disk
<P>
<DL>
<DT><H3>Development snapshot, version 0.2.1 :</H3></DT>
<DD>Bug fixes towards xorriso-0.2.0.pl00:
<DT><H3>Development snapshot, version 0.2.3 :</H3></DT>
<DD>Bug fixes towards xorriso-0.2.2.pl00:
<UL>
</LI>
<LI>- none yet -</LI>
<!--
-->
</UL>
</DD>
<DD>Enhancements towards stable version 0.2.0.pl00:
<DD>Enhancements towards stable version 0.2.2.pl00:
<UL>
<LI>- none yet -</LI>
<!--
@ -381,9 +405,9 @@ New options -cpax, -cp_rx, -cp_rax to restore files and trees from ISO to disk
</UL>
</DD>
<DD>&nbsp;</DD>
<DD><A HREF="README_xorriso_devel">README 0.2.1</A>
<DD><A HREF="xorriso_help_devel">xorriso_0.2.1 -help</A></DD>
<DD><A HREF="man_1_xorriso_devel.html">man xorriso (as of 0.2.1)</A></DD>
<DD><A HREF="README_xorriso_devel">README 0.2.3</A>
<DD><A HREF="xorriso_help_devel">xorriso_0.2.3 -help</A></DD>
<DD><A HREF="man_1_xorriso_devel.html">man xorriso (as of 0.2.3)</A></DD>
<DD>&nbsp;</DD>
<DT>If you want to distribute development versions of xorriso, then use
this tarball which produces static linking between xorriso and the
@ -393,8 +417,8 @@ libburnia libraries.
installation see README)
</DD>
<DD>
<A HREF="xorriso-0.2.1.tar.gz">xorriso-0.2.1.tar.gz</A>
(1000 KB).
<A HREF="xorriso-0.2.3.tar.gz">xorriso-0.2.3.tar.gz</A>
(1020 KB).
</DD>
<DT>A dynamically linked development version of xorriso can be obtained
from repositories of

View File

@ -20,6 +20,17 @@ xorriso_xorriso_CFLAGS = -DXorriso_standalonE -DXorriso_with_maiN -DXorriso_with
xorriso_xorriso_LDADD = $(THREAD_LIBS)
# Trying to create a build timestamp file
#
BUILT_SOURCES = xorriso/xorriso_buildstamp.h
# phony targets get rebuilt every time
.PHONY: xorriso/xorriso_buildstamp.h
xorriso/xorriso_buildstamp.h:
date -u '+#define Xorriso_build_timestamP "%Y.%m.%d.%H%M%S"' >xorriso/xorriso_buildstamp.h
cat xorriso/xorriso_buildstamp.h
xorriso_xorriso_SOURCES = \
\
xorriso/xorriso.h \
@ -28,6 +39,7 @@ xorriso_xorriso_SOURCES = \
xorriso/xorrisoburn.h \
xorriso/xorrisoburn.c \
xorriso/xorriso_timestamp.h \
xorriso/xorriso_buildstamp.h \
\
libisoburn/libisoburn.h \
libisoburn/isoburn.h \
@ -137,7 +149,6 @@ xorriso_xorriso_SOURCES = \
\
version.h
noinst_PROGRAMS = \
test/compare_file
@ -151,6 +162,41 @@ test_compare_file_LDADD =
test_compare_file_SOURCES = test/compare_file.c
# Install symbolic links to the xorriso binary
#
install-exec-hook:
if test -e $(bindir)/xorrisofs ; then rm $(bindir)/xorrisofs ; else echo ; fi
ln -s xorriso $(bindir)/xorrisofs
if test -e $(bindir)/osirrox ; then rm $(bindir)/osirrox ; else echo ; fi
ln -s xorriso $(bindir)/osirrox
if test -e $(bindir)/xorrecord ; then rm $(bindir)/xorrecord ; else echo ; fi
ln -s xorriso $(bindir)/xorrecord
# <<< seems to be outperformed by the .PHONY above
# Trying to create a build timestamp file
#
buildstamp:
date -u '+#define Xorriso_build_timestamP "%Y.%m.%d.%H%M%S"' >xorriso/xorriso_buildstamp.h
cat xorriso/xorriso_buildstamp.h
# For now make buildstamped has to be performed manually.
buildstamped: buildstamp
make
#
# Processing of the "all:" rule happens too late.
# How to create a dependency of xorriso.c on buildstamp ?
# Not working:
# Add xorriso_buildstamp.h to xorriso_xorriso_SOURCES and make it depend
# on buildstamp. It runs. But at quite random occasions.
# xorriso/xorriso_buildstamp.h: buildstamp
#
# all: buildstamp
# <<< seems to be outperformed by the .PHONY above
## ========================================================================= ##
# Indent source files
@ -184,6 +230,7 @@ EXTRA_DIST = \
COPYING \
INSTALL \
xorriso/changelog.txt \
xorriso/xorriso_buildstamp_none.h \
$(man_MANS)

View File

@ -18,7 +18,7 @@
#ifndef Xorriso_private_includeD
#define Xorriso_private_includeD yes
#define Xorriso_program_versioN "0.2.0"
#define Xorriso_program_versioN "0.2.2"
/** The source code release timestamp */
#include "xorriso_timestamp.h"
@ -26,7 +26,10 @@
#define Xorriso_timestamP "-none-given-"
#endif
/** The binary build timestamp is to be set externally by the compiler */
/** The binary build timestamp is to be set externally by the compiler
or by a macro definition in xorriso_buildstamp.h.
*/
#include "xorriso_buildstamp.h"
#ifndef Xorriso_build_timestamP
#define Xorriso_build_timestamP "-none-given-"
#endif
@ -71,6 +74,13 @@ struct XorrisO { /* the global context of xorriso */
char initial_wdx[SfileadrL];
int no_rc;
/* Command line argument emulations:
0=xorriso mode
1=mkisofs mode
2=cdrecord mode
*/
int argument_emulation;
/** List of startupfiles */
char rc_filenames[Xorriso_rc_nuM][SfileadrL];
int rc_filename_count;
@ -123,6 +133,8 @@ struct XorrisO { /* the global context of xorriso */
1= value is session number
2= value is track number
3= value is lba
bit16= with mode 3 : value is possibly 16 too high.
Let isoburn_set_msc1() adjust it.
bit30= interference with normal msc1 processing
is enabled. Without this bit,
isoburn_set_msc1() will not be called.
@ -145,6 +157,11 @@ struct XorrisO { /* the global context of xorriso */
connected to externaly perveived stdout.
*/
int grow_blindly_msc2; /* if >= 0 this causes growing from drive to drive.
The value is used as block address offset for
image generation. Like in: mkisofs -C msc1,msc2
*/
int ban_stdio_write;
int do_dummy;
int do_close;
@ -256,6 +273,7 @@ struct XorrisO { /* the global context of xorriso */
double error_count; /* double will not roll over */
/* pacifiers */
int pacifier_style; /* 0= xorriso, 1=mkisofs 2=cdrecord */
double pacifier_interval;
double start_time;
double last_update_time;
@ -434,6 +452,8 @@ int Xorriso_reassure_restore(struct XorrisO *xorriso, char *path, int flag);
int Xorriso_auto_chmod(struct XorrisO *xorriso, char *disk_path, int flag);
int Xorriso_protect_stdout(struct XorrisO *xorriso, int flag);
int Sfile_str(char target[SfileadrL], char *source, int flag);
@ -479,6 +499,12 @@ int Sort_argv(int argc, char **argv, int flag);
/* @param flag bit0= single letters */
char *Ftypetxt(mode_t st_mode, int flag);
/* @param flag bit0=with year and seconds
bit1=timestamp format YYYY.MM.DD.hhmmss
*/
char *Ftimetxt(time_t t, char timetext[40], int flag);
struct DirseQ;
int Dirseq_new(struct DirseQ **o, char *adr, int flag);

View File

@ -1 +1 @@
#define Xorriso_timestamP "2008.06.22.090001"
#define Xorriso_timestamP "2008.07.18.120001"

View File

@ -409,6 +409,7 @@ int Xorriso_create_empty_iso(struct XorrisO *xorriso, int flag)
bit2= regard overwriteable media as blank
bit3= if the drive is a regular disk file: truncate it to
the write start address
bit5= do not print toc
@return <=0 failure , 1= ok
2=success, but not writeable with bit1
3=success, but not blank and not ISO with bit0
@ -486,7 +487,8 @@ int Xorriso_aquire_drive(struct XorrisO *xorriso, char *adr, int flag)
xorriso->image_start_mode&= ~0xffff; /* perform auto setting */
if((xorriso->image_start_mode&(1<<30))) { /* if enabled at all */
ret= isoburn_set_msc1(drive, xorriso->image_start_mode & 0xffff,
xorriso->image_start_value, 0);
xorriso->image_start_value,
!!(xorriso->image_start_mode & (1<<16)));
if(ret<=0)
goto ex;
if(xorriso->image_start_mode&(1<<31))
@ -534,7 +536,8 @@ int Xorriso_aquire_drive(struct XorrisO *xorriso, char *adr, int flag)
{ret= -1; goto ex;}
}
}
Xorriso_toc(xorriso, 1|2);
if(!(flag&32))
Xorriso_toc(xorriso, 1|2);
{ret= 1+not_writeable; goto ex;}
}
@ -578,7 +581,7 @@ int Xorriso_aquire_drive(struct XorrisO *xorriso, char *adr, int flag)
if(ret<=0) {
Xorriso_process_msg_queues(xorriso,0);
Xorriso_set_image_severities(xorriso, 0);
Xorriso_give_up_drive(xorriso, 1);
Xorriso_give_up_drive(xorriso, 1|((flag&32)>>2));
sprintf(xorriso->info_text,"Cannot read ISO image tree");
sev= "FAILURE";
if(xorriso->img_read_error_mode==2)
@ -618,22 +621,24 @@ int Xorriso_aquire_drive(struct XorrisO *xorriso, char *adr, int flag)
boot_fate);
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "NOTE", 0);
}
Xorriso_toc(xorriso, 1);
if(xorriso->loaded_volid[0]!=0) {
sprintf(xorriso->result_line,"Volume id : '%s'\n",xorriso->loaded_volid);
Xorriso_result(xorriso,0);
if(strcmp(xorriso->loaded_volid, xorriso->volid)!=0 &&
!xorriso->volid_default) {
sprintf(xorriso->result_line, "New volume id: '%s'\n", xorriso->volid);
if(!(flag&32)) {
Xorriso_toc(xorriso, 1);
if(xorriso->loaded_volid[0]!=0) {
sprintf(xorriso->result_line,"Volume id : '%s'\n",
xorriso->loaded_volid);
Xorriso_result(xorriso,0);
if(strcmp(xorriso->loaded_volid, xorriso->volid)!=0 &&
!xorriso->volid_default) {
sprintf(xorriso->result_line, "New volume id: '%s'\n", xorriso->volid);
Xorriso_result(xorriso,0);
}
}
}
ret= 1+not_writeable;
ex:
Xorriso_process_msg_queues(xorriso,0);
if(ret<=0) {
hret= Xorriso_give_up_drive(xorriso, flag&3);
hret= Xorriso_give_up_drive(xorriso, (flag&3)|((flag&32)>>2));
if(hret<ret)
ret= hret;
}
@ -812,7 +817,7 @@ int Xorriso_write_session(struct XorrisO *xorriso, int flag)
int ret, relax= 0, i, profile, status, num_formats;
int major, minor, micro;
unsigned dummy;
char xorriso_id[256], *img_id, profile_name[80];
char xorriso_id[256], *img_id, profile_name[80], sfe[5*SfileadrL];
struct isoburn_imgen_opts *sopts= NULL;
struct burn_drive_info *dinfo, *source_dinfo;
struct burn_drive *drive, *source_drive;
@ -952,18 +957,30 @@ int Xorriso_write_session(struct XorrisO *xorriso, int flag)
if(ret<0)
{ret= 0; goto ex;}
Xorriso_set_abort_severity(xorriso, 1);
if(xorriso->out_drive_handle == xorriso->in_drive_handle ||
xorriso->in_drive_handle == NULL) {
if (xorriso->grow_blindly_msc2 >= 0 &&
xorriso->out_drive_handle != xorriso->in_drive_handle) {
ret= isoburn_prepare_blind_grow(source_drive, &disc, sopts, drive,
xorriso->grow_blindly_msc2);
if(ret>0) {
/* Allow the consumer of output to access the input drive */
source_drive= NULL;
ret= Xorriso_give_up_drive(xorriso, 1|8);
if(ret<=0)
goto ex;
}
} else if(xorriso->out_drive_handle == xorriso->in_drive_handle ||
xorriso->in_drive_handle == NULL) {
ret= isoburn_prepare_disc(source_drive, &disc, sopts);
} else {
ret= isoburn_prepare_new_image(source_drive, &disc, sopts, drive);
}
if (ret <= 0) {
if(ret <= 0) {
Xorriso_process_msg_queues(xorriso,0);
sprintf(xorriso->info_text,"Failed to prepare session write run");
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
{ret= 0; goto ex;}
}
isoburn_igopt_get_effective_lba(sopts, &(xorriso->session_lba));
ret= Xorriso_make_write_options(xorriso, drive, &burn_options, 0);
@ -1010,7 +1027,6 @@ int Xorriso_write_session(struct XorrisO *xorriso, int flag)
Xorriso_info(xorriso, 0);
}
}
ret= isoburn_activate_session(drive);
Xorriso_process_msg_queues(xorriso,0);
if(ret<=0) {
@ -1027,7 +1043,8 @@ int Xorriso_write_session(struct XorrisO *xorriso, int flag)
isoburn_sync_after_write(source_drive, drive, 0);
Xorriso_process_msg_queues(xorriso,0);
sprintf(xorriso->info_text, "Writing completed sucessfully.\n\n");
sprintf(xorriso->info_text, "Writing to %s completed sucessfully.\n\n",
Text_shellsafe(xorriso->outdev,sfe,0));
Xorriso_info(xorriso, 0);
ret= 1;
ex:;
@ -1080,7 +1097,8 @@ int Xorriso_check_burn_abort(struct XorrisO *xorriso, int flag)
It issues pacifying update messages to the user.
@param flag bit0-3 = emulation mode
0= xorriso
1= cdrskin
1= mkisofs
2= cdrecord
bit4= report speed in CD units
*/
int Xorriso_pacifier_loop(struct XorrisO *xorriso, struct burn_drive *drive,
@ -1088,16 +1106,19 @@ int Xorriso_pacifier_loop(struct XorrisO *xorriso, struct burn_drive *drive,
{
int ret, size, free_bytes, i, aborting= 0, emul, buffer_fill= 50, last_sector;
struct burn_progress progress;
char *status_text;
char *status_text, date_text[80];
enum burn_drive_status drive_status;
double start_time, current_time, last_time;
double measured_speed, speed_factor= 1385000;
double measured_speed, speed_factor= 1385000, quot;
time_t time_prediction;
start_time= Sfile_microtime(0);
while(burn_drive_get_status(drive, NULL) == BURN_DRIVE_SPAWNING)
usleep(100002);
emul= flag&15;
if(emul==0)
emul= xorriso->pacifier_style;
if(flag&16)
speed_factor= 150.0*1024;
progress.sector= 0;
@ -1110,7 +1131,7 @@ int Xorriso_pacifier_loop(struct XorrisO *xorriso, struct burn_drive *drive,
break;
current_time= Sfile_microtime(0);
if(drive_status == BURN_DRIVE_WRITING && progress.sectors > 0) {
if(emul==1) {
if(emul==2) {
if(progress.sector<=progress.sectors)
sprintf(xorriso->info_text, "%4d of %4d MB written",
progress.sector / 512, progress.sectors / 512);
@ -1118,14 +1139,15 @@ int Xorriso_pacifier_loop(struct XorrisO *xorriso, struct burn_drive *drive,
sprintf(xorriso->info_text, "%4d MB written",
progress.sector / 512);
if(xorriso->pacifier_fifo!=NULL) {
if(xorriso->pacifier_fifo!=NULL)
ret= burn_fifo_inquire_status(xorriso->pacifier_fifo,
&size, &free_bytes, &status_text);
if(ret>0 )
sprintf(xorriso->info_text+strlen(xorriso->info_text),
" (fifo %2d%%)",
(int) (100.0-100.0*((double) free_bytes)/(double) size));
}
else
ret= isoburn_get_fifo_status(drive, &size, &free_bytes, &status_text);
if(ret>0 )
sprintf(xorriso->info_text+strlen(xorriso->info_text),
" (fifo %2d%%)",
(int) (100.0-100.0*((double) free_bytes)/(double) size));
buffer_fill= 50;
if(progress.buffer_capacity>0)
@ -1142,6 +1164,19 @@ int Xorriso_pacifier_loop(struct XorrisO *xorriso, struct burn_drive *drive,
measured_speed/speed_factor);
}
} else if(emul == 1 &&
progress.sectors > 0 && progress.sector <= progress.sectors) {
/* "37.87% done, estimate finish Tue Jul 15 18:55:07 2008" */
quot= ((double) progress.sector) / ((double) progress.sectors);
sprintf(xorriso->info_text, " %2.2f%% done", quot*100.0);
if(current_time - start_time >= 2 && quot >= 0.02) {
time_prediction= current_time +
(1.0 - quot) / quot * (current_time-start_time) + 1;
Ftimetxt(time_prediction, date_text, 4);
sprintf(xorriso->info_text+strlen(xorriso->info_text),
", estimate finish %s", date_text);
}
} else {
if(progress.sector<=progress.sectors)
sprintf(xorriso->info_text, "Writing: sector %d of %d",
@ -3606,7 +3641,7 @@ int Xorriso_toc(struct XorrisO *xorriso, int flag)
int Xorriso_show_devices(struct XorrisO *xorriso, int flag)
{
char adr[BURN_DRIVE_ADR_LEN];
int i;
int i, j, max_dev_len= 1, pad;
struct burn_drive_info *drive_list= NULL;
unsigned int drive_count;
char *respt, perms[8];
@ -3633,7 +3668,16 @@ int Xorriso_show_devices(struct XorrisO *xorriso, int flag)
sprintf(xorriso->info_text, "Full drive scan done\n");
Xorriso_info(xorriso,0);
sprintf(xorriso->info_text, "-----------------------------------------------------------------------------\n");
Xorriso_info(xorriso,0);
respt= xorriso->result_line;
for(i= 0; i < drive_count && !(xorriso->request_to_abort); i++) {
if(burn_drive_get_adr(&(drive_list[i]), adr)<=0)
strcpy(adr, "-get_adr_failed-");
Xorriso_process_msg_queues(xorriso,0);
if(strlen(adr)>max_dev_len)
max_dev_len= strlen(adr);
}
for(i= 0; i < drive_count && !(xorriso->request_to_abort); i++) {
if(burn_drive_get_adr(&(drive_list[i]), adr)<=0)
strcpy(adr, "-get_adr_failed-");
@ -3649,10 +3693,18 @@ int Xorriso_show_devices(struct XorrisO *xorriso, int flag)
if(stbuf.st_mode&S_IROTH) perms[4]= 'r';
if(stbuf.st_mode&S_IWOTH) perms[5]= 'w';
}
sprintf(respt, "%d -dev '%s' %s : '%-8.8s' '%s' \n",
i, adr, perms, drive_list[i].vendor, drive_list[i].product);
sprintf(respt, "%d -dev '%s' ", i, adr);
pad= max_dev_len-strlen(adr);
if(pad>0)
for(j= 0; j<pad; j++)
strcat(respt, " ");
sprintf(respt+strlen(respt), "%s : '%-8.8s' '%s' \n",
perms, drive_list[i].vendor, drive_list[i].product);
Xorriso_result(xorriso,0);
}
sprintf(xorriso->info_text, "-----------------------------------------------------------------------------\n");
Xorriso_info(xorriso,0);
burn_drive_info_free(drive_list);
Xorriso_process_msg_queues(xorriso,0);
return(1);
@ -5871,8 +5923,10 @@ int Xorriso_atip(struct XorrisO *xorriso, int flag)
if(strstr(profile_name,"DVD")==profile_name) {
sprintf(respt, "book type: %s (emulated booktype)\n", profile_name);
Xorriso_result(xorriso,1);
sprintf(respt, "xorriso: message for sdvdbackup: \"(growisofs mode Restricted Overwrite)\"\n");
Xorriso_result(xorriso,1);
if(profile_number == 0x13) {
sprintf(respt, "xorriso: message for sdvdbackup: \"(growisofs mode Restricted Overwrite)\"\n");
Xorriso_result(xorriso,1);
}
} else {
sprintf(respt, "ATIP info from disk:\n");
Xorriso_result(xorriso,1);
@ -5906,9 +5960,16 @@ int Xorriso_atip(struct XorrisO *xorriso, int flag)
}
int Xorriso_burn_track(struct XorrisO *xorriso, char *track_source, int flag)
/* @param write_start_address is valid if >=0
@param tsize is valid if >0
@param flag bit0= grow_overwriteable_iso
bit1= do_isosize
*/
int Xorriso_burn_track(struct XorrisO *xorriso, off_t write_start_address,
char *track_source, off_t tsize, int flag)
{
int ret, fd, unpredicted_size, profile_number, is_cd= 0;
int ret, fd, unpredicted_size, profile_number, is_cd= 0, dummy, nwa= -1;
int isosize= -1, i, full_size, do_isosize;
struct burn_drive_info *dinfo;
struct burn_drive *drive;
struct burn_write_opts *burn_options;
@ -5920,8 +5981,9 @@ int Xorriso_burn_track(struct XorrisO *xorriso, char *track_source, int flag)
struct burn_source *data_src, *fifo_src;
enum burn_disc_status disc_state;
char reasons[BURN_REASONS_LEN], sfe[5*SfileadrL], profile_name[80];
char head_buffer[64*1024], *headpt;
do_isosize= !!(flag&2);
ret= Xorriso_get_drive_handles(xorriso, &dinfo, &drive,
"on attempt to burn track", 2);
if(ret<=0)
@ -5934,7 +5996,8 @@ int Xorriso_burn_track(struct XorrisO *xorriso, char *track_source, int flag)
session= burn_session_create();
ret= burn_disc_add_session(disc,session,BURN_POS_END);
if(ret==0) {
/* >>> */;
sprintf(xorriso->info_text, "Cannot add session object to disc object.");
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FATAL", 0);
goto ex;
}
track= burn_track_create();
@ -5959,6 +6022,8 @@ int Xorriso_burn_track(struct XorrisO *xorriso, char *track_source, int flag)
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, errno, "FAILURE", 0);
ret= 0; goto ex;
}
if(do_isosize && xorriso->fs < 64)
xorriso->fs= 64;
fifo_src= burn_fifo_source_new(data_src, 2048, xorriso->fs, 0);
if(fifo_src == NULL) {
sprintf(xorriso->info_text, "Could not create fifo object of 4 MB");
@ -5975,20 +6040,19 @@ int Xorriso_burn_track(struct XorrisO *xorriso, char *track_source, int flag)
burn_session_add_track(session, track, BURN_POS_END);
burn_source_free(data_src);
disc_state = burn_disc_get_status(drive);
if(disc_state == BURN_DISC_BLANK) {
if(flag&1)
/* consider overwriteables with ISO as appendable */
disc_state= isoburn_disc_get_status(drive);
else
/* handle overwriteables as always blank */
disc_state= burn_disc_get_status(drive);
if(disc_state == BURN_DISC_BLANK || disc_state == BURN_DISC_APPENDABLE) {
/* ok */;
} else if(disc_state == BURN_DISC_APPENDABLE) {
if(!isoburn_needs_emulation(drive)) {
sprintf(xorriso->info_text,
"Appendable media with data detected. Need blank media.");
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
ret= 0; goto ex;
}
} else {
if(disc_state == BURN_DISC_FULL) {
sprintf(xorriso->info_text,
"Closed media with data detected. Need blank media.");
"Closed media with data detected. Need blank or appendable media.");
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
if(burn_disc_erasable(drive)) {
sprintf(xorriso->info_text, "Try --blank_fast\n");
@ -6004,6 +6068,66 @@ int Xorriso_burn_track(struct XorrisO *xorriso, char *track_source, int flag)
}
ret= 0; goto ex;
}
if(isoburn_needs_emulation(drive))
burn_write_opts_set_multi(burn_options, 0);
if(tsize > 0) {
fixed_size= tsize;
burn_track_set_size(track, fixed_size);
}
if(do_isosize) {
ret= burn_fifo_peek_data(xorriso->pacifier_fifo, head_buffer, 64*1024, 0);
if(ret<=0) {
Xorriso_process_msg_queues(xorriso,0);
sprintf(xorriso->info_text,
"Cannot obtain first 64 kB from input stream.");
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
ret= 0; goto ex;
}
/* read isosize from head_buffer, not from media*/
ret= isoburn_read_iso_head(drive, 0, &isosize, head_buffer, (1<<13));
if(ret<=0) {
Xorriso_process_msg_queues(xorriso,0);
sprintf(xorriso->info_text,
"Option -isosize given but data stream seems not to be ISO 9660");
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
ret= 0; goto ex;
}
sprintf(xorriso->info_text, "Size of ISO 9660 image: %ds", isosize);
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "NOTE", 0);
fixed_size= ((off_t) (isosize)) * (off_t) 2048;
burn_track_set_size(track, fixed_size);
}
ret= Xorriso_get_profile(xorriso, &profile_number, profile_name, 2);
is_cd= (ret==2);
if(isoburn_needs_emulation(drive)) {
if(flag&1) {
ret= isoburn_disc_track_lba_nwa(drive, burn_options, 0, &dummy, &nwa);
if(ret<=0) {
Xorriso_process_msg_queues(xorriso,0);
sprintf(xorriso->info_text,
"Cannot obtain next writeable address of emulated multi-session media\n");
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
ret= 0; goto ex;
}
if(nwa==32)
nwa= 0; /* No automatic toc emulation. Formatter might not be aware. */
burn_write_opts_set_start_byte(burn_options,((off_t) nwa) * (off_t) 2048);
} else {
nwa= 0;
burn_write_opts_set_start_byte(burn_options, (off_t) 0);
}
}
if(write_start_address>=0) {
nwa= write_start_address / (off_t) 2048;
if(((off_t) nwa) * (off_t) 2048 < write_start_address )
nwa++;
burn_write_opts_set_start_byte(burn_options, ((off_t) nwa) * (off_t) 2048);
}
if(burn_write_opts_auto_write_type(burn_options, disc, reasons, 0) ==
BURN_WRITE_NONE) {
sprintf(xorriso->info_text,
@ -6014,10 +6138,6 @@ int Xorriso_burn_track(struct XorrisO *xorriso, char *track_source, int flag)
ret= 0; goto ex;
}
ret= Xorriso_get_profile(xorriso, &profile_number, profile_name, 2);
is_cd= (ret==2);
if(isoburn_needs_emulation(drive))
burn_write_opts_set_start_byte(burn_options, (off_t) 0);
ret= Xorriso_sanitize_image_size(xorriso, drive, disc, burn_options, 2);
if(ret<=0)
goto ex;
@ -6025,7 +6145,7 @@ int Xorriso_burn_track(struct XorrisO *xorriso, char *track_source, int flag)
xorriso->run_state= 1; /* Indicate that burning has started */
burn_disc_write(burn_options, disc);
ret= Xorriso_pacifier_loop(xorriso, drive, 1|(is_cd<<4));
ret= Xorriso_pacifier_loop(xorriso, drive, 2|(is_cd<<4));
if(ret<=0)
goto ex;
if(!burn_drive_wrote_well(drive)) {
@ -6036,7 +6156,37 @@ int Xorriso_burn_track(struct XorrisO *xorriso, char *track_source, int flag)
ret= 0; goto ex;
}
sprintf(xorriso->info_text, "Writing completed sucessfully.\n\n");
/* Update ISO header at lba 0 */
if((flag&1) && nwa >= 32) {
if(!do_isosize) {
/* head_buffer was not filled yet. Read it from output media. */
ret= isoburn_read_iso_head(drive, nwa, &isosize, head_buffer, 2);
if(ret<=0) {
Xorriso_process_msg_queues(xorriso,0);
sprintf(xorriso->info_text,
"Cannot read freshly written ISO image head");
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
ret= 0; goto ex;
}
}
/* patch ISO header */
full_size= nwa + isosize;
headpt= head_buffer + 32*1024;
for(i=0;i<4;i++)
headpt[87-i]= headpt[80+i]= (full_size >> (8*i)) & 0xff;
ret= burn_random_access_write(drive, (off_t) 0, head_buffer,
(off_t) (64*1024), 1);
if(ret<=0) {
Xorriso_process_msg_queues(xorriso,0);
sprintf(xorriso->info_text,
"Cannot write new ISO image head to LBA 0");
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
ret= 0; goto ex;
}
}
sprintf(xorriso->info_text, "Writing to %s completed sucessfully.\n\n",
Text_shellsafe(xorriso->outdev,sfe,0));
Xorriso_info(xorriso, 0);
ret= 1;
ex:;
@ -6051,7 +6201,6 @@ ex:;
}
/* @param flag bit1= outdev rather than indev
@return <0 error, 0 = no profile to see , 1= ok , 2= ok, is CD profile
*/
@ -6328,3 +6477,66 @@ int Xorriso_is_split(struct XorrisO *xorriso, char *path, void *node,
return(ret>0);
}
int Xorriso_libburn_adr(struct XorrisO *xorriso, char *path, char adr[],
int flag)
{
int ret;
char local_adr[BURN_DRIVE_ADR_LEN];
adr[0]= 0;
ret= burn_drive_convert_fs_adr(path, local_adr);
Xorriso_process_msg_queues(xorriso,0);
if(ret<=0)
return(ret);
if(strlen(local_adr)>=SfileadrL)
return(2);
strcpy(adr, local_adr);
return(1);
}
/* @param flag bit0= grow_overwriteable_iso
bit1= obtain info from outdev
*/
int Xorriso_msinfo(struct XorrisO *xorriso, int *msc1, int *msc2, int flag)
{
int ret, dummy;
struct burn_drive *drive;
struct burn_drive_info *dinfo;
enum burn_disc_status disc_state;
ret= Xorriso_get_drive_handles(xorriso, &dinfo, &drive,
"on attempt to obtain msinfo", flag&2);
if(ret<=0)
return(ret);
if(flag&1)
disc_state= isoburn_disc_get_status(drive);
else
disc_state= burn_disc_get_status(drive);
if(disc_state != BURN_DISC_APPENDABLE) {
Xorriso_process_msg_queues(xorriso,0);
sprintf(xorriso->info_text,
"%s media is not appendable. Cannot obtain -msinfo.",
(flag&2) ? "Output" : "Input");
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
return(0);
}
ret= isoburn_disc_get_msc1(drive, msc1);
if(ret<=0) {
Xorriso_process_msg_queues(xorriso,0);
sprintf(xorriso->info_text, "Cannot obtain address of most recent session");
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
return(0);
}
ret= isoburn_disc_track_lba_nwa(drive, NULL, 0, &dummy, msc2);
if(ret<0) {
Xorriso_process_msg_queues(xorriso,0);
sprintf(xorriso->info_text, "Cannot obtain next writeable address on media");
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
return(0);
}
return(1);
}

View File

@ -21,7 +21,7 @@ struct FindjoB;
*/
#define xorriso_libisoburn_req_major 0
#define xorriso_libisoburn_req_minor 2
#define xorriso_libisoburn_req_micro 0
#define xorriso_libisoburn_req_micro 2
int Xorriso_startup_libraries(struct XorrisO *xorriso, int flag);
@ -188,7 +188,13 @@ int Xorriso_iso_lstat(struct XorrisO *xorriso, char *path, struct stat *stbuf,
*/
int Xorriso_atip(struct XorrisO *xorriso, int flag);
int Xorriso_burn_track(struct XorrisO *xorriso, char *track_source, int flag);
/* @param write_start_address is valid if >=0
@param tsize is valid if >0
@param flag bit0= grow_overwriteable_iso
bit1= do_isosize
*/
int Xorriso_burn_track(struct XorrisO *xorriso, off_t write_start_address,
char *track_source, off_t tsize, int flag);
/* @param flag bit1= outdev rather than indev
@return <=0 = failure , 1= ok , 2= ok, is CD profile
@ -259,5 +265,20 @@ int Xorriso_restore_is_identical(struct XorrisO *xorriso, void *in_node,
char *img_path, char *disk_path,
char type_text[5], int flag);
/* Return the official libburn address of an address string. This may fail
if the string does not constitute a valid drive address.
@param official_adr must offer SfileadrL bytes of reply buffer
@return 1 = success , 0 = failure , -1 = severe error
*/
int Xorriso_libburn_adr(struct XorrisO *xorriso, char *address_string,
char official_adr[], int flag);
/* @param flag bit1= obtain info from outdev
*/
int Xorriso_msinfo(struct XorrisO *xorriso, int *msc1, int *msc2, int flag);
#endif /* Xorrisoburn_includeD */