New option -as cdrecord emulates a narrow set of cdrecord gestures
This commit is contained in:
@ -820,7 +820,6 @@ decode:;
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
#endif /* Xorriso_sfile_externaL */
|
||||
|
||||
|
||||
@ -4104,6 +4103,214 @@ much_too_long:;
|
||||
}
|
||||
|
||||
|
||||
/* @param flag bit0= compare atime
|
||||
bit1= compare ctime
|
||||
bit31= do not issue result messages
|
||||
@return 1=files match properly , 0=difference detected , -1=error
|
||||
*/
|
||||
int Xorriso_compare_2_files(struct XorrisO *xorriso, char *adr1, char *adr2,
|
||||
char *adr_common_tail, int flag)
|
||||
{
|
||||
struct stat s1, s2;
|
||||
int ret, differs= 0, r1, r2, fd1= -1, fd2= -1, i, done;
|
||||
char *respt;
|
||||
char buf1[SfileadrL], buf2[SfileadrL], a[5*SfileadrL], sfe[5*SfileadrL];
|
||||
off_t r1count= 0, r2count= 0, diffcount= 0, first_diff= -1;
|
||||
|
||||
respt= xorriso->result_line;
|
||||
ret= lstat(adr1, &s1);
|
||||
if(ret==-1) {
|
||||
sprintf(respt , "? %s : cannot lstat() : %s",
|
||||
Text_shellsafe(adr1, sfe, 0), strerror(errno));
|
||||
if(!(flag&(1<<31)))
|
||||
Xorriso_result(xorriso,0);
|
||||
return(0);
|
||||
}
|
||||
if(S_ISDIR(s1.st_mode))
|
||||
strcpy(a, "d");
|
||||
else if(S_ISREG(s1.st_mode))
|
||||
strcpy(a, "-");
|
||||
else if(S_ISLNK(s1.st_mode))
|
||||
strcpy(a, "l");
|
||||
else if(S_ISBLK(s1.st_mode))
|
||||
strcpy(a, "b");
|
||||
else if(S_ISCHR(s1.st_mode))
|
||||
strcpy(a, "c");
|
||||
else if(S_ISFIFO(s1.st_mode))
|
||||
strcpy(a, "p");
|
||||
else if(S_ISSOCK(s1.st_mode))
|
||||
strcpy(a, "s");
|
||||
else
|
||||
strcpy(a, "?");
|
||||
strcat(a, " ");
|
||||
if(adr_common_tail[0])
|
||||
sprintf(a, Text_shellsafe(adr_common_tail, sfe, 0));
|
||||
else
|
||||
strcat(a, "'.'");
|
||||
|
||||
ret= Xorriso_iso_lstat(xorriso, adr2, &s2, 0);
|
||||
if(ret==-1) {
|
||||
sprintf(respt, "? %s : cannot lstat() : %s\n",
|
||||
Text_shellsafe(adr2, sfe, 0), strerror(errno));
|
||||
if(!(flag&(1<<31)))
|
||||
Xorriso_result(xorriso,0);
|
||||
return(0);
|
||||
}
|
||||
|
||||
/* Attributes */
|
||||
if(s1.st_mode != s2.st_mode) {
|
||||
sprintf(respt, "%s : st_mode : %7.7o <> %7.7o\n",
|
||||
a, s1.st_mode, s2.st_mode);
|
||||
if(!(flag&(1<<31)))
|
||||
Xorriso_result(xorriso,0);
|
||||
differs= 1;
|
||||
}
|
||||
if(s1.st_uid != s2.st_uid) {
|
||||
sprintf(respt, "%s : st_uid : %d <> %d\n", a, s1.st_uid, s2.st_uid);
|
||||
if(!(flag&(1<<31)))
|
||||
Xorriso_result(xorriso,0);
|
||||
differs= 1;
|
||||
}
|
||||
if(s1.st_gid != s2.st_gid) {
|
||||
sprintf(respt, "%s : st_gid : %d <> %d\n", a, s1.st_gid, s2.st_gid);
|
||||
if(!(flag&(1<<31)))
|
||||
Xorriso_result(xorriso,0);
|
||||
differs= 1;
|
||||
}
|
||||
if((S_ISCHR(s1.st_mode) && S_ISCHR(s2.st_mode)) ||
|
||||
(S_ISBLK(s1.st_mode) && S_ISBLK(s2.st_mode))) {
|
||||
if(s1.st_rdev != s2.st_rdev) {
|
||||
sprintf(respt, "%s : %s st_rdev : %lu <> %lu\n", a,
|
||||
(S_ISCHR(s1.st_mode) ? "S_IFCHR" : "S_IFBLK"),
|
||||
(unsigned long) s1.st_rdev, (unsigned long) s1.st_rdev);
|
||||
if(!(flag&(1<<31)))
|
||||
Xorriso_result(xorriso,0);
|
||||
differs= 1;
|
||||
}
|
||||
}
|
||||
if(S_ISREG(s2.st_mode) && s1.st_size != s2.st_size) {
|
||||
sprintf(respt, "%s : st_size : %.f <> %.f\n",
|
||||
a, (double) s1.st_size, (double) s2.st_size);
|
||||
if(!(flag&(1<<31)))
|
||||
Xorriso_result(xorriso,0);
|
||||
differs= 1;
|
||||
}
|
||||
if(s1.st_mtime != s2.st_mtime) {
|
||||
sprintf(respt, "%s : st_mtime : %u <> %u\n",
|
||||
a, (unsigned int) s1.st_mtime, (unsigned int) s2.st_mtime);
|
||||
if(!(flag&(1<<31)))
|
||||
Xorriso_result(xorriso,0);
|
||||
differs= 1;
|
||||
}
|
||||
if(flag&1) {
|
||||
if(s1.st_atime != s2.st_atime) {
|
||||
sprintf(respt, "%s : st_atime : %u <> %u\n",
|
||||
a, (unsigned int) s1.st_atime, (unsigned int) s2.st_atime);
|
||||
if(!(flag&(1<<31)))
|
||||
Xorriso_result(xorriso,0);
|
||||
differs= 1;
|
||||
}
|
||||
}
|
||||
if(flag&2) {
|
||||
if(s1.st_ctime != s2.st_ctime) {
|
||||
sprintf(respt, "%s : st_ctime : %u <> %u\n",
|
||||
a, (unsigned int) s1.st_ctime, (unsigned int) s2.st_ctime);
|
||||
if(!(flag&(1<<31)))
|
||||
Xorriso_result(xorriso,0);
|
||||
differs= 1;
|
||||
}
|
||||
}
|
||||
if(S_ISREG(s1.st_mode)) {
|
||||
fd1= open(adr1, O_RDONLY);
|
||||
if(fd1==-1) {
|
||||
sprintf(respt, "- %s : cannot open() : %s\n", adr1, strerror(errno));
|
||||
if(!(flag&(1<<31)))
|
||||
Xorriso_result(xorriso,0);
|
||||
return(0);
|
||||
}
|
||||
|
||||
/* >>> */
|
||||
|
||||
fd2= open(adr2, O_RDONLY);
|
||||
if(fd2==-1) {
|
||||
sprintf(respt, "- %s : cannot open() : %s\n", adr2, strerror(errno));
|
||||
if(!(flag&(1<<31)))
|
||||
Xorriso_result(xorriso,0);
|
||||
close(fd1);
|
||||
return(0);
|
||||
}
|
||||
|
||||
/* Content */
|
||||
done= 0;
|
||||
while(!done) {
|
||||
r1= read(fd1, buf1, sizeof(buf1));
|
||||
r2= read(fd2, buf2, sizeof(buf2));
|
||||
if((r1==EOF && r2==EOF) || (r1==0 && r2==0))
|
||||
break;
|
||||
if(r1==EOF || r1==0) {
|
||||
if(r1==EOF)
|
||||
r1= 0;
|
||||
if(s1.st_size > r1count + r1) {
|
||||
sprintf(respt, "- %s : early EOF after %.f bytes\n",
|
||||
adr1, (double) r1count);
|
||||
if(!(flag&(1<<31)))
|
||||
Xorriso_result(xorriso,0);
|
||||
}
|
||||
differs= 1;
|
||||
}
|
||||
r1count+= r1;
|
||||
if(r2==EOF || r2<r1) {
|
||||
if(r2==EOF)
|
||||
r2= 0;
|
||||
if(s2.st_size > r2count + r2) {
|
||||
sprintf(respt, "- %s : early EOF after %.f bytes\n",
|
||||
adr2, (double) r2count);
|
||||
if(!(flag&(1<<31)))
|
||||
Xorriso_result(xorriso,0);
|
||||
}
|
||||
differs= 1;
|
||||
done= 1;
|
||||
}
|
||||
if(r2>r1) {
|
||||
if(s1.st_size > r1count + r1) {
|
||||
sprintf(respt, "- %s : early EOF after %.f bytes\n",
|
||||
adr1, (double) r1count);
|
||||
if(!(flag&(1<<31)))
|
||||
Xorriso_result(xorriso,0);
|
||||
}
|
||||
differs= 1;
|
||||
done= 1;
|
||||
}
|
||||
r2count+= r2;
|
||||
if(r1>r2)
|
||||
r1= r2;
|
||||
for(i= 0; i<r1; i++) {
|
||||
if(buf1[i]!=buf2[i]) {
|
||||
if(first_diff<0)
|
||||
first_diff= i;
|
||||
diffcount++;
|
||||
}
|
||||
}
|
||||
}
|
||||
if(diffcount>0 || r1count!=r2count) {
|
||||
if(first_diff<0)
|
||||
first_diff= (r1count>r2count ? r2count : r1count);
|
||||
sprintf(respt, "%s : %s : differs by at least %.f bytes. First at %.f\n",
|
||||
a, (s1.st_mtime==s2.st_mtime ? "CONTENT": "content"),
|
||||
(double) (diffcount + abs(r1count-r2count)), (double) first_diff);
|
||||
if(!(flag&(1<<31)))
|
||||
Xorriso_result(xorriso,0);
|
||||
differs= 1;
|
||||
}
|
||||
}
|
||||
if(fd1!=-1)
|
||||
close(fd1);
|
||||
if(fd2!=-1)
|
||||
close(fd2);
|
||||
return(!differs);
|
||||
}
|
||||
|
||||
|
||||
/* @param flag bit0= count result rather than storing it
|
||||
bit1= unexpected change of number is a FATAL event
|
||||
*/
|
||||
@ -5841,6 +6048,382 @@ int Xorriso_reassure(struct XorrisO *xorriso, char *cmd, char *which_will,
|
||||
return(0);
|
||||
}
|
||||
|
||||
|
||||
/* @param flag bit0+1= what to aquire after giving up outdev
|
||||
0=none, 1=indev, 2=outdev, 3=both
|
||||
*/
|
||||
int Xorriso_reaquire_outdev(struct XorrisO *xorriso, int flag)
|
||||
{
|
||||
int ret, aq_flag;
|
||||
char drive_name[SfileadrL], sfe[5*SfileadrL];
|
||||
|
||||
aq_flag= flag&3;
|
||||
strcpy(drive_name, xorriso->outdev);
|
||||
Xorriso_give_up_drive(xorriso, aq_flag);
|
||||
if(aq_flag==0) {
|
||||
sprintf(xorriso->info_text,"Gave up -outdev %s",
|
||||
Text_shellsafe(xorriso->outdev, sfe, 0));
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "NOTE", 0);
|
||||
return(1);
|
||||
}
|
||||
sprintf(xorriso->info_text,"Re-aquiring -outdev %s",
|
||||
Text_shellsafe(drive_name, sfe, 0));
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "NOTE", 0);
|
||||
ret= Xorriso_aquire_drive(xorriso, drive_name, aq_flag);
|
||||
if(ret<=0) {
|
||||
sprintf(xorriso->info_text,"Could not re-aquire -outdev %s",
|
||||
Text_shellsafe(xorriso->outdev, sfe, 0));
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
|
||||
return(ret);
|
||||
}
|
||||
return(1);
|
||||
}
|
||||
|
||||
|
||||
/* >>> micro version of cdrskin */
|
||||
/* @return <=0 error, 1 ok go on */
|
||||
int Xorriso_cdrskin(struct XorrisO *xorriso, char *whom, int argc, char **argv,
|
||||
int flag)
|
||||
{
|
||||
int ret, i, k, mem_report_about_severity, mem_do_close, aq_ret, eject_ret;
|
||||
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;
|
||||
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];
|
||||
|
||||
/* cdrecord 2.01 options which are not scheduled for implementation, yet */
|
||||
static char ignored_partial_options[][41]= {
|
||||
"timeout=", "debug=", "kdebug=", "kd=", "driver=", "ts=",
|
||||
"pregap=", "defpregap=", "mcn=", "isrc=", "index=", "textfile=",
|
||||
"pktsize=", "cuefile=",
|
||||
"driveropts=", "gracetime=", "minbuf=",
|
||||
|
||||
"assert_write_lba=", "fifo_start_at=", "dev_translation=",
|
||||
"drive_scsi_dev_family=", "fallback_program=", "modesty_on_drive=",
|
||||
"tao_to_sao_tsize=",
|
||||
|
||||
"direct_write_amount=", "write_start_address=", "msifile=", "tsize=",
|
||||
|
||||
""
|
||||
};
|
||||
static char ignored_full_options[][41]= {
|
||||
"-d", "-Verbose", "-V", "-silent", "-s", "-setdropts", "-prcap",
|
||||
"-reset", "-abort", "-overburn", "-ignsize", "-useinfo",
|
||||
"-fix", "-nofix",
|
||||
"-raw", "-raw96p", "-raw16",
|
||||
"-clone", "-text", "-mode2", "-xa", "-xa1", "-xa2", "-xamix",
|
||||
"-cdi", "-preemp", "-nopreemp", "-copy", "-nocopy",
|
||||
"-scms", "-shorttrack", "-noshorttrack", "-packet", "-noclose",
|
||||
"-media-info", "-minfo",
|
||||
"-isosize", "-load", "-lock", "-raw96r", "-sao", "-dao", "-swab",
|
||||
"-tao", "-waiti", "-force", "-format",
|
||||
|
||||
"--adjust_speed_to_drive", "--allow_emulated_drives", "--allow_setuid",
|
||||
"--allow_untested_media", "--any_track", "--demand_a_drive",
|
||||
"--fifo_disable", "--fifo_start_empty", "--fill_up_media",
|
||||
"--list_ignored_options", "--no_rc", "--no_convert_fs_adr",
|
||||
"--prodvd_cli_compatible", "--single_track",
|
||||
|
||||
"--grow_overwriteable_iso", "--help", "--tell_media_space",
|
||||
|
||||
""
|
||||
};
|
||||
|
||||
static char helptext[][80]= {
|
||||
"Usage: xorriso -as cdrskin [options|source_addresses]",
|
||||
"Note: This is not cdrecord. See xorriso -help, xorriso -version, man xorriso",
|
||||
"Options:",
|
||||
"\t-version\tprint version information and exit emulation",
|
||||
"\tdev=target\tpseudo-SCSI target to use as CD-Recorder",
|
||||
"\t-v\t\tincrement verbose level by one",
|
||||
"\t-checkdrive\tcheck if a driver for the drive is present",
|
||||
"\t-inq\t\tdo an inquiry for the drive and exit emulation",
|
||||
"\tspeed=#\t\tset speed of drive",
|
||||
"\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-toc\t\tretrieve and print TOC/PMA data",
|
||||
"\t-atip\t\tretrieve media state, print \"Is *erasable\"",
|
||||
"\tpadsize=#\tAmount of padding",
|
||||
"\t-data\t\tSubsequent tracks are CD-ROM data mode 1 (default)",
|
||||
"\t-pad\t\tpadsize=30k",
|
||||
"\t-nopad\t\tDo not pad",
|
||||
"\t-help\t\tprint this text to stderr and exit",
|
||||
"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.",
|
||||
"A much more elaborate cdrecord emulator is cdrskin from the same project.",
|
||||
"@End_of_helptexT@"
|
||||
};
|
||||
/* "\t-scanbus\tscan the SCSI bus and exit emulation", */
|
||||
|
||||
static char blank_help[][80]= {
|
||||
"Blanking options:",
|
||||
"\tall\t\tblank the entire disk",
|
||||
"\tdisc\t\tblank the entire disk",
|
||||
"\tdisk\t\tblank the entire disk",
|
||||
"\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",
|
||||
"@End_of_helptexT@"
|
||||
};
|
||||
|
||||
track_source[0]= 0;
|
||||
dev_adr[0]= 0;
|
||||
blank_mode[0]= 0;
|
||||
speed[0]= 0;
|
||||
|
||||
if(xorriso->in_drive_handle != NULL) {
|
||||
ret= Xorriso_option_dev(xorriso, "", 1); /* give up indev */
|
||||
if(ret<=0)
|
||||
return(ret);
|
||||
}
|
||||
|
||||
mem_report_about_severity= xorriso->report_about_severity;
|
||||
strcpy(mem_report_about_text, xorriso->report_about_text);
|
||||
mem_do_close= xorriso->do_close;
|
||||
|
||||
/* Assess plan, make settings */
|
||||
for(i= 0; i<argc; i++) {
|
||||
sprintf(xorriso->info_text, "-as %s: %s",
|
||||
whom, Text_shellsafe(argv[i], sfe, 0));
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "DEBUG", 0);
|
||||
|
||||
for(k=0;ignored_partial_options[k][0]!=0;k++) {
|
||||
if(argv[i][0]=='-')
|
||||
if(strncmp(argv[i]+1,ignored_partial_options[k],
|
||||
strlen(ignored_partial_options[k]))==0)
|
||||
goto no_volunteer;
|
||||
if(strncmp(argv[i],ignored_partial_options[k],
|
||||
strlen(ignored_partial_options[k]))==0)
|
||||
goto no_volunteer;
|
||||
}
|
||||
for(k=0;ignored_full_options[k][0]!=0;k++)
|
||||
if(strcmp(argv[i],ignored_full_options[k])==0)
|
||||
goto no_volunteer;
|
||||
if(0) {
|
||||
no_volunteer:;
|
||||
sprintf(xorriso->info_text, "-as %s: Ignored option %s",
|
||||
whom, Text_shellsafe(argv[i], sfe, 0));
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "NOTE", 0);
|
||||
continue;
|
||||
}
|
||||
|
||||
if(strcmp(argv[i], "-atip")==0) {
|
||||
do_atip= 1;
|
||||
} else if(strcmp(argv[i], "-audio")==0) {
|
||||
sprintf(xorriso->info_text, "-as %s: Option -audio not supported.", whom);
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
|
||||
ret= 0; goto ex;
|
||||
} else if(strncmp(argv[i], "-blank=", 7)==0 ||
|
||||
strncmp(argv[i], "blank=", 6)==0) {
|
||||
cpt= strchr(argv[i], '=')+1;
|
||||
if(strcmp(cpt,"all")==0 || strcmp(cpt,"disc")==0
|
||||
|| strcmp(cpt,"disk")==0) {
|
||||
strcpy(blank_mode, "all");
|
||||
} else if(strcmp(cpt,"fast")==0 || strcmp(cpt,"minimal")==0) {
|
||||
strcpy(blank_mode, "fast");
|
||||
} else if(strcmp(cpt,"help")==0) {
|
||||
strcpy(blank_mode, "help");
|
||||
} else if(strcmp(cpt,"deformat")==0 ||
|
||||
strcmp(cpt,"deformat_sequential")==0 ||
|
||||
strcmp(cpt,"deformat_quickest")==0 ||
|
||||
strcmp(cpt,"deformat_sequential_quickest")==0) {
|
||||
strcpy(blank_mode, cpt);
|
||||
} else {
|
||||
sprintf(xorriso->info_text,
|
||||
"-as %s: blank=%s not supported. See blank=help .",
|
||||
whom, Text_shellsafe(argv[i], sfe, 0));
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
|
||||
ret= 0; goto ex;
|
||||
}
|
||||
} else if(strcmp(argv[i], "-checkdrive")==0) {
|
||||
do_checkdrive= 1;
|
||||
} else if(strcmp(argv[i], "-data")==0) {
|
||||
/* ok */;
|
||||
} 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);
|
||||
if(ret<=0)
|
||||
goto ex;
|
||||
} else if(strcmp(argv[i], "-dummy")==0) {
|
||||
xorriso->do_dummy= 1;
|
||||
} else if(strcmp(argv[i], "-eject")==0) {
|
||||
do_eject= 1;
|
||||
} else if(strncmp(argv[i], "-fs=", 4)==0 || strncmp(argv[i], "fs=", 3)==0) {
|
||||
cpt= strchr(argv[i], '=')+1;
|
||||
ret= Xorriso_option_fs(xorriso, cpt, 0);
|
||||
if(ret<=0)
|
||||
goto ex;
|
||||
} else if(strcmp(argv[i], "-inq")==0) {
|
||||
do_checkdrive= 2;
|
||||
} else if(strcmp(argv[i], "-nopad")==0) {
|
||||
xorriso->padding= 0;
|
||||
} else if(strcmp(argv[i], "-pad")==0) {
|
||||
xorriso->padding= 15*2048;
|
||||
} else if(strncmp(argv[i], "-padsize=", 9)==0 ||
|
||||
strncmp(argv[i], "padsize=", 8)==0) {
|
||||
cpt= strchr(argv[i], '=')+1;
|
||||
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);
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
|
||||
ret= 0; goto ex;
|
||||
|
||||
/* do_scanbus= 1; */
|
||||
} else if(strcmp(argv[i], "-toc")==0) {
|
||||
do_toc= 1;
|
||||
} else if(strcmp(argv[i], "-v")==0 || strcmp(argv[i],"-verbose")==0) {
|
||||
do_verbous++;
|
||||
} else if(strcmp(argv[i], "-vv")==0) {
|
||||
do_verbous+= 2;
|
||||
} else if(strcmp(argv[i], "-vvv")==0) {
|
||||
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(argv[i][0]=='-' && argv[i][1]!=0) {
|
||||
sprintf(xorriso->info_text, "-as %s: Unknown option %s",
|
||||
whom, Text_shellsafe(argv[i], sfe, 0));
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
|
||||
ret= 0; goto ex;
|
||||
} else {
|
||||
if(track_source[0]) {
|
||||
sprintf(xorriso->info_text, "-as %s: Surplus track source %s",
|
||||
whom, Text_shellsafe(argv[i], sfe, 0));
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
|
||||
sprintf(xorriso->info_text, "First and only track source is %s",
|
||||
Text_shellsafe(track_source, sfe, 0));
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "NOTE", 0);
|
||||
ret= 0; goto ex;
|
||||
}
|
||||
if(Sfile_str(track_source, argv[i], 0)<=0)
|
||||
{ret= -1; goto ex;}
|
||||
}
|
||||
}
|
||||
|
||||
/* Perform actions */
|
||||
Xorriso_option_report_about(xorriso, "NOTE", 0);
|
||||
if(do_version) {
|
||||
sprintf(xorriso->result_line, "Cdrecord 2.01-Emulation Copyright (C) 2008 see libburnia-project.org xorriso\n");
|
||||
Xorriso_result(xorriso, 1);
|
||||
Xorriso_option_version(xorriso, 0);
|
||||
ret= 1; goto ex;
|
||||
}
|
||||
if(do_help) {
|
||||
for(i= 0; strcmp(helptext[i], "@End_of_helptexT@")!=0; i++) {
|
||||
sprintf(xorriso->info_text, "%s\n", helptext[i]);
|
||||
Xorriso_info(xorriso,0);
|
||||
}
|
||||
ret= 1; goto ex;
|
||||
}
|
||||
if(do_scanbus) {
|
||||
if(do_scanbus==1)
|
||||
/* >>> would need -scanbus compatible output and input format */;
|
||||
else
|
||||
Xorriso_option_devices(xorriso, 0);
|
||||
ret= 1; goto ex;
|
||||
}
|
||||
if(strcmp(blank_mode, "help")==0) {
|
||||
for(i= 0; strcmp(blank_help[i], "@End_of_helptexT@")!=0; i++) {
|
||||
sprintf(xorriso->info_text, "%s\n", blank_help[i]);
|
||||
Xorriso_info(xorriso,0);
|
||||
}
|
||||
ret= 1; goto ex;
|
||||
}
|
||||
|
||||
if(xorriso->out_drive_handle==NULL) {
|
||||
sprintf(xorriso->info_text, "-as %s: No output drive selected", whom);
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
|
||||
ret= 0; goto ex;
|
||||
}
|
||||
if(speed[0]) {
|
||||
ret= Xorriso_option_speed(xorriso, speed, 0);
|
||||
if(ret<=0)
|
||||
goto ex;
|
||||
}
|
||||
|
||||
if(do_verbous<=0)
|
||||
report_about= "SORRY";
|
||||
else if(do_verbous<=2)
|
||||
report_about= "UPDATE";
|
||||
else if(do_verbous==3)
|
||||
report_about= "DEBUG";
|
||||
else
|
||||
report_about= "ALL";
|
||||
Xorriso_option_report_about(xorriso, report_about, 0);
|
||||
|
||||
if(do_checkdrive) {
|
||||
ret= Xorriso_atip(xorriso, 2-(do_checkdrive==2));
|
||||
if(ret<=0)
|
||||
goto ex;
|
||||
}
|
||||
if(do_atip) {
|
||||
ret= Xorriso_atip(xorriso, 0);
|
||||
if(ret<=0)
|
||||
goto ex;
|
||||
}
|
||||
if(do_toc) {
|
||||
ret= Xorriso_option_toc(xorriso, 0);
|
||||
if(ret<=0)
|
||||
goto ex;
|
||||
}
|
||||
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);
|
||||
aq_ret= Xorriso_reaquire_outdev(xorriso, 2*(ret>0));
|
||||
if(ret<=0 && ret<aq_ret)
|
||||
goto ex;
|
||||
if(aq_ret<=0)
|
||||
{ret= aq_ret; goto ex;}
|
||||
}
|
||||
|
||||
ret= 1;
|
||||
ex:;
|
||||
if(do_eject && ret>=0) {
|
||||
eject_ret= Xorriso_option_eject(xorriso, "out", 0);
|
||||
if(eject_ret<ret)
|
||||
ret= eject_ret;
|
||||
}
|
||||
if(ret<=0) {
|
||||
sprintf(xorriso->info_text, "-as %s: Job could not be performed properly.",
|
||||
whom);
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
|
||||
}
|
||||
xorriso->report_about_severity= mem_report_about_severity;
|
||||
strcpy(xorriso->report_about_text, mem_report_about_text);
|
||||
xorriso->do_close= mem_do_close;
|
||||
return(ret);
|
||||
}
|
||||
|
||||
|
||||
/* ---------------------------- Options API ------------------------ */
|
||||
|
||||
@ -6039,6 +6622,49 @@ ex:;
|
||||
}
|
||||
|
||||
|
||||
/* Option -as */
|
||||
/* @param flag bit0=do not report the added item
|
||||
bit1=do not reset pacifier, no final pacifier message
|
||||
*/
|
||||
int Xorriso_option_as(struct XorrisO *xorriso, int argc, char **argv,
|
||||
int *idx, int flag)
|
||||
{
|
||||
int end_idx, ret, idx_count;
|
||||
|
||||
end_idx= Xorriso_end_idx(xorriso, argc, argv, *idx, 1);
|
||||
idx_count= end_idx-(*idx);
|
||||
if(end_idx<=0) {
|
||||
if(idx_count<1)
|
||||
sprintf(xorriso->info_text,
|
||||
"-as : Not enough arguments given. Needed: whom do_what");
|
||||
else
|
||||
sprintf(xorriso->info_text,
|
||||
"-as %s : Not enough arguments given. Needed: do_what",
|
||||
argv[*idx]);
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
|
||||
ret= 0; goto ex;
|
||||
}
|
||||
if(strcmp(argv[*idx], "cdrecord")==0 || strcmp(argv[*idx], "wodim")==0 ||
|
||||
strcmp(argv[*idx], "cdrskin")==0) {
|
||||
ret= Xorriso_cdrskin(xorriso, argv[*idx], end_idx-(*idx)-1, argv+(*idx)+1,
|
||||
0);
|
||||
if(ret<=0)
|
||||
goto ex;
|
||||
} else {
|
||||
sprintf(xorriso->info_text,
|
||||
"-as : Not a known emulation personality: '%s'", argv[*idx]);
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
|
||||
ret= 0; goto ex;
|
||||
}
|
||||
|
||||
ret= 1;
|
||||
ex:;
|
||||
(*idx)= end_idx;
|
||||
return(ret);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* Option -ban_stdio_write */
|
||||
int Xorriso_option_ban_stdio_write(struct XorrisO *xorriso, int flag)
|
||||
{
|
||||
@ -6053,7 +6679,12 @@ int Xorriso_option_ban_stdio_write(struct XorrisO *xorriso, int flag)
|
||||
*/
|
||||
int Xorriso_option_blank(struct XorrisO *xorriso, char *mode, int flag)
|
||||
{
|
||||
char drive_name[SfileadrL], *cmd= "-blank", sfe[5*SfileadrL];
|
||||
char drive_name[SfileadrL], *cmd= "-blank";
|
||||
#ifndef NIX
|
||||
int aq_ret;
|
||||
#else
|
||||
sfe[5*SfileadrL];
|
||||
#endif
|
||||
int ret, aq_flag= 2, mode_flag;
|
||||
|
||||
if(flag&1)
|
||||
@ -6102,6 +6733,19 @@ int Xorriso_option_blank(struct XorrisO *xorriso, char *mode, int flag)
|
||||
return(ret);
|
||||
strcpy(drive_name, xorriso->outdev);
|
||||
if(ret!=2) {
|
||||
|
||||
#ifndef NIX
|
||||
|
||||
if(ret<=0)
|
||||
aq_flag= 0;
|
||||
aq_ret= Xorriso_reaquire_outdev(xorriso, aq_flag);
|
||||
if(ret<=0 && ret<aq_ret)
|
||||
return(ret);
|
||||
if(aq_ret<=0)
|
||||
return(aq_ret);
|
||||
|
||||
#else
|
||||
|
||||
Xorriso_give_up_drive(xorriso, aq_flag);
|
||||
if(ret<=0) { /* this is the return value of the blank|format function */
|
||||
sprintf(xorriso->info_text,"Gave up -outdev %s",
|
||||
@ -6119,6 +6763,9 @@ int Xorriso_option_blank(struct XorrisO *xorriso, char *mode, int flag)
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
|
||||
return(ret);
|
||||
}
|
||||
|
||||
#endif /* NIX */
|
||||
|
||||
}
|
||||
return(1);
|
||||
}
|
||||
@ -6673,12 +7320,12 @@ int Xorriso_option_devices(struct XorrisO *xorriso, int flag)
|
||||
Text_shellsafe(xorriso->indev, sfe, 0));
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "NOTE", 0);
|
||||
}else {
|
||||
if(xorriso->in_drive_handle) {
|
||||
if(xorriso->in_drive_handle!=NULL) {
|
||||
sprintf(xorriso->info_text, "Gave up -indev %s",
|
||||
Text_shellsafe(xorriso->indev, sfe, 0));
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "NOTE", 0);
|
||||
}
|
||||
if(xorriso->out_drive_handle) {
|
||||
if(xorriso->out_drive_handle!=NULL) {
|
||||
sprintf(xorriso->info_text, "Gave up -outdev %s",
|
||||
Text_shellsafe(xorriso->outdev, sfe, 0));
|
||||
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "NOTE", 0);
|
||||
@ -8208,11 +8855,11 @@ int Xorriso_option_rollback(struct XorrisO *xorriso, int flag)
|
||||
/* Option -speed */
|
||||
int Xorriso_option_speed(struct XorrisO *xorriso, char *speed, int flag)
|
||||
{
|
||||
int is_cd= 1, unit_found= 0;
|
||||
int is_cd= 1, unit_found= 0, ret, profile_number;
|
||||
double num;
|
||||
char *cpt;
|
||||
char *cpt, profile_name[80];
|
||||
|
||||
if(speed[0]==0) {
|
||||
if(speed[0]==0 || strcmp(speed, "any")==0) {
|
||||
xorriso->speed= 0; /* full speed */
|
||||
return(1);
|
||||
}
|
||||
@ -8239,9 +8886,8 @@ cd_speed:;
|
||||
dvd_speed:;
|
||||
num*= 1385;
|
||||
} else if (!unit_found) {
|
||||
|
||||
/* >>> try to determine target media */;
|
||||
|
||||
ret= Xorriso_get_profile(xorriso, &profile_number, profile_name, 2);
|
||||
is_cd= (ret==2);
|
||||
if(is_cd)
|
||||
goto cd_speed;
|
||||
else
|
||||
@ -8520,6 +9166,9 @@ next_command:;
|
||||
ret= Xorriso_option_alter_date(xorriso, arg1, arg2, argc, argv, idx,
|
||||
strlen(cmd)>10);
|
||||
|
||||
} else if(strcmp(cmd,"as")==0) {
|
||||
ret= Xorriso_option_as(xorriso, argc, argv, idx, 0);
|
||||
|
||||
} else if(strcmp(cmd,"ban_stdio_write")==0) {
|
||||
ret= Xorriso_option_ban_stdio_write(xorriso, 0);
|
||||
|
||||
|
Reference in New Issue
Block a user