From d8566f16a97c6402cef88e9656515b469da40031 Mon Sep 17 00:00:00 2001 From: rocky Date: Mon, 24 Mar 2003 23:59:22 +0000 Subject: [PATCH] _cdio_linux.c: eject routines does it's own open and close. cdio.h, Makefile.am, cdio.c: Add FreeBSD routine (not complete yet). --- lib/Makefile.am | 3 ++- lib/_cdio_bsdi.c | 6 +++--- lib/_cdio_linux.c | 30 ++++++++++++++++-------------- lib/cdio.c | 31 ++++++++++++++++++++----------- lib/cdio.h | 13 ++++++++++--- 5 files changed, 51 insertions(+), 32 deletions(-) diff --git a/lib/Makefile.am b/lib/Makefile.am index f6346fe9..93d8b4b6 100644 --- a/lib/Makefile.am +++ b/lib/Makefile.am @@ -1,4 +1,4 @@ -# $Id: Makefile.am,v 1.1 2003/03/24 19:01:09 rocky Exp $ +# $Id: Makefile.am,v 1.2 2003/03/24 23:59:22 rocky Exp $ # # Copyright (C) 2003 Rocky Bernstein # @@ -28,6 +28,7 @@ include_HEADERS = cdio.h logging.h sector.h cdio_types.h util.h libcdio_sources = \ _cdio_bincue.c \ _cdio_bsdi.c \ + _cdio_freebsd.c \ _cdio_linux.c \ _cdio_nrg.c \ _cdio_stdio.c \ diff --git a/lib/_cdio_bsdi.c b/lib/_cdio_bsdi.c index 14c03aa5..79a45039 100644 --- a/lib/_cdio_bsdi.c +++ b/lib/_cdio_bsdi.c @@ -1,5 +1,5 @@ /* - $Id: _cdio_bsdi.c,v 1.1 2003/03/24 19:01:09 rocky Exp $ + $Id: _cdio_bsdi.c,v 1.2 2003/03/24 23:59:22 rocky Exp $ Copyright (C) 2001 Herbert Valerio Riedel Copyright (C) 2003 Rocky Bernstein @@ -33,7 +33,7 @@ #include #include -static const char _rcsid[] = "$Id: _cdio_bsdi.c,v 1.1 2003/03/24 19:01:09 rocky Exp $"; +static const char _rcsid[] = "$Id: _cdio_bsdi.c,v 1.2 2003/03/24 23:59:22 rocky Exp $"; #if HAVE_BSDI_CDROM @@ -127,7 +127,7 @@ _cdio_free (void *user_data) } static int -_set_bsize (int fd, unsigned bsize) +_set_bsize (int fd, unsigned int bsize) { struct { diff --git a/lib/_cdio_linux.c b/lib/_cdio_linux.c index 16363207..3f197cae 100644 --- a/lib/_cdio_linux.c +++ b/lib/_cdio_linux.c @@ -1,5 +1,5 @@ /* - $Id: _cdio_linux.c,v 1.1 2003/03/24 19:01:09 rocky Exp $ + $Id: _cdio_linux.c,v 1.2 2003/03/24 23:59:22 rocky Exp $ Copyright (C) 2001 Herbert Valerio Riedel Copyright (C) 2002,2003 Rocky Bernstein @@ -27,7 +27,7 @@ # include "config.h" #endif -static const char _rcsid[] = "$Id: _cdio_linux.c,v 1.1 2003/03/24 19:01:09 rocky Exp $"; +static const char _rcsid[] = "$Id: _cdio_linux.c,v 1.2 2003/03/24 23:59:22 rocky Exp $"; #include "cdio_assert.h" #include "cdio_private.h" @@ -129,7 +129,7 @@ _cdio_free (void *user_data) } static int -_set_bsize (int fd, unsigned bsize) +_set_bsize (int fd, unsigned int bsize) { struct cdrom_generic_command cgc; @@ -485,29 +485,31 @@ static int _cdio_eject_media (void *user_data) { _img_private_t *_obj = user_data; - int ret, status; + int ret=2; + int status; + int fd; - if (_obj->fd > -1) { - if((status = ioctl(_obj->fd, CDROM_DRIVE_STATUS, CDSL_CURRENT)) > 0) { + if ((fd = open (_obj->source_name, O_RDONLY|O_NONBLOCK)) > -1) { + if((status = ioctl(fd, CDROM_DRIVE_STATUS, CDSL_CURRENT)) > 0) { switch(status) { case CDS_TRAY_OPEN: - if((ret = ioctl(_obj->fd, CDROMCLOSETRAY)) != 0) { - cdio_error ("CDROMCLOSETRAY failed: %s\n", strerror(errno)); + if((ret = ioctl(fd, CDROMCLOSETRAY)) != 0) { + cdio_error ("ioctl CDROMCLOSETRAY failed: %s\n", strerror(errno)); } break; case CDS_DISC_OK: - if((ret = ioctl(_obj->fd, CDROMEJECT)) != 0) { - cdio_error("CDROMEJECT failed: %s\n", strerror(errno)); + if((ret = ioctl(fd, CDROMEJECT)) != 0) { + cdio_error("ioctl CDROMEJECT failed: %s\n", strerror(errno)); } break; } - _cdio_free((void *) _obj); - return 0; + ret=0; } else { cdio_error ("CDROM_DRIVE_STATUS failed: %s\n", strerror(errno)); - _cdio_free((void *) _obj); - return 1; + ret=1; } + close(fd); + _cdio_free((void *) _obj); } return 2; } diff --git a/lib/cdio.c b/lib/cdio.c index 8417e42a..94044df1 100644 --- a/lib/cdio.c +++ b/lib/cdio.c @@ -1,5 +1,5 @@ /* - $Id: cdio.c,v 1.1 2003/03/24 19:01:09 rocky Exp $ + $Id: cdio.c,v 1.2 2003/03/24 23:59:22 rocky Exp $ Copyright (C) 2003 Rocky Bernstein Copyright (C) 2001 Herbert Valerio Riedel @@ -28,7 +28,7 @@ #include "logging.h" #include "cdio_private.h" -static const char _rcsid[] = "$Id: cdio.c,v 1.1 2003/03/24 19:01:09 rocky Exp $"; +static const char _rcsid[] = "$Id: cdio.c,v 1.2 2003/03/24 23:59:22 rocky Exp $"; const char *track_format2str[5] = @@ -70,6 +70,22 @@ CdIo_driver_t CdIo_all_drivers[MAX_DRIVER+1] = { NULL }, + {DRIVER_BSDI, + CDIO_SRC_IS_DEVICE_MASK|CDIO_SRC_IS_NATIVE_MASK|CDIO_SRC_IS_SCSI_MASK, + "BSDI", + "BSDI ATAPI and SCSI driver", + &cdio_have_bsdi, + cdio_open_bsdi + }, + + {DRIVER_FREEBSD, + CDIO_SRC_IS_DEVICE_MASK|CDIO_SRC_IS_NATIVE_MASK|CDIO_SRC_IS_SCSI_MASK, + "FreeBSD", + "FreeBSD driver", + &cdio_have_freebsd, + cdio_open_freebsd + }, + {DRIVER_LINUX, CDIO_SRC_IS_DEVICE_MASK|CDIO_SRC_IS_NATIVE_MASK, "Linux", @@ -86,14 +102,6 @@ CdIo_driver_t CdIo_all_drivers[MAX_DRIVER+1] = { &cdio_open_solaris }, - {DRIVER_BSDI, - CDIO_SRC_IS_DEVICE_MASK|CDIO_SRC_IS_NATIVE_MASK|CDIO_SRC_IS_SCSI_MASK, - "BSDI", - "BSDI ATAPI and SCSI driver", - &cdio_have_bsdi, - cdio_open_bsdi - }, - {DRIVER_NRG, CDIO_SRC_IS_DISK_IMAGE_MASK, "NRG", @@ -404,9 +412,10 @@ cdio_open (const char *source_name, driver_id_t driver_id) return NULL; } break; + case DRIVER_BSDI: + case DRIVER_FREEBSD: case DRIVER_LINUX: case DRIVER_SOLARIS: - case DRIVER_BSDI: case DRIVER_NRG: case DRIVER_BINCUE: if ((*CdIo_all_drivers[driver_id].have_driver)()) { diff --git a/lib/cdio.h b/lib/cdio.h index 3ed944f0..0c8becf2 100644 --- a/lib/cdio.h +++ b/lib/cdio.h @@ -1,5 +1,5 @@ /* - $Id: cdio.h,v 1.1 2003/03/24 19:01:09 rocky Exp $ + $Id: cdio.h,v 1.2 2003/03/24 23:59:22 rocky Exp $ Copyright (C) 2001 Herbert Valerio Riedel Copyright (C) 2003 Rocky Bernstein @@ -47,9 +47,10 @@ extern "C" { */ typedef enum { DRIVER_UNKNOWN, + DRIVER_BSDI, + DRIVER_FREEBSD, DRIVER_LINUX, DRIVER_SOLARIS, - DRIVER_BSDI, DRIVER_NRG, DRIVER_BINCUE, DRIVER_DEVICE, @@ -156,11 +157,12 @@ extern "C" { /* True if xxx driver is available. where xxx=linux, solaris, nrg, ... */ + bool cdio_have_bsdi (void); + bool cdio_have_freebsd (void); bool cdio_have_linux (void); bool cdio_have_solaris (void); bool cdio_have_nrg (void); bool cdio_have_bincue (void); - bool cdio_have_bsdi (void); /* Like above but uses the enumeration instead. */ bool cdio_have_driver (driver_id_t driver_id); @@ -197,6 +199,11 @@ extern "C" { */ CdIo * cdio_open_bsdi (const char *source_name); + /*! BSDI CD-reading routines. + NULL is returned on error. + */ + CdIo * cdio_open_freebsd (const char *source_name); + /*! Linux CD-reading routines. NULL is returned on error. */