/* In the future we'll have more complicated code to allow selection of an I/O routine as well as code to find an appropriate default routine among the "registered" routines. Possibly classes too disk-based, SCSI-based, native-based, vendor (e.g. Sony, or Plextor) based For now though, we'll start more simply... */ CdIo * cdio_open_cd (const char *source_name) { if (CdIo_last_driver == -1) cdio_init(); /* Scan for a driver. */ return scan_for_driver(CDIO_MIN_DEVICE_DRIVER, CDIO_MAX_DEVICE_DRIVER, source_name); }
/*! Return the the kind of drive capabilities of device. Note: string is malloc'd so caller should free() then returned string when done with it. */ void cdio_get_drive_cap_dev (const char *device, cdio_drive_read_cap_t *p_read_cap, cdio_drive_write_cap_t *p_write_cap, cdio_drive_misc_cap_t *p_misc_cap) { /* This seems like a safe bet. */ CdIo_t *cdio=scan_for_driver(CDIO_MIN_DRIVER, CDIO_MAX_DRIVER, device, NULL); if (cdio) { cdio_get_drive_cap(cdio, p_read_cap, p_write_cap, p_misc_cap); cdio_destroy(cdio); } else { *p_read_cap = CDIO_DRIVE_CAP_UNKNOWN; *p_write_cap = CDIO_DRIVE_CAP_UNKNOWN; *p_misc_cap = CDIO_DRIVE_CAP_UNKNOWN; } }
/*! Sets up to read from place specified by source_name and driver_id. This should be called before using any other routine, except cdio_init. This will call cdio_init, if that hasn't been done previously. NULL is returned on error. */ CdIo * cdio_open (const char *orig_source_name, driver_id_t driver_id) { char *source_name; if (CdIo_last_driver == -1) cdio_init(); if (NULL == orig_source_name || strlen(orig_source_name)==0) source_name = cdio_get_default_device(NULL); else source_name = strdup(orig_source_name); retry: switch (driver_id) { case DRIVER_UNKNOWN: { CdIo *cdio=scan_for_driver(CDIO_MIN_DRIVER, CDIO_MAX_DRIVER, source_name); if (cdio != NULL && cdio_is_device(source_name, cdio->driver_id)) { driver_id = cdio->driver_id; } else { struct stat buf; if (0 != stat(source_name, &buf)) { return NULL; } if (S_ISREG(buf.st_mode)) { /* FIXME: check to see if is a text file. If so, then set SOURCE_CUE. */ int i=strlen(source_name)-strlen("bin"); if (i > 0 && ( (source_name)[i] =='n' || (source_name)[i] =='N' ) && ( (source_name)[i+1] =='r' || (source_name)[i+1] =='R' ) && ( (source_name)[i+2] =='g' || (source_name)[i+2] =='G' ) ) driver_id = DRIVER_NRG; else if (i > 0 && ( (source_name)[i] =='c' || (source_name)[i] =='C') && ( (source_name)[i+1] =='u' || (source_name)[i+1] =='U') && ( (source_name)[i+2] =='e' || (source_name)[i+2] =='E') ) driver_id = DRIVER_BINCUE; else driver_id = DRIVER_BINCUE; } else { cdio_destroy(cdio); return NULL; } } cdio_destroy(cdio); goto retry; } case DRIVER_DEVICE: { /* Scan for a driver. */ CdIo *ret = cdio_open_cd(source_name); free(source_name); return ret; } break; case DRIVER_BSDI: case DRIVER_FREEBSD: case DRIVER_LINUX: case DRIVER_SOLARIS: case DRIVER_WIN32: case DRIVER_OSX: case DRIVER_NRG: case DRIVER_BINCUE: if ((*CdIo_all_drivers[driver_id].have_driver)()) { CdIo *ret = (*CdIo_all_drivers[driver_id].driver_open)(source_name); if (ret) ret->driver_id = driver_id; return ret; } } free(source_name); return NULL; }