cdrom.c
branchtrunk
changeset 2 6bcb44b9edb1
parent 0 d85c12073dea
child 4 79da91042fcc
     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++) {