From 917f0425e39f5dfae1804faad712acb1ace178d5 Mon Sep 17 00:00:00 2001 From: Thomas Schmitt Date: Mon, 17 Sep 2007 16:35:33 +0000 Subject: [PATCH] Implemented emulation for cdrecord options -inq , -format , -load --- libburn/trunk/cdrskin/cdrskin.1 | 14 ++- libburn/trunk/cdrskin/cdrskin.c | 122 +++++++++++++++------- libburn/trunk/cdrskin/cdrskin_timestamp.h | 2 +- 3 files changed, 99 insertions(+), 39 deletions(-) diff --git a/libburn/trunk/cdrskin/cdrskin.1 b/libburn/trunk/cdrskin/cdrskin.1 index a37d1c94..d712421d 100644 --- a/libburn/trunk/cdrskin/cdrskin.1 +++ b/libburn/trunk/cdrskin/cdrskin.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 CDRSKIN 1 "September 8, 2007" +.TH CDRSKIN 1 "September 17, 2007" .\" Please adjust this date whenever revising the manpage. .\" .\" Some roff macros, for reference: @@ -360,7 +360,7 @@ Incremental Streaming (-tao). .RE .TP .BI \-checkdrive -Retrieve some info about the addressed drive. +Retrieve some info about the addressed drive and then exit. Exits with non-zero value if the drive cannot be found and opened. .TP .BI \-dao @@ -418,6 +418,9 @@ that drive and media will not simulate the write mode but will write for real. .B Caution: Use this only when in urgent need. .TP +.BI \-format +Same as blank=format_overwrite_full -force but restricted to DVD+RW. +.TP .BI fs= size Set the fifo size to the given value. The value may have appended letters which multiply the preceding number: @@ -437,6 +440,9 @@ option fifo_start_at=size. .BI gracetime= seconds Set the grace time before starting to write. (Default is 0) .TP +.BI -inq +Print the identification of the drive and then exit. +.TP .BI -isosize The next track following this option will try to obtain its source size from the header information out of the first few blocks of the source data. @@ -453,6 +459,10 @@ This option can be performed on track sources which are regular files or block devices. For the first track of the session it can be performed on any type of source if there is a fifo of at least 64 kiB. See option fs= . .TP +.BI -load +Load the media and exit. Exit value is 0 if any kind of media was found, non +zero else. Note: Option -eject will unload the media even if -load is given. +.TP .BI minbuf= percentage Equivalent to: .br diff --git a/libburn/trunk/cdrskin/cdrskin.c b/libburn/trunk/cdrskin/cdrskin.c index 5bb9b316..e9e8a7ba 100644 --- a/libburn/trunk/cdrskin/cdrskin.c +++ b/libburn/trunk/cdrskin/cdrskin.c @@ -2053,7 +2053,7 @@ return: #endif if(argc==1) { - fprintf(stderr,"cdrskin: SORRY : no options given. Try option --help\n"); + fprintf(stderr,"cdrskin: SORRY : No options given. Try option --help\n"); return(0); } for (i= 1;iprodvd_cli_compatible= 0; o->do_devices= 0; o->do_scanbus= 0; + o->do_load= 0; o->do_checkdrive= 0; o->do_msinfo= 0; o->msinfo_fd= -1; @@ -3191,6 +3196,7 @@ int Cdrskin_determine_media_caps(struct CdrskiN *skin, int flag) use burn_drive_scan_and_grab() bit1= do not load drive tray bit2= do not issue error message on failure + bit3= demand and evtl. report media, return 0 if none to see @return <=0 error, 1 success */ int Cdrskin_grab_drive(struct CdrskiN *skin, int flag) @@ -3198,6 +3204,7 @@ int Cdrskin_grab_drive(struct CdrskiN *skin, int flag) int ret,i,profile_number; struct burn_drive *drive; char profile_name[80]; + enum burn_disc_status s; #ifdef Cdrskin_grab_abort_brokeN int restore_handler= 0; #endif @@ -3302,6 +3309,17 @@ int Cdrskin_grab_drive(struct CdrskiN *skin, int flag) } skin->drive_is_grabbed= 1; + if((flag&8)) { + s= burn_disc_get_status(drive); + if(skin->verbosity>=Cdrskin_verbose_progresS) + Cdrskin_report_disc_status(skin,s,1); + if(s==BURN_DISC_EMPTY) { + Cdrskin_release_drive(skin,0); + fprintf(stderr,"cdrskin: SORRY : No media found in drive\n"); + ret= 0; goto ex; + } + } + Cdrskin_speed_factoR= Cdrskin_cd_speed_factoR; Cdrskin_libburn_speed_factoR= Cdrskin_libburn_cd_speed_factoR; Cdrskin_libburn_speed_addoN= Cdrskin_libburn_cd_speed_addoN; @@ -4023,8 +4041,12 @@ int Cdrskin_checkdrive(struct CdrskiN *skin, char *profile_name, int flag) int ret; char btldev[Cdrskin_adrleN]; - if(!(flag&1)) - ClN(printf("cdrskin: pseudo-checkdrive on drive %d\n",skin->driveno)); + if(!(flag&1)) { + if(flag&2) + ClN(printf("cdrskin: pseudo-inquiry on drive %d\n",skin->driveno)); + else + ClN(printf("cdrskin: pseudo-checkdrive on drive %d\n",skin->driveno)); + } if(skin->driveno>=skin->n_drives || skin->driveno<0) { fprintf(stderr,"cdrskin: FATAL : there is no drive #%d\n",skin->driveno); {ret= 0; goto ex;} @@ -4046,16 +4068,13 @@ int Cdrskin_checkdrive(struct CdrskiN *skin, char *profile_name, int flag) printf("Vendor_info : '%s'\n",drive_info->vendor); printf("Identifikation : '%s'\n",drive_info->product); printf("Revision : '%s'\n",drive_info->revision); + + if(flag&2) + {ret= 1; goto ex;} + printf("Driver flags : %s\n","BURNFREE"); #ifdef Cdrskin_allow_libburn_taO - /* <<< */ - if(skin->verbosity>=Cdrskin_verbose_debuG) - ClN(fprintf(stderr, - "cdrskin_debug: block_types: tao=%4.4X sao=%4.4X raw=%4.4X\n", - drive_info->tao_block_types,drive_info->sao_block_types, - drive_info->raw_block_types)); - printf("Supported modes:"); if((drive_info->tao_block_types & (BURN_BLOCK_MODE1)) == (BURN_BLOCK_MODE1)) @@ -4535,7 +4554,7 @@ int Cdrskin_blank(struct CdrskiN *skin, int flag) if(skin->verbosity>=Cdrskin_verbose_progresS) Cdrskin_report_disc_status(skin,s,1); do_format= skin->blank_format_type & 0xff; - if(do_format == 1) { + if(do_format == 1 || do_format == 3) { verb= "format"; presperf= "formatting"; } @@ -4566,9 +4585,17 @@ int Cdrskin_blank(struct CdrskiN *skin, int flag) goto unsupported_format_type; } - } else if (do_format==1) { + } else if(do_format==1 || do_format==3) { /* Formatting to become overwriteable for DVD-RW and DVD+RW */ + if(do_format==3 && profile_number != 0x1a) { + fprintf(stderr, "cdrskin: SORRY : -format does DVD+RW only\n"); + if(profile_number==0x14) + fprintf(stderr, + "cdrskin: HINT : blank=format_overwrite would format this media\n"); + {ret= 0; goto ex;} + } + if(profile_number == 0x14) { /* DVD-RW sequential */ /* ok */; } else if(profile_number == 0x13) { /* DVD-RW restricted overwrite */ @@ -4659,7 +4686,7 @@ unsupported_format_type:; Cdrskin_adjust_speed(skin,0); #ifndef Cdrskin_extra_leaN - Cdrskin_wait_before_action(skin,1+(do_format==1)); + Cdrskin_wait_before_action(skin,1+(do_format==1 || do_format==3)); #endif /* ! Cdrskin_extra_leaN */ skin->drive_is_busy= 1; @@ -4667,7 +4694,7 @@ unsupported_format_type:; burn_disc_erase(drive,skin->blank_fast); #ifdef Cdrskin_libburn_has_burn_disc_formaT - } else if(do_format==1) { + } else if(do_format==1 || do_format==3) { burn_disc_format(drive,(off_t) skin->blank_format_size, ((skin->blank_format_type>>8)&0xff) | ((!!skin->force_is_set)<<4)); #endif @@ -4702,7 +4729,8 @@ blanking_done:; fprintf(stderr, "\rcdrskin: %s done \n", presperf); - printf("%s time: %.3fs\n",(do_format==1?"Formatting":"Blanking"), + printf("%s time: %.3fs\n", + (do_format==1 || do_format==3?"Formatting":"Blanking"), Sfile_microtime(0)-start_time); } fflush(stdout); @@ -5570,7 +5598,7 @@ int Cdrskin_grow_overwriteable_iso(struct CdrskiN *skin, int flag) /* demand media descrN[0] == track descrN[0] */ if(td[0] != md[0]) { fprintf(stderr, - "cdrskin: SORRY : type mismatch of ISO volume descriptor #%d (%u <-> %u)\n", + "cdrskin: SORRY : Type mismatch of ISO volume descriptor #%d (%u <-> %u)\n", i, ((unsigned int) td[0]) & 0xff, ((unsigned int) md[0])&0xff); went_well= 0; } @@ -5647,7 +5675,7 @@ int Cdrskin_burn(struct CdrskiN *skin, int flag) if (s!=BURN_DISC_BLANK) { #endif Cdrskin_release_drive(skin,0); - fprintf(stderr,"cdrskin: FATAL : no writeable media detected.\n"); + fprintf(stderr,"cdrskin: FATAL : No writeable media detected.\n"); goto burn_failed; } @@ -5665,7 +5693,7 @@ int Cdrskin_burn(struct CdrskiN *skin, int flag) session= burn_session_create(); ret= burn_disc_add_session(disc,session,BURN_POS_END); if(ret==0) { - fprintf(stderr,"cdrskin: FATAL : cannot add session to disc object.\n"); + fprintf(stderr,"cdrskin: FATAL : Cannot add session to disc object.\n"); burn_failed:; if(skin->verbosity>=Cdrskin_verbose_progresS) printf("cdrskin: %s failed\n", doing); @@ -5679,7 +5707,7 @@ burn_failed:; Cdrtrack_ensure_padding(skin->tracklist[i],hflag&1); ret= Cdrtrack_add_to_session(skin->tracklist[i],i,session,hflag); if(ret<=0) { - fprintf(stderr,"cdrskin: FATAL : cannot add track %d to session.\n",i+1); + fprintf(stderr,"cdrskin: FATAL : Cannot add track %d to session.\n",i+1); goto burn_failed; } Cdrtrack_get_size(skin->tracklist[i],&size,&padding,§or_size, @@ -5739,7 +5767,7 @@ burn_failed:; Cdrtrack_get_source_path(skin->tracklist[i], &source_path,&source_fd,&is_from_stdin,0); fprintf(stderr, - "cdrskin: FATAL : cannot determine -isosize of track source\n"); + "cdrskin: FATAL : Cannot determine -isosize of track source\n"); fprintf(stderr, "cdrskin: '%s'\n", source_path); {ret= 0; goto ex;} @@ -5874,7 +5902,7 @@ burn_failed:; ret= Cdrskin_fill_fifo(skin,0); if(ret<=0) { fifo_filling_failed:; - fprintf(stderr,"cdrskin: FATAL : filling of fifo failed\n"); + fprintf(stderr,"cdrskin: FATAL : Filling of fifo failed\n"); goto ex; } @@ -5937,7 +5965,7 @@ fifo_filling_failed:; abh= skin->preskin->abort_handler; if(abh!=2) fprintf(stderr, - "\ncdrskin: FATAL : fifo encountered error during burn loop.\n"); + "\ncdrskin: FATAL : Fifo encountered error during burn loop.\n"); if(abh==0) { ret= -1; goto ex; } else if(abh==1 || abh==3 || abh==4 || abh==-1) { @@ -6016,7 +6044,7 @@ fifo_full_at_end:; ret= Cdrtrack_has_input_left(skin->tracklist[i],0); if(ret>0) { fprintf(stderr, - "cdrskin: FATAL : fifo outlet of track #%d is still buffering some bytes.\n", + "cdrskin: FATAL : Fifo outlet of track #%d is still buffering some bytes.\n", i+1); goto fifo_full_at_end; } @@ -6342,8 +6370,8 @@ int Cdrskin_setup(struct CdrskiN *skin, int argc, char **argv, int flag) "" }; static char ignored_full_options[][41]= { - "-d", "-Verbose", "-V", "-silent", "-s", "-setdropts", "-prcap", "-inq", - "-reset", "-abort", "-overburn", "-ignsize", "-useinfo", "-format", "-load", + "-d", "-Verbose", "-V", "-silent", "-s", "-setdropts", "-prcap", + "-reset", "-abort", "-overburn", "-ignsize", "-useinfo", "-lock", "-fix", "-nofix", "-waiti", "-immed", "-raw", "-raw96p", "-raw16", "-clone", "-text", "-mode2", "-xa", "-xa1", "-xa2", "-xamix", @@ -6500,9 +6528,7 @@ set_blank:; } else if(strcmp(cpt,"format_overwrite_full")==0) { skin->do_blank= 1; skin->blank_format_type= 1|(1<<10); - /* was : 1|(1<<8)|(1<<10); */ skin->blank_format_size= 0; - /* was: 32*1024; / * write just a minimal packet */ } else if(strcmp(cpt,"format_overwrite_quickest")==0) { skin->do_blank= 1; skin->blank_format_type= 1; @@ -6519,7 +6545,7 @@ set_blank:; /* is handled in Cdrpreskin_setup() */; continue; } else { - fprintf(stderr,"cdrskin: FATAL : blank option '%s' not supported yet\n", + fprintf(stderr,"cdrskin: FATAL : Blank option '%s' not supported yet\n", cpt); return(0); } @@ -6690,6 +6716,15 @@ set_driveropts:; } else if(strcmp(argv[i],"-force")==0) { skin->force_is_set= 1; + } else if(strcmp(argv[i],"-format")==0) { + skin->do_blank= 1; + skin->blank_format_type= 3|(1<<10); + skin->blank_format_size= 0; + skin->force_is_set= 1; + if(skin->verbosity>=Cdrskin_verbose_cmD) + ClN(printf( + "cdrskin: will format DVD+RW by blank=format_overwrite_full -force\n")); + #ifndef Cdrskin_extra_leaN } else if(strncmp(argv[i],"-fs=",4)==0) { @@ -6757,6 +6792,9 @@ gracetime_equals:; } else if(strcmp(argv[i],"--ignore_signals")==0) { /* is handled in Cdrpreskin_setup() */; + } else if(strcmp(argv[i],"-inq")==0) { + skin->do_checkdrive= 2; + } else if(strcmp(argv[i],"-isosize")==0) { skin->use_data_image_size= 1; @@ -6771,6 +6809,9 @@ gracetime_equals:; printf("%s\n",ignored_full_options[k]); printf("\n"); + } else if(strcmp(argv[i],"-load")==0) { + skin->do_load= 1; + } else if(strncmp(argv[i],"-minbuf=",8)==0) { value_pt= argv[i]+8; goto minbuf_equals; @@ -7018,7 +7059,7 @@ set_tsize:; skin->fixed_size= Scanf_io_size(value_pt,0); if(skin->fixed_size>Cdrskin_tracksize_maX) { track_too_large:; - fprintf(stderr,"cdrskin: FATAL : track size too large\n"); + fprintf(stderr,"cdrskin: FATAL : Track size too large\n"); return(0); } if(skin->verbosity>=Cdrskin_verbose_cmD) @@ -7044,7 +7085,7 @@ track_too_large:; (skin->single_track==-1)) { if(strlen(argv[i])>=sizeof(skin->source_path)) { fprintf(stderr, - "cdrskin: FATAL : source_address too long. (max: %d, given: %d)\n", + "cdrskin: FATAL : Source address too long. (max: %d, given: %d)\n", sizeof(skin->source_path)-1,strlen(argv[i])); return(0); } @@ -7074,7 +7115,7 @@ track_too_large:; source_has_size= 1; else if((stbuf.st_mode&S_IFMT)==S_IFDIR) { fprintf(stderr, - "cdrskin: FATAL : source address is a directory: '%s'\n", + "cdrskin: FATAL : Source address is a directory: '%s'\n", skin->source_path); return(0); } @@ -7082,7 +7123,7 @@ track_too_large:; } if(skin->track_counter>=Cdrskin_track_maX) { - fprintf(stderr,"cdrskin: FATAL : too many tracks given. (max %d)\n", + fprintf(stderr,"cdrskin: FATAL : Too many tracks given. (max %d)\n", Cdrskin_track_maX); return(0); } @@ -7091,7 +7132,7 @@ track_too_large:; (strcmp(skin->source_path,"-")==0)<<1); if(ret<=0) { fprintf(stderr, - "cdrskin: FATAL : creation of track control object failed.\n"); + "cdrskin: FATAL : Creation of track control object failed.\n"); return(ret); } skin->track_counter++; @@ -7224,7 +7265,7 @@ int Cdrskin_create(struct CdrskiN **o, struct CdrpreskiN **preskin, ret= Cdrskin_new(&skin,*preskin,1); if(ret<=0) { - fprintf(stderr,"cdrskin: FATAL : creation of control object failed\n"); + fprintf(stderr,"cdrskin: FATAL : Creation of control object failed\n"); {*exit_value= 2; goto ex;} } *preskin= NULL; /* the preskin object now is under management of skin */ @@ -7314,8 +7355,17 @@ int Cdrskin_run(struct CdrskiN *skin, int *exit_value, int flag) fprintf(stderr,"cdrskin: FATAL : -scanbus failed.\n"); {*exit_value= 5*(ret<=0); goto ex;} } + if(skin->do_load) { + ret= Cdrskin_grab_drive(skin,8); + if(ret>0) { + printf( + "cdrskin: NOTE : option -load orders program to exit after loading tray\n"); + Cdrskin_release_drive(skin,0); + } + {*exit_value= 14*(ret<=0); goto ex;} + } if(skin->do_checkdrive) { - ret= Cdrskin_checkdrive(skin,"",0); + ret= Cdrskin_checkdrive(skin,"",(skin->do_checkdrive==2)<<1); {*exit_value= 6*(ret<=0); goto ex;} } if(skin->do_msinfo) { diff --git a/libburn/trunk/cdrskin/cdrskin_timestamp.h b/libburn/trunk/cdrskin/cdrskin_timestamp.h index 3c898359..f9a5b5af 100644 --- a/libburn/trunk/cdrskin/cdrskin_timestamp.h +++ b/libburn/trunk/cdrskin/cdrskin_timestamp.h @@ -1 +1 @@ -#define Cdrskin_timestamP "2007.09.15.204320" +#define Cdrskin_timestamP "2007.09.17.163735"