diff --git a/README.libcdio b/README.libcdio index 5369f7be..41a5301b 100644 --- a/README.libcdio +++ b/README.libcdio @@ -22,6 +22,12 @@ the VCD reporting portion and you don't already have vcdimager installed, build and install libcdio, then vcdimager, then configure libcdio again and it should find libvcdinfo. +People who make packages might consider making two packages, a libcdio +package with just the libraries (and no dependency on libvcdinfo) and +a libcdio-utils which contains cd-info and iso-info, cd-read, +iso-read. Should you want cd-info with VCD support then you'd add a +depedency in that package to libvcdinfo. + BSD --- @@ -56,4 +62,4 @@ spent far more time on this platform than I care for. If someone is interested in fixing the Microsoft OS support great. -$Id: README.libcdio,v 1.4 2004/03/01 01:34:37 rocky Exp $ \ No newline at end of file +$Id: README.libcdio,v 1.5 2004/04/22 03:24:38 rocky Exp $ \ No newline at end of file diff --git a/configure.ac b/configure.ac index cf506db5..e2ea26a6 100644 --- a/configure.ac +++ b/configure.ac @@ -15,11 +15,11 @@ dnl along with this program; if not, write to the Free Software dnl Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA dnl 02111-1307, USA. -define(RELEASE_NUM, 68) -define(CDIO_VERSION_STR, 0.$1) +define(RELEASE_NUM, 69) +define(CDIO_VERSION_STR, 0.$1cvs) AC_PREREQ(2.52) -AC_REVISION([$Id: configure.ac,v 1.73 2004/03/24 00:06:12 rocky Exp $])dnl +AC_REVISION([$Id: configure.ac,v 1.74 2004/04/22 03:24:38 rocky Exp $])dnl AC_INIT(libcdio, CDIO_VERSION_STR(RELEASE_NUM)) AC_CONFIG_SRCDIR(src/cd-info.c) AM_INIT_AUTOMAKE diff --git a/example/sample2.c b/example/sample2.c index a615478c..3d68cba2 100644 --- a/example/sample2.c +++ b/example/sample2.c @@ -1,5 +1,5 @@ /* - $Id: sample2.c,v 1.4 2004/03/20 13:12:22 rocky Exp $ + $Id: sample2.c,v 1.5 2004/04/22 03:24:38 rocky Exp $ Copyright (C) 2003, 2004 Rocky Bernstein @@ -41,10 +41,36 @@ main(int argc, const char *argv[]) if (NULL != cdio) { char *default_device = cdio_get_default_device(cdio); + printf("The driver selected is %s\n", cdio_get_driver_name(cdio)); - printf("The default device for this driver is %s\n\n", default_device); + + if (default_device) { + cdio_drive_cap_t i_drive_cap = cdio_get_drive_cap(default_device); + printf("The default device for this driver is %s\n", default_device); + printf("drive capability in hex: %x\n", i_drive_cap); + if (CDIO_DRIVE_ERROR == i_drive_cap) { + printf("Error in getting drive properties\n"); + } else if (CDIO_DRIVE_UNKNOWN == i_drive_cap) { + printf("Can't determine drive properties\n"); + } else if (CDIO_DRIVE_FILE == i_drive_cap) { + printf("Can't determine drive properties\n"); + } else { + if (i_drive_cap & CDIO_DRIVE_CD_R) + printf("Drive can read CD-ROM\n"); + if (i_drive_cap & CDIO_DRIVE_CD_RW) + printf("Drive can write CD-ROM\n"); + if (i_drive_cap & CDIO_DRIVE_DVD) + printf("Drive can read DVD\n"); + if (i_drive_cap & CDIO_DRIVE_DVD_R) + printf("Drive can write DVD-R\n"); + if (i_drive_cap & CDIO_DRIVE_DVD_RAM) + printf("Drive can write DVD-RAM\n"); + } + } + free(default_device); cdio_destroy(cdio); + printf("\n"); } else { printf("Problem in trying to find a driver.\n\n"); } diff --git a/include/cdio/cdio.h b/include/cdio/cdio.h index f5373e63..19b69100 100644 --- a/include/cdio/cdio.h +++ b/include/cdio/cdio.h @@ -1,5 +1,5 @@ /* -*- c -*- - $Id: cdio.h,v 1.37 2004/03/20 22:46:57 rocky Exp $ + $Id: cdio.h,v 1.38 2004/04/22 03:24:38 rocky Exp $ Copyright (C) 2001 Herbert Valerio Riedel Copyright (C) 2003, 2004 Rocky Bernstein @@ -44,13 +44,26 @@ #include #include -/* Flags specifying the category of device to open or is opened. */ +/**! Flags specifying the category of device to open or is opened. */ #define CDIO_SRC_IS_DISK_IMAGE_MASK 0x0001 /**< Read source is a CD image. */ #define CDIO_SRC_IS_DEVICE_MASK 0x0002 /**< Read source is a CD device. */ -#define CDIO_SRC_IS_SCSI_MASK 0x0004 +#define CDIO_SRC_IS_SCSI_MASK 0x0004 /**< Read source SCSI device. */ #define CDIO_SRC_IS_NATIVE_MASK 0x0008 +/*! + \brief Drive types returned by cdio_get_drive_cap() + */ +#define CDIO_DRIVE_ERROR 0x0000 /**< Error */ +#define CDIO_DRIVE_UNKNOWN 0x0001 /**< Dunno */ +#define CDIO_DRIVE_FILE 0x1000 /**< drive is really a file, i.e a + CD file image */ +#define CDIO_DRIVE_CD_R 0x2000 /**< drive is a CD-R */ +#define CDIO_DRIVE_CD_RW 0x4000 /**< drive is a CD-RW */ +#define CDIO_DRIVE_DVD 0x8000 /**< drive is a DVD */ +#define CDIO_DRIVE_DVD_R 0x10000 /**< drive can write DVD-R */ +#define CDIO_DRIVE_DVD_RAM 0x20000 /**< drive can write DVD-RAM */ + #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ @@ -170,6 +183,13 @@ extern "C" { */ char * cdio_get_default_device (const CdIo *obj); + /*! + Return the what kind of device we've got. + + See above for a list of bitmasks for the drive type; + */ + cdio_drive_cap_t cdio_get_drive_cap (const char *device); + /*! Return the media catalog number (MCN) from the CD or NULL if there is none or we don't have the ability to get it. diff --git a/include/cdio/types.h b/include/cdio/types.h index 34c2115f..9b2c1f38 100644 --- a/include/cdio/types.h +++ b/include/cdio/types.h @@ -1,5 +1,5 @@ /* - $Id: types.h,v 1.10 2004/03/13 03:32:49 rocky Exp $ + $Id: types.h,v 1.11 2004/04/22 03:24:38 rocky Exp $ Copyright (C) 2000 Herbert Valerio Riedel Copyright (C) 2002, 2003, 2004 Rocky Bernstein @@ -216,6 +216,9 @@ extern "C" { /*! The type of an track number 0..99. */ typedef uint8_t track_t; + /*! The type of an Logical Sector Number. */ + typedef uint32_t cdio_drive_cap_t; + /*! Constant for invalid track number */ diff --git a/lib/_cdio_linux.c b/lib/_cdio_linux.c index fe7c2cde..2160465b 100644 --- a/lib/_cdio_linux.c +++ b/lib/_cdio_linux.c @@ -1,5 +1,5 @@ /* - $Id: _cdio_linux.c,v 1.32 2004/03/07 02:42:22 rocky Exp $ + $Id: _cdio_linux.c,v 1.33 2004/04/22 03:24:38 rocky Exp $ Copyright (C) 2001 Herbert Valerio Riedel Copyright (C) 2002, 2003, 2004 Rocky Bernstein @@ -27,7 +27,7 @@ # include "config.h" #endif -static const char _rcsid[] = "$Id: _cdio_linux.c,v 1.32 2004/03/07 02:42:22 rocky Exp $"; +static const char _rcsid[] = "$Id: _cdio_linux.c,v 1.33 2004/04/22 03:24:38 rocky Exp $"; #include @@ -813,13 +813,33 @@ static char * _cdio_get_mcn (void *env) { struct cdrom_mcn mcn; - _img_private_t *_obj = env; + const _img_private_t *_obj = env; memset(&mcn, 0, sizeof(mcn)); if (ioctl(_obj->gen.fd, CDROM_GET_MCN, &mcn) != 0) return NULL; return strdup(mcn.medium_catalog_number); } +/*! + 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. + + */ +static cdio_drive_cap_t +_cdio_get_drive_cap (const void *env) { + const _img_private_t *_obj = env; + int32_t i_drivetype; + + i_drivetype = ioctl (_obj->gen.fd, CDROM_GET_CAPABILITY, CDSL_CURRENT); + + if (i_drivetype < 0) return CDIO_DRIVE_ERROR; + + /* If >= 0 we can safely cast as cdio_drive_cap_t and return */ + return (cdio_drive_cap_t) i_drivetype; +} + /*! Return the number of tracks in the current medium. CDIO_INVALID_TRACK is returned on error. @@ -1060,6 +1080,7 @@ cdio_open_linux (const char *orig_source_name) .get_arg = _cdio_get_arg, .get_devices = cdio_get_devices_linux, .get_default_device = cdio_get_default_device_linux, + .get_drive_cap = _cdio_get_drive_cap, .get_first_track_num= _cdio_get_first_track_num, .get_mcn = _cdio_get_mcn, .get_num_tracks = _cdio_get_num_tracks, diff --git a/lib/cdio.c b/lib/cdio.c index 38f3e1ff..b4a6f508 100644 --- a/lib/cdio.c +++ b/lib/cdio.c @@ -1,5 +1,5 @@ /* - $Id: cdio.c,v 1.43 2004/03/21 03:43:06 rocky Exp $ + $Id: cdio.c,v 1.44 2004/04/22 03:24:38 rocky Exp $ Copyright (C) 2003, 2004 Rocky Bernstein Copyright (C) 2001 Herbert Valerio Riedel @@ -37,7 +37,7 @@ #include #include "cdio_private.h" -static const char _rcsid[] = "$Id: cdio.c,v 1.43 2004/03/21 03:43:06 rocky Exp $"; +static const char _rcsid[] = "$Id: cdio.c,v 1.44 2004/04/22 03:24:38 rocky Exp $"; const char *track_format2str[6] = @@ -376,6 +376,29 @@ cdio_get_devices_with_cap (char* search_devices[], return drives_ret; } +/*! + 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. + + */ +unsigned int +cdio_get_drive_cap (const char *device) +{ + cdio_drive_cap_t i_drivetype = CDIO_DRIVE_UNKNOWN; + + CdIo *cdio=scan_for_driver(CDIO_MIN_DRIVER, CDIO_MAX_DRIVER, + device); + + if (cdio && cdio->op.get_drive_cap) { + i_drivetype=cdio->op.get_drive_cap(cdio->env); + cdio_destroy(cdio); + } + return i_drivetype; +} + + /*! Return a string containing the name of the driver in use. if CdIo is NULL (we haven't initialized a specific device driver), diff --git a/lib/cdio_private.h b/lib/cdio_private.h index fae2bc02..7f4ffb81 100644 --- a/lib/cdio_private.h +++ b/lib/cdio_private.h @@ -1,5 +1,5 @@ /* - $Id: cdio_private.h,v 1.19 2004/03/05 04:23:52 rocky Exp $ + $Id: cdio_private.h,v 1.20 2004/04/22 03:24:38 rocky Exp $ Copyright (C) 2003, 2004 Rocky Bernstein @@ -69,6 +69,13 @@ extern "C" { */ char * (*get_default_device)(void); + /*! + Return the what kind of device we've got. + + See cd_types.h for a list of bitmasks for the drive type; + */ + unsigned int (*get_drive_cap) (const void *env); + /*! Return the media catalog number MCN from the CD or NULL if there is none or we don't have the ability to get it.