nathan@0: /* cdrom.c nathan@4: Copyright (c) 2000-2004 Craig Condit, Stefan Hülswitt. nathan@0: nathan@0: Redistribution and use in source and binary forms, with or without nathan@0: modification, are permitted provided that the following conditions are met: nathan@0: nathan@0: 1. Redistributions of source code must retain the above copyright notice, nathan@0: this list of conditions and the following disclaimer. nathan@0: 2. Redistributions in binary form must reproduce the above copyright notice, nathan@0: this list of conditions and the following disclaimer in the documentation nathan@0: and/or other materials provided with the distribution. nathan@0: nathan@0: THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS nathan@0: OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED nathan@0: WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE nathan@0: DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR nathan@0: ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL nathan@0: DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR nathan@0: SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER nathan@0: CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT nathan@0: LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY nathan@0: OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF nathan@0: SUCH DAMAGE. nathan@0: */ nathan@0: nathan@0: #define _LARGEFILE64_SOURCE nathan@0: nathan@0: #include nathan@0: #include nathan@0: #include nathan@0: nathan@4: #ifdef linux nathan@4: #include nathan@4: #endif nathan@4: nathan@2: #include "cdrom.h" nathan@0: #include "misc.h" nathan@2: #include "debug.h" nathan@0: nathan@0: /* size of leadin/out depending of how many tracks are on cd */ nathan@4: #define LEADOUT_1 11400 /* 1th track */ nathan@4: #define LEADOUT_2 6900 /* 2nd and more tracks */ nathan@2: /* number of (unreadable) runout sectos */ nathan@2: #define RUNOUT 2 nathan@0: nathan@4: extern int fd; nathan@0: extern int verbose; nathan@0: extern char *prg_name; nathan@0: nathan@0: /****************************************************************************/ nathan@0: nathan@2: void get_param(int fd, unsigned long *ahead, unsigned long *fahead) nathan@2: { nathan@2: #if defined(BLKRAGET) && defined(BLKFRAGET) nathan@2: *ahead = *fahead = 0; nathan@2: ioctl(fd,BLKRAGET,ahead); nathan@2: ioctl(fd,BLKFRAGET,fahead); nathan@2: DEBUG("get_param: readahead=%ld freadahead=%ld\n",*ahead,*fahead); nathan@2: #else nathan@4: fprintf(stderr,"Can't get readahead parameter. Ioctl's not available\n"); nathan@2: #endif nathan@2: } nathan@2: nathan@2: /****************************************************************************/ nathan@2: nathan@2: void set_param(int fd, unsigned long ahead, unsigned long fahead) nathan@2: { nathan@2: #if defined(BLKRAGET) && defined(BLKFRAGET) nathan@4: ioctl(fd,BLKRASET,ahead); nathan@4: ioctl(fd,BLKFRASET,fahead); nathan@2: DEBUG("set_param: readahead=%ld freadahead=%ld\n",ahead,fahead); nathan@2: #else nathan@4: fprintf(stderr,"Can't set readahead parameter. Ioctl's not available\n"); nathan@2: #endif nathan@2: } nathan@2: nathan@2: /****************************************************************************/ nathan@2: nathan@4: int getCdHeader(struct cd_header *cd) nathan@0: { nathan@0: struct cdrom_tochdr cd_header; nathan@0: struct cdrom_tocentry cd_entry; nathan@4: int tracks; nathan@4: nathan@4: if(ioctl(fd,CDROMREADTOCHDR,&cd_header)<0) { nathan@4: if(verbose) fprintf(stderr,"%s: Unable to read CD header, assuming empty CD-R\n",prg_name); nathan@4: cd->start_track=1; cd->end_track=0; nathan@4: cd->used=0; nathan@4: return 0; nathan@0: } nathan@0: nathan@4: cd->start_track=cd_header.cdth_trk0; nathan@4: cd->end_track =cd_header.cdth_trk1; nathan@4: tracks=cd->end_track-cd->start_track+1; nathan@0: nathan@4: cd_entry.cdte_format=CDROM_LBA; nathan@4: cd_entry.cdte_track=CDROM_LEADOUT; nathan@4: if(ioctl(fd,CDROMREADTOCENTRY,&cd_entry)<0) error("Ioctl failed (lead-out)"); nathan@0: nathan@4: cd->used=cd_entry.cdte_addr.lba + (tracks==1 ? LEADOUT_1:LEADOUT_2); nathan@0: return tracks; nathan@0: } nathan@0: nathan@0: /****************************************************************************/ nathan@0: nathan@4: void getCdTrack(int num, struct cd_track *cd) nathan@0: { nathan@4: struct cdrom_tocentry cd_entry; nathan@4: nathan@4: cd_entry.cdte_format=CDROM_LBA; nathan@4: cd_entry.cdte_track=num; nathan@4: if(ioctl(fd,CDROMREADTOCENTRY,&cd_entry)<0) error("Ioctl failed (toc entry)"); nathan@4: nathan@4: cd->start_sec =cd_entry.cdte_addr.lba; nathan@4: cd->leadout_size=RUNOUT+(num==cd->start_track ? LEADOUT_1:LEADOUT_2); nathan@4: cd->is_data =(cd_entry.cdte_ctrl&CDROM_DATA_TRACK) ? 1:0; nathan@0: }