New option -as mkisofs emulates a narrow set of mkisofs gestures

This commit is contained in:
2008-02-20 23:48:08 +00:00
parent df83afc55b
commit aaeb1204b7
6 changed files with 402 additions and 58 deletions

View File

@ -6081,12 +6081,11 @@ int Xorriso_reaquire_outdev(struct XorrisO *xorriso, int flag)
}
/* >>> micro version of cdrskin */
/* @return <=0 error, 1 ok go on */
/* micro version of cdrskin */
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 ret, i, k, 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;
@ -6134,7 +6133,7 @@ int Xorriso_cdrskin(struct XorrisO *xorriso, char *whom, int argc, char **argv,
};
static char helptext[][80]= {
"Usage: xorriso -as cdrskin [options|source_addresses]",
"Usage: xorriso -as cdrecord [options|source_addresses]",
"Note: This is not cdrecord. See xorriso -help, xorriso -version, man xorriso",
"Options:",
"\t-version\tprint version information and exit emulation",
@ -6154,7 +6153,6 @@ int Xorriso_cdrskin(struct XorrisO *xorriso, char *whom, int argc, char **argv,
"\t-pad\t\tpadsize=30k",
"\t-nopad\t\tDo not pad",
"\t-help\t\tprint this text to stderr and exit emulation",
"\t--help\t\tprint xorriso help 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",
@ -6176,6 +6174,9 @@ static char blank_help[][80]= {
"@End_of_helptexT@"
};
strcpy(mem_report_about_text, xorriso->report_about_text);
mem_do_close= xorriso->do_close;
track_source[0]= 0;
dev_adr[0]= 0;
blank_mode[0]= 0;
@ -6183,13 +6184,10 @@ static char blank_help[][80]= {
if(xorriso->in_drive_handle != NULL) {
ret= Xorriso_option_dev(xorriso, "", 1); /* give up indev */
if(ret<=0)
if(ret!=1)
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++) {
@ -6252,7 +6250,7 @@ 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);
ret= Xorriso_option_dev(xorriso, cpt, 2|8); /* overwriteables as blank */
if(ret<=0)
goto ex;
} else if(strcmp(argv[i], "-dummy")==0) {
@ -6316,8 +6314,6 @@ no_volunteer:;
do_version= 1;
} else if(strcmp(argv[i], "-help")==0) {
do_help= 1;
} else if(strcmp(argv[i], "--help")==0) {
do_help= 2;
} 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));
@ -6347,13 +6343,9 @@ no_volunteer:;
ret= 1; goto ex;
}
if(do_help) {
if(do_help==2) {
Xorriso_option_help(xorriso, 0);
} else {
for(i= 0; strcmp(helptext[i], "@End_of_helptexT@")!=0; i++) {
sprintf(xorriso->info_text, "%s\n", helptext[i]);
Xorriso_info(xorriso,0);
}
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;
}
@ -6435,12 +6427,256 @@ ex:;
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_option_report_about(xorriso, mem_report_about_text, 0);
xorriso->do_close= mem_do_close;
return(ret);
}
/* micro emulation of mkisofs */
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 do_print_size= 0;
char sfe[5*SfileadrL], adr[SfileadrL+8], ra_text[80], pathspec[2*SfileadrL];
char *ept, *add_pt, eff_path[SfileadrL];
/* mkisofs 2.01 options which are not scheduled for implementation, yet */
static char ignored_arg0_options[][41]= {
"-allow-leading-dots", "-ldots", "-allow-lowercase", "-allow-multidot",
"-cache-inodes", "-no-cache-inodes", "-check-oldnames", "-d", "-D",
"-joliet-long", "-l", "-L", "-max-iso9660-filenames", "-N", "-nobak",
"-no-bak", "-force-rr", "-r", "-relaxed-filenames", "-T", "-U",
"-no-iso-translate",
""
};
static char ignored_arg1_options[][41]= {
"-A", "-biblio", "-check-session", "-P", "-publisher", "-p", "-root",
"-old-root", "-sysid", "-table-name",
""
};
static char helptext[][80]= {
"Usage: xorriso -as mkisofs [options] file...",
"Note: This is not mkisofs. See xorriso -help, xorriso -version, man xorriso",
"Options:",
" -f, -follow-links Follow symbolic links",
" -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",
" -pad Pad output by 300k (default)",
" -path-list FILE File with list of pathnames to process",
" -print-size Print estimated filesystem size and exit",
" -quiet Run quietly",
" -R, -rock Generate Rock Ridge directory information",
" -V ID, -volid ID Set Volume ID",
" -v, -verbose Verbose",
" -version Print the current version",
"@End_of_helptexT@"
};
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;
for(i= 0; i<argc; i++) {
if(strcmp(argv[i], "-o")==0 || strcmp(argv[i], "-output")==0) {
if(i+1>=argc)
goto not_enough_args;
i++;
adr[0]= 0;
if(strcmp(argv[i],"-")!=0)
strcpy(adr, "stdio:");
if(Sfile_str(adr+strlen(adr), argv[i], 0)<=0)
{ret= -1; goto ex;}
} 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++) {
sprintf(xorriso->info_text, "%s\n", helptext[i]);
Xorriso_info(xorriso,0);
}
Xorriso_option_report_about(xorriso, ra_text, 0);
} else if(strcmp(argv[i], "-v")==0 || strcmp(argv[i], "-verbose")==0) {
strcpy(ra_text, "UPDATE");
} else if(strcmp(argv[i], "-quiet")==0) {
strcpy(ra_text, "SORRY");
} else if(strcmp(argv[i], "-f")==0 || strcmp(argv[i], "-follow-links")==0) {
ret= Xorriso_option_follow(xorriso, "on", 0);
if(ret<=0)
goto ex;
} else
was_other_option= 1;
}
Xorriso_option_report_about(xorriso, ra_text, 0);
if(adr[0]) {
if(strncmp(adr, "stdio:", 6)==0 && strncmp(adr, "stdio:/dev/fd/", 14)!=0) {
ret= Sfile_type(adr+6, 1);
if(ret==-1)
/* ok */;
else if(ret==1) {
/* >>> would prefer to do this later ... or leave it to libburn */;
ret= truncate(adr+6, (off_t) 0);
if(ret==-1) {
sprintf(xorriso->info_text, "-as %s: Cannot truncate existing -o %s",
whom, Text_shellsafe(adr+6, sfe, 0));
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, errno, "FAILURE",
0);
}
sprintf(xorriso->info_text, "-as %s: Truncated existing -o %s",
whom, Text_shellsafe(adr+6, sfe, 0));
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "NOTE", 0);
} else if(ret==2 || ret==3) {
sprintf(xorriso->info_text,
"-as %s: Cannot accept %s as target: -o %s",
whom, (ret==3 ? "symbolic link" : "directory"),
Text_shellsafe(adr+6, sfe, 0));
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
}
}
ret= Xorriso_option_dev(xorriso, adr, 2|8); /* overwriteable as blank */
if(ret<=0)
goto ex;
}
if(!was_other_option)
{ret= 1; goto ex;}
if(xorriso->out_drive_handle==NULL) {
ret= Xorriso_option_dev(xorriso, "-", 2|4); /* set outdev to stdout */
if(ret<=0)
return(ret);
}
xorriso->padding= 300*1024;
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_arg0_options[k][0]!=0;k++)
if(strcmp(argv[i],ignored_arg0_options[k])==0)
goto no_volunteer;
for(k=0;ignored_arg1_options[k][0]!=0;k++)
if(strcmp(argv[i],ignored_arg0_options[k])==0) {
i++;
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], "-version")==0) {
sprintf(xorriso->result_line, "mkisofs 2.01-Emulation Copyright (C) 2008 see libburnia-project.org xorriso\n");
Xorriso_result(xorriso, 1);
Xorriso_option_version(xorriso, 0);
} else if(strcmp(argv[i], "-R")==0 || strcmp(argv[i], "-rock")==0) {
/* ok */;
} else if(strcmp(argv[i], "-J")==0 || strcmp(argv[i], "-joliet")==0) {
xorriso->do_joliet= 1;
} else if(strcmp(argv[i], "-graft-points")==0) {
xorriso->allow_graft_points= 1;
} else if(strcmp(argv[i], "-path-list")==0) {
if(i+1>=argc) {
not_enough_args:;
sprintf(xorriso->info_text, "-as %s: Not enough arguments to option %s",
whom, argv[i]);
Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "FAILURE", 0);
ret= 0; goto ex;
}
i++;
ret= Xorriso_option_path_list(xorriso, argv[i], 0);
if(ret<=0)
goto ex;
} else if(strcmp(argv[i], "-f")==0 || strcmp(argv[i], "-follow-links")==0) {
/* was already handled in first argument scan */;
} else if(strcmp(argv[i], "-pad")==0) {
xorriso->padding= 300*1024;
} else if(strcmp(argv[i], "-nopad")==0) {
xorriso->padding= 0;
} else if(strcmp(argv[i], "-print-size")==0) {
do_print_size= 1;
} else if(strcmp(argv[i], "-o")==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) {
if(i+1>=argc)
goto not_enough_args;
i++;
ret= Xorriso_option_volid(xorriso, argv[i], 0);
if(ret<=0)
goto ex;
} else if(strcmp(argv[i], "-v")==0 || strcmp(argv[i], "-quiet")==0) {
/* was already handled in first argument scan */;
} 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);
} else {
int zero= 0;
/* implementing mkisofs tendency to map single-path pathspecs to / */
if((!xorriso->allow_graft_points) ||
Fileliste__target_source_limit(argv[i], '=', &ept, 0)<=0) {
ret= Xorriso_normalize_img_path(xorriso, xorriso->wdx, argv[i],
eff_path, 2|4);
if(ret<=0)
goto ex;
ret= Sfile_type(eff_path,
1|((xorriso->do_follow_param||xorriso->do_follow_links)<<2));
if(ret==2) {
strcpy(pathspec, "/=");
} else {
pathspec[0]= '/';
pathspec[1]= 0;
ret= Sfile_leafname(eff_path, pathspec+1, 0);
if(ret>0)
strcat(pathspec, "=");
else
pathspec[0]= 0;
}
strcat(pathspec, eff_path);
add_pt= pathspec;
} else
add_pt= argv[i];
mem_graft_points= xorriso->allow_graft_points;
xorriso->allow_graft_points= 1;
ret= Xorriso_option_add(xorriso, 1, &add_pt, &zero, was_path<<1);
xorriso->allow_graft_points= mem_graft_points;
if(ret<=0)
goto ex;
was_path= 1;
}
}
if(do_print_size) {
ret= Xorriso_option_print_size(xorriso, 0);
if(ret<=0)
goto ex;
}
ret= 1;
ex:;
if(was_path && !do_print_size)
Xorriso_pacifier_callback(xorriso, "files added", xorriso->pacifier_count,
xorriso->pacifier_total, "", 1);
if(do_print_size && xorriso->volset_change_pending)
Xorriso_option_rollback(xorriso, 0);
return(ret);
}
/* ---------------------------- Options API ------------------------ */
@ -6667,6 +6903,13 @@ int Xorriso_option_as(struct XorrisO *xorriso, int argc, char **argv,
0);
if(ret<=0)
goto ex;
} else if(strcmp(argv[*idx], "mkisofs")==0 ||
strcmp(argv[*idx], "genisoimage")==0 ||
strcmp(argv[*idx], "genisofs")==0) {
ret= Xorriso_genisofs(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]);
@ -7246,6 +7489,7 @@ int Xorriso_option_cut_out(struct XorrisO *xorriso, char *disk_path,
/** @param flag bit0=use as indev
bit1= use as outdev
bit2= do not -reassure
bit3= regard overwriteable media as blank
@return <=0 error , 1 success, 2 revoked by -reassure
*/
int Xorriso_option_dev(struct XorrisO *xorriso, char *in_adr, int flag)
@ -7305,8 +7549,8 @@ int Xorriso_option_dev(struct XorrisO *xorriso, char *in_adr, int flag)
}
ret= Xorriso_give_up_drive(xorriso, flag&3);
} else
ret= Xorriso_aquire_drive(xorriso, adr, flag&3);
if(ret<0)
ret= Xorriso_aquire_drive(xorriso, adr, (flag&3)|((flag&8)>>1));
if(ret<=0)
return(ret);
return(1);
}
@ -9752,6 +9996,7 @@ int Xorriso_prescan_args(struct XorrisO *xorriso, int argc, char **argv,
Keep dev_fd_1 connected to external stdout. dev_fd_1 is to be used when
"stdio:/dev/fd/1" is interpreted as drive address.
*/
protect_stdout:;
Xorriso_protect_stdout(xorriso, 0);
sprintf(xorriso->info_text,
"Encountered - or stdio:/dev/fd/1 as possible write target.");
@ -9782,6 +10027,11 @@ int Xorriso_prescan_args(struct XorrisO *xorriso, int argc, char **argv,
Xorriso_option_return_with(xorriso, arg1, num2, 0);
was_return_with= 1;
} else if(strcmp(cmd,"as")==0 && was_dashed) {
if(strcmp(arg1, "mkisofs")==0 || strcmp(arg1, "genisoimage")==0 ||
strcmp(arg1, "genisofs")==0)
goto protect_stdout;
}
}
return(1);