From 14b17cc131b32f6d3cf78ecba2553984b699cdf8 Mon Sep 17 00:00:00 2001 From: Thomas Schmitt Date: Tue, 17 Nov 2009 13:41:28 +0000 Subject: [PATCH] New options -dvd_obs and -stdio_sync --- libisoburn/trunk/xorriso/xorriso.1 | 25 ++++- libisoburn/trunk/xorriso/xorriso.c | 106 ++++++++++++++++++- libisoburn/trunk/xorriso/xorriso.h | 6 ++ libisoburn/trunk/xorriso/xorriso_private.h | 3 + libisoburn/trunk/xorriso/xorriso_timestamp.h | 2 +- libisoburn/trunk/xorriso/xorrisoburn.c | 9 ++ 6 files changed, 143 insertions(+), 8 deletions(-) diff --git a/libisoburn/trunk/xorriso/xorriso.1 b/libisoburn/trunk/xorriso/xorriso.1 index 63d68221..c8173061 100644 --- a/libisoburn/trunk/xorriso/xorriso.1 +++ b/libisoburn/trunk/xorriso/xorriso.1 @@ -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 "Oct 27, 2009" +.TH XORRISO 1 "Nov 17, 2009" .\" Please adjust this date whenever revising the manpage. .\" .\" Some roff macros, for reference: @@ -1992,6 +1992,19 @@ in order to set an own address limit. "data" causes full speed to start when superblock and directory entries are written and writing of file content blocks begins. .TP +\fB-dvd_obs\fR "default"|"32k"|"64k" +Linux specific: +Set the number of bytes to be transmitted with each write operation to DVD +or BD media. A number of 64 KB may improve throughput with bus systems which +show latency problems. The default depends on media type, on option +-stream_recording , and on compile time options. +.TP +\fB-stdio_sync\fR "on"|"off"|number +Set the number of bytes after which to force output to stdio: pseudo drives. +This forcing keeps the memory from being clogged with lots of +pending data for slow devices. Default "on" is the same as "16m". +Forced output can be disabled by "off". +.TP \fB\-dummy\fR "on"|"off" If "on" then simulate burning or refuse with FAILURE event if no simulation is possible, do neither blank nor format. @@ -2934,10 +2947,12 @@ 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 -Not original mkisofs options are --quoted_path_list (see -quoted_path_list), -isolinux_mbr= (see -boot_image isolinux isohybrid=), ---hardlinks (see -hardlinks "on") --acl (see -acl "on"), ---xattr (see -xattr "on"). +Not original mkisofs options are --quoted_path_list , --hardlinks , --acl , +--xattr , --md5 , --stdio_sync . They work like the xorriso options with the +same name and hardcoded argument "on", e.g. -acl "on". +Explicit arguments are expected by --stdio_sync and --scdbackup_tag. +.br +Quite special is isolinux_mbr= (see -boot_image isolinux isohybrid=). .br Personalites "\fBxorrisofs\fR", "\fBgenisoimage\fR", and "\fBgenisofs\fR" are aliases for "mkisofs". diff --git a/libisoburn/trunk/xorriso/xorriso.c b/libisoburn/trunk/xorriso/xorriso.c index 4d007fa4..3f8c316a 100644 --- a/libisoburn/trunk/xorriso/xorriso.c +++ b/libisoburn/trunk/xorriso/xorriso.c @@ -4819,6 +4819,8 @@ int Xorriso_new(struct XorrisO ** xorriso,char *progname, int flag) m->padding= 300*1024; m->alignment= 0; m->do_stream_recording= 0; + m->dvd_obs= 0; + m->stdio_sync= 0; m->keep_boot_image= 0; m->patch_isolinux_image= 0; m->boot_image_bin_path[0]= 0; @@ -7075,6 +7077,31 @@ int Xorriso_status(struct XorrisO *xorriso, char *filter, FILE *fp, int flag) if(!(is_default && no_defaults)) Xorriso_status_result(xorriso,filter,fp,flag&2); + is_default= (xorriso->dvd_obs == 0); + strcpy(mode, "default"); + if(xorriso->dvd_obs == 32768 || xorriso->dvd_obs == 65536) + sprintf(mode, "%dk", xorriso->dvd_obs / 1024); + sprintf(line,"-dvd_obs %s\n", mode); + if(!(is_default && no_defaults)) + Xorriso_status_result(xorriso,filter,fp,flag&2); + + is_default= (xorriso->stdio_sync == 0); + strcpy(line, "-stdio_sync "); + if(xorriso->stdio_sync == -1) + strcat(line, "off"); + else if(xorriso->stdio_sync == 0) + strcat(line, "on"); + else if(xorriso->stdio_sync % 512) { + Sfile_off_t_text(line+strlen(line), (off_t) (xorriso->stdio_sync * 2048), + 0); + } else { + Sfile_off_t_text(line+strlen(line), (off_t) (xorriso->stdio_sync / 512), 0); + strcat(line, "m"); + } + strcat(line, "\n"); + if(!(is_default && no_defaults)) + Xorriso_status_result(xorriso,filter,fp,flag&2); + is_default= (xorriso->fs==4*512); if((xorriso->fs/512)*512==xorriso->fs) sprintf(line,"-fs %dm\n", xorriso->fs/512); @@ -10436,6 +10463,8 @@ int Xorriso_cdrskin_help(struct XorrisO *xorriso, int flag) "\t--grow_overwriteable_iso\temulate multi-session on DVD+RW, BD-RE", "\twrite_start_address=#\t\twrite to byte address on DVD+RW, BD-RE", "\tstream_recording=on\t\ttry to get full speed on DVD-RAM, BD", +"\tdvd_obs=default|32k|64k\t\tbytes per DVD/BD write operation", +"\tstdio_sync=on|off|number\twhether to fsync output to \"stdio:\"", "\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", @@ -10659,6 +10688,16 @@ no_volunteer:; cpt= strchr(argv[i], '=')+1; Xorriso_option_stream_recording(xorriso, cpt, 0); + } else if(strncmp(argv[i], "-dvd_obs=", 9)==0 || + strncmp(argv[i], "dvd_obs=", 8)==0) { + cpt= strchr(argv[i], '=') + 1; + Xorriso_option_dvd_obs(xorriso, cpt, 0); + + } else if(strncmp(argv[i], "-stdio_sync=", 12)==0 || + strncmp(argv[i], "stdio_sync=", 11)==0) { + cpt= strchr(argv[i], '=') + 1; + Xorriso_option_stdio_sync(xorriso, cpt, 0); + } else if(strcmp(argv[i], "-toc")==0 || strcmp(argv[i], "--long_toc")==0) { do_toc= 1; } else if(strncmp(argv[i], "-tsize=", 7)==0 || @@ -10943,6 +10982,7 @@ int Xorriso_genisofs_help(struct XorrisO *xorriso, int flag) " -no-emul-boot Boot image is 'no emulation' image", " -boot-info-table Patch boot image with info table", " isolinux_mbr=on|auto|off Control eventual isohybrid MBR generation", +" --stdio_sync on|off|number Control forced output to disk files", " -z, -transparent-compression", " Enable transparent compression of files", " -v, -verbose Verbose", @@ -11131,6 +11171,11 @@ int Xorriso_genisofs(struct XorrisO *xorriso, char *whom, } else if(strcmp(argv[i], "-z")==0 || strcmp(argv[i], "-transparent-compression")==0) { Xorriso_option_zisofs(xorriso, "by_magic=on", 0); + } else if(strcmp(argv[i], "--stdio_sync")==0) { + if(i+1>=argc) + goto not_enough_args; + i++; + Xorriso_option_stdio_sync(xorriso, argv[i], 0); } else was_other_option= 1; @@ -14889,6 +14934,26 @@ int Xorriso_option_dummy(struct XorrisO *xorriso, char *mode, int flag) } +/* Option -dvd_obs "default"|"32k"|"64k" */ +int Xorriso_option_dvd_obs(struct XorrisO *xorriso, char *obs, int flag) +{ + double num; + + if(strcmp(obs, "default") == 0) + num= 0; + else + num = Scanf_io_size(obs,0); + if(num != 0 && num != 32768 && num != 65536) { + sprintf(xorriso->info_text, + "-dvd_obs : Bad size. Acceptable are 0, 32k, 64k"); + Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "SORRY", 0); + return(0); + } else + xorriso->dvd_obs= num; + return(1); +} + + /* Option -eject */ /* @param flag bit0=do not report toc of eventually remaining drives */ @@ -16162,6 +16227,11 @@ int Xorriso_option_help(struct XorrisO *xorriso, int flag) " Set the burn speed. Default is 0 = maximum speed.", " -stream_recording \"on\"|\"off\"", " Try to circumvent slow checkread on DVD-RAM, BD-RE, BD-R.", +" -dvd_obs \"default\"|\"32k\"|\"64k\"", +" Set number of bytes per DVD/BD write operation.", +" -stdio_sync \"on\"|\"off\"|number", +" Set number of bytes after which to force output to stdio", +" pseudo drives. \"on\" is the same as 16m.", " -fs number[\"k\"|\"m\"]", " Set the size of the fifo buffer. (Default is 4m)", " -eject \"in\"|\"out\"|\"all\"", @@ -18707,6 +18777,30 @@ int Xorriso_option_status_history_max(struct XorrisO *xorriso, int num, } +/* Option -stdio_sync "on"|"off"|size */ +int Xorriso_option_stdio_sync(struct XorrisO *xorriso, char *rythm, int flag) +{ + double num; + + if(strcmp(rythm, "default") == 0 || strcmp(rythm, "on") == 0) + num= 0; + if(strcmp(rythm, "off") == 0) + num= -1; + else + num = Scanf_io_size(rythm, 0); + if(num > 0) + num /= 2048; + if(num != -1 && num != 0 && (num < 32 || num > 512 * 1024)) { + sprintf(xorriso->info_text, + "-stdio_sync : Bad size. Acceptable are -1, 0, 32k ... 1g"); + Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "SORRY", 0); + return(0); + } else + xorriso->stdio_sync= num; + return(1); +} + + /* Option -stream_recording */ int Xorriso_option_stream_recording(struct XorrisO *xorriso, char *mode, int flag) @@ -19249,7 +19343,7 @@ int Xorriso_count_args(struct XorrisO *xorriso, int argc, char **argv, "backslash_codes","blank", "calm_drive","cd","cdi","cdx","charset","close", "commit_eject","compliance", - "dev","dialog","disk_dev_ino","disk_pattern","dummy","eject", + "dev","dialog","disk_dev_ino","disk_pattern","dummy","dvd_obs","eject", "iso_rr_pattern","follow","format","fs","gid","grow_blindly","hardlinks", "history","indev","in_charset","joliet", "list_delimiter","list_profiles","local_charset", @@ -19259,7 +19353,7 @@ int Xorriso_count_args(struct XorrisO *xorriso, int argc, char **argv, "prog","prog_help","publisher","quoted_not_list","quoted_path_list", "reassure","report_about","rom_toc_scan", "session_log","speed","split_size","status","status_history_max", - "stream_recording","system_id","temp_mem_limit", + "stdio_sync","stream_recording","system_id","temp_mem_limit", "uid","unregister_filter","use_readline","volid","volset_id", "xattr","zisofs", "" @@ -19597,6 +19691,10 @@ next_command:; (*idx)++; ret= Xorriso_option_dummy(xorriso, arg1, 0); + } else if(strcmp(cmd,"dvd_obs")==0) { + (*idx)++; + ret= Xorriso_option_dvd_obs(xorriso, arg1, 0); + } else if(strcmp(cmd,"dux")==0 || strcmp(cmd,"dusx")==0) { ret= Xorriso_option_lsx(xorriso, argc, argv, idx, (cmd[2]!='s')|4); @@ -20028,6 +20126,10 @@ next_command:; sscanf(arg1,"%d",&num1); ret= Xorriso_option_status_history_max(xorriso, num1, 0); + } else if(strcmp(cmd,"stdio_sync")==0) { + (*idx)++; + ret= Xorriso_option_stdio_sync(xorriso, arg1, 0); + } else if(strcmp(cmd,"stream_recording")==0) { (*idx)++; ret= Xorriso_option_stream_recording(xorriso, arg1, 0); diff --git a/libisoburn/trunk/xorriso/xorriso.h b/libisoburn/trunk/xorriso/xorriso.h index 120c0fd8..f335376d 100644 --- a/libisoburn/trunk/xorriso/xorriso.h +++ b/libisoburn/trunk/xorriso/xorriso.h @@ -614,6 +614,9 @@ int Xorriso_option_drive_class(struct XorrisO *xorriso, /* Option -dummy "on"|"off" */ int Xorriso_option_dummy(struct XorrisO *xorriso, char *mode, int flag); +/* Option -dvd_obs "default"|"32k"|"64k" */ +int Xorriso_option_dvd_obs(struct XorrisO *xorriso, char *obs, int flag); + /* Option -eject */ /* @param flag bit0=do not report toc of eventually remaining drives */ @@ -927,6 +930,9 @@ int Xorriso_option_status(struct XorrisO *xorriso, char *mode, int flag); int Xorriso_option_status_history_max(struct XorrisO *xorriso, int num1, int flag); +/* Option -stdio_sync "on"|"off"|size */ +int Xorriso_option_stdio_sync(struct XorrisO *xorriso, char *rythm, int flag); + /* Option -stream_recording */ int Xorriso_option_stream_recording(struct XorrisO *xorriso, char *mode, int flag); diff --git a/libisoburn/trunk/xorriso/xorriso_private.h b/libisoburn/trunk/xorriso/xorriso_private.h index 76793539..976f77f1 100644 --- a/libisoburn/trunk/xorriso/xorriso_private.h +++ b/libisoburn/trunk/xorriso/xorriso_private.h @@ -259,6 +259,9 @@ struct XorrisO { /* the global context of xorriso */ int do_stream_recording; /* 0=no, 1=yes, 2=for data, not for dir >=16 means yes with number as start LBA */ + int dvd_obs; /* DVD write chunk size: 0, 32k or 64k */ + int stdio_sync; /* stdio fsync interval: -1, 0, >=32 */ + int keep_boot_image; int patch_isolinux_image; char boot_image_bin_path[SfileadrL]; diff --git a/libisoburn/trunk/xorriso/xorriso_timestamp.h b/libisoburn/trunk/xorriso/xorriso_timestamp.h index 16189b2b..b4d72e75 100644 --- a/libisoburn/trunk/xorriso/xorriso_timestamp.h +++ b/libisoburn/trunk/xorriso/xorriso_timestamp.h @@ -1 +1 @@ -#define Xorriso_timestamP "2009.11.17.123150" +#define Xorriso_timestamP "2009.11.17.134239" diff --git a/libisoburn/trunk/xorriso/xorrisoburn.c b/libisoburn/trunk/xorriso/xorrisoburn.c index f0b3ac68..6fbeca25 100644 --- a/libisoburn/trunk/xorriso/xorrisoburn.c +++ b/libisoburn/trunk/xorriso/xorrisoburn.c @@ -1445,6 +1445,15 @@ int Xorriso_make_write_options( else if(xorriso->do_stream_recording >= 16) stream_mode= xorriso->do_stream_recording; burn_write_opts_set_stream_recording(*burn_options, stream_mode); + +#ifdef Xorriso_dvd_obs_default_64K + if(xorriso->dvd_obs == 0) + burn_write_opts_set_dvd_obs(*burn_options, 64 * 1024); + else +#endif + burn_write_opts_set_dvd_obs(*burn_options, xorriso->dvd_obs); + + burn_write_opts_set_stdio_fsync(*burn_options, xorriso->stdio_sync); burn_write_opts_set_underrun_proof(*burn_options, 1); return(1); }