diff --git a/cdrskin/cdrskin.c b/cdrskin/cdrskin.c index a05e86a..a0d0f77 100644 --- a/cdrskin/cdrskin.c +++ b/cdrskin/cdrskin.c @@ -1969,6 +1969,7 @@ see_cdrskin_eng_html:; fprintf(stderr, "\t-eject\t\teject the disk after doing the work (might be ignored)\n"); fprintf(stderr,"\t-dummy\t\tdo everything with laser turned off\n"); + fprintf(stderr,"\t-toc\t\tretrieve and print TOC/PMA data\n"); fprintf(stderr, "\t-atip\t\tretrieve media state, print \"Is *erasable\"\n"); fprintf(stderr,"\t-raw96r\t\tWrite disk in RAW/RAW96R mode\n"); @@ -3321,7 +3322,64 @@ ex:; } +/** Perform -toc under control of Cdrskin_atip(). + @return <=0 error, 1 success +*/ +int Cdrskin_toc(struct CdrskiN *skin, int flag) +{ + int num_sessions= 0,num_tracks= 0,lba; + int session_no, track_no; + struct burn_drive *drive; + struct burn_disc *disc= NULL; + struct burn_session **sessions; + struct burn_track **tracks; + struct burn_toc_entry toc_entry; + + drive= skin->drives[skin->driveno].drive; + + disc= burn_drive_get_disc(drive); + if(disc==NULL) + goto cannot_read; + sessions= burn_disc_get_sessions(disc,&num_sessions); + if(disc==NULL) + goto cannot_read; + for(session_no= 0; session_no>> from where does cdrecord take "mode" ? */; + + printf(" mode: %d\n",((toc_entry.control&7)<4?0:1)); + } + burn_session_get_leadout_entry(sessions[session_no],&toc_entry); + lba= burn_msf_to_lba(toc_entry.pmin,toc_entry.psec,toc_entry.pframe); + printf("track:lout lba: %9d (%9d) %2.2u:%2.2u:%2.2u", + lba,4*lba,toc_entry.pmin,toc_entry.psec,toc_entry.pframe); + printf(" adr: %d control: %d",toc_entry.adr,toc_entry.control); + printf(" mode: -1\n"); + } + + if(disc!=NULL) + burn_disc_free(disc); + return(1); +cannot_read:; + fprintf(stderr,"cdrecord_emulation: Cannot read TOC header\n"); + fprintf(stderr,"cdrecord_emulation: Cannot read TOC/PMA\n"); + return(0); +} + + /** Perform -atip . + @param flag Bitfield for control purposes: + bit0= perform -toc @return <=0 error, 1 success */ int Cdrskin_atip(struct CdrskiN *skin, int flag) @@ -3453,6 +3511,8 @@ int Cdrskin_atip(struct CdrskiN *skin, int flag) printf(" 1T speed low: %.f 1T speed high: %.f\n",x_speed_min,x_speed_max); ret= 1; + if(flag&1) + ret= Cdrskin_toc(skin,0); ex:; Cdrskin_release_drive(skin,0); return(ret); @@ -4280,7 +4340,7 @@ 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", - "-lock", "-msinfo", "-toc", "-multi", "-fix", "-nofix", "-waiti", + "-lock", "-msinfo", "-multi", "-fix", "-nofix", "-waiti", "-immed", "-force", "-raw", "-raw96p", "-raw16", "-clone", "-text", "-mode2", "-xa", "-xa1", "-xa2", "-xamix", "-cdi", "-isosize", "-preemp", "-nopreemp", "-copy", "-nocopy", @@ -4381,7 +4441,7 @@ set_abort_max_wait:; } else if(strcmp(argv[i],"-atip")==0) { skin->do_atip= 1; if(skin->verbosity>=Cdrskin_verbose_cmD) - printf("cdrskin: will put out some -atip style line\n"); + printf("cdrskin: will put out some -atip style lines\n"); } else if(strcmp(argv[i],"-audio")==0) { skin->track_type= BURN_AUDIO; @@ -4677,6 +4737,11 @@ set_speed:; printf("cdrskin: replace -tao by -sao with fixed size : %.f\n", skin->tao_to_sao_tsize); + } else if(strcmp(argv[i],"-toc")==0) { + skin->do_atip= 2; + if(skin->verbosity>=Cdrskin_verbose_cmD) + printf("cdrskin: will put out some -atip style lines plus -toc\n"); + } else if(strncmp(argv[i],"-tsize=",7)==0) { value_pt= argv[i]+7; goto set_tsize; @@ -4938,7 +5003,7 @@ int Cdrskin_run(struct CdrskiN *skin, int *exit_value, int flag) if(skin->do_atip) { if(skin->n_drives<=0) {*exit_value= 7; goto no_drive;} - ret= Cdrskin_atip(skin,0); + ret= Cdrskin_atip(skin,!!(skin->do_atip>1)); if(ret<=0) {*exit_value= 7; goto ex;} } diff --git a/cdrskin/cdrskin_timestamp.h b/cdrskin/cdrskin_timestamp.h index 941a1ae..1166676 100644 --- a/cdrskin/cdrskin_timestamp.h +++ b/cdrskin/cdrskin_timestamp.h @@ -1 +1 @@ -#define Cdrskin_timestamP "2006.10.21.185102" +#define Cdrskin_timestamP "2006.10.22.130341" diff --git a/cdrskin/cleanup.c b/cdrskin/cleanup.c index f3ea8b0..6c9f3b6 100644 --- a/cdrskin/cleanup.c +++ b/cdrskin/cleanup.c @@ -87,6 +87,8 @@ static int Cleanup_handler_exit(int exit_value, int signum, int flag) { int ret; + if(cleanup_msg[0]!=0) + fprintf(stderr,"\n%s\n",cleanup_msg); if(cleanup_perform_app_handler_first) if(cleanup_app_handler!=NULL) { ret= (*cleanup_app_handler)(cleanup_app_handle,signum,0); @@ -94,15 +96,11 @@ static int Cleanup_handler_exit(int exit_value, int signum, int flag) return(2); } if(cleanup_exiting) { - if(cleanup_msg[0]!=0) - fprintf(stderr,"%s\n",cleanup_msg); fprintf(stderr,"cleanup: ABORT : repeat by pid=%d, signum=%d\n", getpid(),signum); return(0); } cleanup_exiting= 1; - if(cleanup_msg[0]!=0) - fprintf(stderr,"\n%s\n",cleanup_msg); alarm(0); if(!cleanup_perform_app_handler_first) if(cleanup_app_handler!=NULL) { diff --git a/libburn/cleanup.c b/libburn/cleanup.c index f3ea8b0..6c9f3b6 100644 --- a/libburn/cleanup.c +++ b/libburn/cleanup.c @@ -87,6 +87,8 @@ static int Cleanup_handler_exit(int exit_value, int signum, int flag) { int ret; + if(cleanup_msg[0]!=0) + fprintf(stderr,"\n%s\n",cleanup_msg); if(cleanup_perform_app_handler_first) if(cleanup_app_handler!=NULL) { ret= (*cleanup_app_handler)(cleanup_app_handle,signum,0); @@ -94,15 +96,11 @@ static int Cleanup_handler_exit(int exit_value, int signum, int flag) return(2); } if(cleanup_exiting) { - if(cleanup_msg[0]!=0) - fprintf(stderr,"%s\n",cleanup_msg); fprintf(stderr,"cleanup: ABORT : repeat by pid=%d, signum=%d\n", getpid(),signum); return(0); } cleanup_exiting= 1; - if(cleanup_msg[0]!=0) - fprintf(stderr,"\n%s\n",cleanup_msg); alarm(0); if(!cleanup_perform_app_handler_first) if(cleanup_app_handler!=NULL) { diff --git a/libburn/drive.c b/libburn/drive.c index 0d1f674..32815c6 100644 --- a/libburn/drive.c +++ b/libburn/drive.c @@ -662,6 +662,10 @@ int burn_drive_info_forget(struct burn_drive_info *info, int force) struct burn_disc *burn_drive_get_disc(struct burn_drive *d) { + /* ts A61022: SIGSEGV on calling this function with blank media */ + if(d->disc == NULL) + return NULL; + d->disc->refcnt++; return d->disc; } diff --git a/libburn/libburn.h b/libburn/libburn.h index 061099f..1319344 100644 --- a/libburn/libburn.h +++ b/libburn/libburn.h @@ -868,7 +868,7 @@ void burn_session_hide_first_track(struct burn_session *s, int onoff); /** Get the drive's disc struct - free when done @param d drive to query - @return the disc struct + @return the disc struct or NULL on failure */ struct burn_disc *burn_drive_get_disc(struct burn_drive *d); diff --git a/libburn/mmc.c b/libburn/mmc.c index f430322..7483d76 100644 --- a/libburn/mmc.c +++ b/libburn/mmc.c @@ -272,7 +272,7 @@ void mmc_read_toc(struct burn_drive *d) struct buffer buf; struct command c; int dlen; - int i; + int i, bpl= 12; unsigned char *tdata; mmc_function_spy("mmc_read_toc"); @@ -326,12 +326,21 @@ void mmc_read_toc(struct burn_drive *d) burn_disc_add_session(d->disc, session, BURN_POS_END); burn_session_free(session); } + + /* ts A61022 */ + burn_print(bpl, "-----------------------------------\n"); + for (i = 0; i < d->toc_entries; i++, tdata += 11) { - burn_print(12, "S %d, PT %d, TNO %d : ", tdata[0], tdata[3], + + /* ts A61022: was burn_print level 12 */ + burn_print(bpl, "S %d, PT %2.2Xh, TNO %d :", tdata[0],tdata[3], tdata[2]); - burn_print(12, "(%d:%d:%d)", tdata[8], tdata[9], tdata[10]); - burn_print(12, "A(%d:%d:%d)", tdata[4], tdata[5], tdata[6]); - burn_print(12, " - control %d, adr %d\n", tdata[1] & 0xF, + burn_print(bpl, " MSF(%d:%d:%d)", tdata[4],tdata[5],tdata[6]); + burn_print(bpl, " PMSF(%d:%d:%d %d)", + tdata[8], tdata[9], tdata[10], + burn_msf_to_lba(tdata[8], tdata[9], tdata[10]) + ); + burn_print(bpl, " - control %d, adr %d\n", tdata[1] & 0xF, tdata[1] >> 4); /* @@ -376,6 +385,10 @@ void mmc_read_toc(struct burn_drive *d) d->disc->session[tdata[0] - 1]->leadout_entry = &d->toc_entry[i]; } + + /* ts A61022 */ + burn_print(bpl, "-----------------------------------\n"); + if (d->status != BURN_DISC_APPENDABLE) d->status = BURN_DISC_FULL; toc_find_modes(d);