From a16ed658636d98a76c74ce77bc7e682f67aa6985 Mon Sep 17 00:00:00 2001 From: Thomas Schmitt Date: Sat, 13 Oct 2007 14:11:20 +0000 Subject: [PATCH] Implemented -speed and enlarged -status list --- libisoburn/trunk/test/xorriso.c | 223 +++++++++++++++++++--- libisoburn/trunk/test/xorriso_timestamp.h | 2 +- 2 files changed, 200 insertions(+), 25 deletions(-) diff --git a/libisoburn/trunk/test/xorriso.c b/libisoburn/trunk/test/xorriso.c index e6993a9f..00dc0db9 100644 --- a/libisoburn/trunk/test/xorriso.c +++ b/libisoburn/trunk/test/xorriso.c @@ -2,9 +2,16 @@ /* + + ( cd .. ; libisoburn-develop/test/compile_xorriso.sh -g ) + +or + cc -g -DXorriso_with_maiN -DXorriso_with_regeX -DXorriso_with_readlinE \ -Wall -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE \ - -o test/xorriso test/xorriso.c -lreadline + -o test/xorriso test/xorriso.c \ + -lpthread -lreadline -lburn -lisofs -lisoburn + */ /* Command line oriented batch and dialog tool which creates, loads, @@ -640,7 +647,7 @@ bit15= with bit1 or bit2: close depicted log file char *rpt,*npt,ret= 1; char prefix[16]; static int num_channels= 4; - static char channel_prefixes[4][4]= {"-","R","I","M"}; + static char channel_prefixes[4][4]= {".","R","I","M"}; static FILE *logfile_fp[4]= {NULL,NULL,NULL,NULL}; static FILE *pktlog_fp= NULL; @@ -994,6 +1001,38 @@ FILE *Afile_fopen(char *filename, char *mode, int flag) } +/** Convert a text into a number of type double and multiply it by unit code + [kmgtpe] (2^10 to 2^60) or [s] (2048). (Also accepts capital letters.) + @param text Input like "42", "2k", "3.14m" or "-1g" + @param flag Bitfield for control purposes: + bit0= return -1 rathern than 0 on failure + @return The derived double value +*/ +double Scanf_io_size(char *text, int flag) +/* + bit0= default value -1 rather than 0 +*/ +{ + int c; + double ret= 0.0; + + if(flag&1) + ret= -1.0; + if(text[0]==0) + return(ret); + sscanf(text,"%lf",&ret); + c= text[strlen(text)-1]; + if(c=='k' || c=='K') ret*= 1024.0; + if(c=='m' || c=='M') ret*= 1024.0*1024.0; + if(c=='g' || c=='G') ret*= 1024.0*1024.0*1024.0; + if(c=='t' || c=='T') ret*= 1024.0*1024.0*1024.0*1024.0; + if(c=='p' || c=='P') ret*= 1024.0*1024.0*1024.0*1024.0*1024.0; + if(c=='e' || c=='E') ret*= 1024.0*1024.0*1024.0*1024.0*1024.0*1024.0; + if(c=='s' || c=='S') ret*= 2048.0; + return(ret); +} + + /* ------------------------------------------------------------------------ */ @@ -1672,7 +1711,7 @@ struct XorrisO { /* the global context of askme */ int ban_stdio_write; int do_dummy; int do_close; - + int speed; /* in libburn units : 1000 bytes/second , 0 = Max, -1 = Min */ /* XORRISO options */ int allow_graft_points; @@ -1702,6 +1741,7 @@ struct XorrisO { /* the global context of askme */ int result_page_width; char mark_text[SfileadrL]; /* ( stdout+stderr, M: ) */ int packet_output; + char logfile[4][SfileadrL]; int status_history_max; /* for -status long_history */ @@ -1757,7 +1797,7 @@ int Xorriso_execute_option(struct XorrisO *xorriso, char *line, int flag); int Xorriso_new(struct XorrisO ** xorriso,char *progname, int flag) { - int ret; + int ret, i; struct XorrisO *m; *xorriso= m= TSOB_FELD(struct XorrisO,1); @@ -1774,7 +1814,7 @@ int Xorriso_new(struct XorrisO ** xorriso,char *progname, int flag) m->global_uid= 0; m->volid[0]= 0; m->do_global_gid= 0; - m->do_overwrite= 0; + m->do_overwrite= 1; m->do_reassure= 0; m->global_gid= 0; m->indev[0]= 0; @@ -1782,6 +1822,7 @@ int Xorriso_new(struct XorrisO ** xorriso,char *progname, int flag) m->ban_stdio_write= 0; m->do_dummy= 0; m->do_close= 0; + m->speed= 0; m->allow_graft_points= 0; m->dialog= 0; m->search_mode= 0; @@ -1791,6 +1832,8 @@ int Xorriso_new(struct XorrisO ** xorriso,char *progname, int flag) m->result_page_width= 80; m->mark_text[0]= 0; m->packet_output= 0; + for(i=0; i<4; i++) + m->logfile[i][0]= 0; m->status_history_max= Xorriso_status_history_maX; #ifdef Xorriso_with_regeX m->re= NULL; @@ -2719,8 +2762,9 @@ int Xorriso_status(struct XorrisO *xorriso, char *filter, FILE *fp, int flag) -options_from_file:${resume_state_file}_pos */ { - int is_default,no_defaults; + int is_default,no_defaults,i; char *line, sfe[4*SfileadrL]; + static char channel_prefixes[4][4]= {".","R","I","M"}; no_defaults= flag&1; line= xorriso->result_line; @@ -2736,7 +2780,7 @@ int Xorriso_status(struct XorrisO *xorriso, char *filter, FILE *fp, int flag) Xorriso_status_result(xorriso,filter,fp,flag&2); is_default= (xorriso->result_page_length==0 && xorriso->result_page_width==80); - sprintf(line,"-page:%d:%d\n", + sprintf(line,"-page %d %d\n", (xorriso->result_page_length>=0?xorriso->result_page_length :-xorriso->result_page_length), xorriso->result_page_width); @@ -2758,6 +2802,14 @@ 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); + for(i=0;i<4;i++) { + is_default= (xorriso->logfile[i]!=0); + sprintf(line,"-logfile %s %s\n", + channel_prefixes[i],Text_shellsafe(xorriso->logfile[i],sfe,0)); + if(!(is_default && no_defaults)) + Xorriso_status_result(xorriso,filter,fp,flag&2); + } + is_default= (xorriso->mark_text[0]==0); sprintf(line,"-mark %s\n",Text_shellsafe(xorriso->mark_text,sfe,0)); if(!(is_default && no_defaults)) @@ -2769,6 +2821,71 @@ int Xorriso_status(struct XorrisO *xorriso, char *filter, FILE *fp, int flag) sprintf(line,"-cd %s\n", (xorriso->wdi[0] ? Text_shellsafe(xorriso->wdi,sfe,0) : "'/'")); Xorriso_status_result(xorriso,filter,fp,flag&2); + sprintf(line,"-cdx %s\n", + (xorriso->wdx[0] ? Text_shellsafe(xorriso->wdx,sfe,0) : "'/'")); + Xorriso_status_result(xorriso,filter,fp,flag&2); + + if(xorriso->ban_stdio_write) { + sprintf(line,"-ban_stdio_write\n"); + Xorriso_status_result(xorriso,filter,fp,flag&2); + } + + is_default= (xorriso->volid[0]==0); + sprintf(line,"-V %s\n",Text_shellsafe(xorriso->volid,sfe,0)); + if(!(is_default && no_defaults)) + Xorriso_status_result(xorriso,filter,fp,flag&2); + + if(xorriso->do_joliet) { + sprintf(line,"-J\n"); + Xorriso_status_result(xorriso,filter,fp,flag&2); + } + + if(xorriso->do_global_uid) { + sprintf(line,"-uid %lu\n", (unsigned long) xorriso->global_uid); + Xorriso_status_result(xorriso,filter,fp,flag&2); + } + + if(xorriso->do_global_gid) { + sprintf(line,"-gid %lu\n", (unsigned long) xorriso->global_gid); + Xorriso_status_result(xorriso,filter,fp,flag&2); + } + + if(xorriso->allow_graft_points) { + sprintf(line,"-graft-points\n"); + Xorriso_status_result(xorriso,filter,fp,flag&2); + } + + if(xorriso->do_follow_links) { + sprintf(line,"-f\n"); + Xorriso_status_result(xorriso,filter,fp,flag&2); + } + + is_default= !!xorriso->do_overwrite; + sprintf(line,"-overwrite %s\n",(xorriso->do_overwrite ? "on" : "off")); + if(!(is_default && no_defaults)) + Xorriso_status_result(xorriso,filter,fp,flag&2); + + is_default= !xorriso->do_reassure; + sprintf(line,"-reassure %s\n",(xorriso->do_reassure ? "on" : "off")); + if(!(is_default && no_defaults)) + Xorriso_status_result(xorriso,filter,fp,flag&2); + + is_default= !xorriso->do_close; + sprintf(line,"-close %s\n",(xorriso->do_close ? "on" : "off")); + if(!(is_default && no_defaults)) + Xorriso_status_result(xorriso,filter,fp,flag&2); + + is_default= !xorriso->do_dummy; + sprintf(line,"-dummy %s\n",(xorriso->do_dummy ? "on" : "off")); + if(!(is_default && no_defaults)) + Xorriso_status_result(xorriso,filter,fp,flag&2); + + is_default= (xorriso->speed==0); + sprintf(line,"-speed %dkB/s\n", xorriso->speed); + if(!(is_default && no_defaults)) + Xorriso_status_result(xorriso,filter,fp,flag&2); + +/* >>> BAUSTELLE */ if(xorriso->status_history_max!=Xorriso_status_history_maX || !no_defaults) { sprintf(line,"-status_history_max %d\n",xorriso->status_history_max); @@ -2800,6 +2917,16 @@ int Xorriso_status(struct XorrisO *xorriso, char *filter, FILE *fp, int flag) #endif /* Xorriso_with_readlinE */ + 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); + } else { + sprintf(line,"-indev %s\n", Text_shellsafe(xorriso->indev,sfe,0)); + Xorriso_status_result(xorriso,filter,fp,flag&2); + sprintf(line,"-outdev %s\n", Text_shellsafe(xorriso->outdev,sfe,0)); + Xorriso_status_result(xorriso,filter,fp,flag&2); + } + return(1); } @@ -2957,8 +3084,8 @@ int Xorriso_option_cdi(struct XorrisO *xorriso, char *iso_rr_path, int flag) Xorriso_info(xorriso,0); sprintf(xorriso->result_line,"%s/\n",Text_shellsafe(xorriso->wdi, sfe, 0)); Xorriso_result(xorriso,0); - if(iso_rr_path[0]==0) { - strcpy(xorriso->wdi,"/"); + if(strcmp(iso_rr_path,"/")==0) { + strcpy(xorriso->wdi,""); Xorriso_option_pwdi(xorriso, 0); return(1); } @@ -3000,18 +3127,21 @@ int Xorriso_option_cdx(struct XorrisO *xorriso, char *disk_path, int flag) Xorriso_info(xorriso,0); sprintf(xorriso->result_line,"%s/\n",Text_shellsafe(xorriso->wdx, sfe, 0)); Xorriso_result(xorriso,0); - if(disk_path[0]==0) { - strcpy(xorriso->wdx,"/"); + if(strcmp(disk_path,"/")==0) { + strcpy(xorriso->wdx,""); Xorriso_option_pwdx(xorriso, 0); return(1); } ret= 1; - /* >>> XORRISO: check whether directory exists on disk */; - - if(ret<=0) { + ret= Sfile_type(disk_path,1|4|8); + if(ret<0) { + sprintf(xorriso->info_text,"-cdx: file not found :\n%s\n",disk_path); + return(0); + } + if(ret!=2) { sprintf(xorriso->info_text, - "-cdx: not found or not a directory :\n%s\n",disk_path); + "-cdx: file is not a directory :\n%s\n",disk_path); Xorriso_info(xorriso,0); return(0); } @@ -3366,8 +3496,8 @@ int Xorriso_option_help(struct XorrisO *xorriso, int flag) " If \"on\" then mark the written media as not appendable.", " -dummy \"on\"|\"off\"", " If \"on\" simulate burning. Refuse if media cannot simulate.", -" -speed number[\"k\"|\"m\"]", -" Set the burn speed. Default is maximum speed.", +" -speed number[\"k\"|\"m\"|\"[x]CD\"|\"[x]DVD\"]", +" Set the burn speed. Default is 0 = maximum speed.", " -fs number[\"k\"|\"m\"]", " Set the size of the fifo buffer. (Default is 4m)", " -eject \"in\"|\"out\"|\"all\"", @@ -3573,15 +3703,17 @@ logfile_wrong_form:; hflag= 4; else goto logfile_wrong_form; - if(strcmp(fileadr,"-")==0) + if(strcmp(fileadr,"-")==0 || fileadr[0]==0) hflag|= (1<<15); + xorriso->logfile[channel_no][0]= 0; ret= Write_to_channel(fileadr,channel_no,hflag); if(ret<=0) { sprintf(xorriso->info_text, "--- Cannot open logfile: %s\n %s\n", fileadr,(errno>0?strerror(errno):"-unknown error-")); Xorriso_info(xorriso,0); - } + } else if(!(hflag&(1<<15))) + strcpy(xorriso->logfile[channel_no], fileadr); return(ret>0); } @@ -3730,7 +3862,7 @@ int Xorriso_option_overwrite(struct XorrisO *xorriso, char *mode, int flag) /* Option -page */ int Xorriso_option_page(struct XorrisO *xorriso, int len, int width, int flag) { - if(len<=0 || width<=0) { + if(len<0 || width<=0) { sprintf(xorriso->info_text, "--- Improper numeric value of arguments of -page: %d %d\n", len, width); @@ -3903,7 +4035,53 @@ int Xorriso_option_rollback(struct XorrisO *xorriso, int flag) /* Option -speed */ int Xorriso_option_speed(struct XorrisO *xorriso, char *speed, int flag) { - fprintf(stderr, ">>> LIBISOFS : -speed %s\n", speed); + int is_cd= 1; + double num; + char *cpt; + + if(speed[0]==0) { + xorriso->speed= 0; /* full speed */ + return(1); + } + + sscanf(speed,"%lf",&num); + for(cpt= speed+strlen(speed)-1; cpt>=speed; cpt--) + if(isdigit(*cpt) || *cpt=='.') + break; + cpt++; + + if(*cpt=='k' || *cpt=='K') + /* is merchand kilobyte, stays merchand kilobyte */; + else if(*cpt=='m' || *cpt=='M') + num*= 1000; + else if(*cpt=='x' || *cpt=='X') + cpt++; + + if(*cpt=='c' || *cpt=='C') { +cd_speed:; + num*= 176.4; + } else if(*cpt=='d' || *cpt=='D') { +dvd_speed:; + num*= 1385; + } else { + + /* >>> try to determine target media */; + + if(is_cd) + goto cd_speed; + else + goto dvd_speed; + } + + if(num> 2.0e9) { + + /* >>> too large */; + + return(0); + } + xorriso->speed= num; + if(xorriso->speedspeed++; return(1); } @@ -4458,9 +4636,6 @@ int Xorriso_prescan_args(struct XorrisO *xorriso, int argc, char **argv, } -/* >>>>> BAUSTELLE */ - - #ifdef Xorriso_with_maiN int main(int argc, char **argv) diff --git a/libisoburn/trunk/test/xorriso_timestamp.h b/libisoburn/trunk/test/xorriso_timestamp.h index 537da611..4d2bf686 100644 --- a/libisoburn/trunk/test/xorriso_timestamp.h +++ b/libisoburn/trunk/test/xorriso_timestamp.h @@ -1 +1 @@ -#define Xorriso_timestamP "2007.10.13.103645" +#define Xorriso_timestamP "2007.10.13.141503"