1.1 --- a/cdrom.c Sat Dec 29 15:22:44 2007 +0100
1.2 +++ b/cdrom.c Sat Dec 29 15:23:49 2007 +0100
1.3 @@ -31,14 +31,19 @@
1.4 #include <fcntl.h>
1.5 #include <string.h>
1.6 #include <linux/cdrom.h>
1.7 +#include <linux/fs.h>
1.8 #include <sys/ioctl.h>
1.9
1.10 +#include "cdrom.h"
1.11 #include "cdbackup.h"
1.12 #include "misc.h"
1.13 +#include "debug.h"
1.14
1.15 /* size of leadin/out depending of how many tracks are on cd */
1.16 #define MIN_FREE_1 (11400*CD_FRAMESIZE) /* 1th track */
1.17 #define MIN_FREE_2 (6900*CD_FRAMESIZE) /* 2nd and more tracks */
1.18 +/* number of (unreadable) runout sectos */
1.19 +#define RUNOUT 2
1.20
1.21 struct toc_entry *toc=0;
1.22 long long cd_used, cd_avail;
1.23 @@ -63,6 +68,33 @@
1.24
1.25 /****************************************************************************/
1.26
1.27 +void get_param(int fd, unsigned long *ahead, unsigned long *fahead)
1.28 +{
1.29 +#if defined(BLKRAGET) && defined(BLKFRAGET)
1.30 + *ahead = *fahead = 0;
1.31 + ioctl(fd,BLKRAGET,ahead);
1.32 + ioctl(fd,BLKFRAGET,fahead);
1.33 + DEBUG("get_param: readahead=%ld freadahead=%ld\n",*ahead,*fahead);
1.34 +#else
1.35 + fprintf("Can't get readahead parameter. Ioctl's not available\n");
1.36 +#endif
1.37 +}
1.38 +
1.39 +/****************************************************************************/
1.40 +
1.41 +void set_param(int fd, unsigned long ahead, unsigned long fahead)
1.42 +{
1.43 +#if defined(BLKRAGET) && defined(BLKFRAGET)
1.44 + ioctl(fd, BLKRASET, ahead);
1.45 + ioctl(fd, BLKFRASET, fahead);
1.46 + DEBUG("set_param: readahead=%ld freadahead=%ld\n",ahead,fahead);
1.47 +#else
1.48 + fprintf("Can't set readahead parameter. Ioctl's not available\n");
1.49 +#endif
1.50 +}
1.51 +
1.52 +/****************************************************************************/
1.53 +
1.54 int full_read(int fd, void *buf, int count)
1.55 {
1.56 int total=0;
1.57 @@ -101,6 +133,7 @@
1.58 /* get start and end tracks */
1.59 start_track = cd_header.cdth_trk0;
1.60 tracks = cd_header.cdth_trk1-start_track+1;
1.61 + DEBUG("read_toc: starttrack=%d tracks=%d\n",start_track,tracks);
1.62
1.63 free_toc();
1.64 if(!(toc=calloc(tracks+1,sizeof(struct toc_entry)))) serror("No memory for TOC");
1.65 @@ -115,8 +148,11 @@
1.66 toc[0].track_no=CDROM_LEADOUT; /* not a real track */
1.67 toc[0].sec_start=cd_entry.cdte_addr.lba;
1.68
1.69 - cd_used=(long long)toc[0].sec_start*CD_FRAMESIZE; cd_avail=(long long)cd_len*CD_FRAMESIZE-cd_used;
1.70 + cd_used =(long long)toc[0].sec_start*CD_FRAMESIZE;
1.71 + cd_avail =(long long)cd_len*CD_FRAMESIZE-cd_used;
1.72 cd_avail-=(tracks>1?MIN_FREE_2:MIN_FREE_1);
1.73 + DEBUG("read_toc: cd_used=%lld (%lld secs) cd_avail=%lld (%lld secs)\n",cd_used,cd_used/CD_FRAMESIZE,cd_avail,cd_avail/CD_FRAMESIZE);
1.74 +
1.75 if(cd_avail<0) cd_avail=0; /* can be <0 due to assumed additional lead-in/out */
1.76
1.77 /* read rest of tracks */
1.78 @@ -129,6 +165,11 @@
1.79 if(cd_entry.cdte_ctrl&CDROM_DATA_TRACK) toc[i].is_data=1;
1.80 }
1.81
1.82 + /* calculate end sectors */
1.83 + toc[tracks].sec_end = toc[ 0].sec_start - 1 - RUNOUT;
1.84 + for(i=1; i<tracks; i++)
1.85 + toc[i].sec_end = toc[i+1].sec_start - 1 - RUNOUT - (i>1?(MIN_FREE_2/CD_FRAMESIZE):(MIN_FREE_1/CD_FRAMESIZE));
1.86 +
1.87 if(trackinfos)
1.88 /* now loop through tracks and read header info */
1.89 for(i=1; i<=tracks; i++) {