Old drives (reported Giovanni Bechis <bigionews@snb.it>) don't report CD-RW
authorav <av@openbsd.org>
Wed, 13 Aug 2008 12:21:19 +0000 (12:21 +0000)
committerav <av@openbsd.org>
Wed, 13 Aug 2008 12:21:19 +0000 (12:21 +0000)
write feature. Add additional check for media type before blanking.
The patch fixes problem for Giovanni.
ok fgsch

usr.bin/cdio/cdio.c
usr.bin/cdio/extern.h
usr.bin/cdio/mmc.c

index cbf194a..a5d2a89 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: cdio.c,v 1.65 2008/08/08 07:26:40 fgsch Exp $ */
+/*     $OpenBSD: cdio.c,v 1.66 2008/08/13 12:21:19 av Exp $    */
 
 /*  Copyright (c) 1995 Serge V. Vakulenko
  * All rights reserved.
@@ -517,7 +517,8 @@ run(int cmd, char *arg)
                        warnx("Can't determine media type");
                        return (0);
                }
-               if ((mediacap & MEDIACAP_CDRW_WRITE) == 0) {
+               if ((mediacap & MEDIACAP_CDRW_WRITE) == 0 &&
+                   get_media_type() != MEDIATYPE_CDRW) {
                        warnx("The media doesn't support blanking");
                        return (0);
                }
index 6a6a45b..fd26816 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: extern.h,v 1.12 2008/06/30 23:35:39 av Exp $ */
+/* $OpenBSD: extern.h,v 1.13 2008/08/13 12:21:19 av Exp $ */
 /*
  * Copyright (c) 2002 Marc Espie.
  *
@@ -60,12 +60,20 @@ SLIST_HEAD(track_head, track_info) tracks;
  */
 #define CD_MAX_SPEED           380
 
+/*
+ * Media types
+ */
+#define MEDIATYPE_UNKNOWN      0
+#define MEDIATYPE_CDR          1
+#define MEDIATYPE_CDRW         2
+
 extern unsigned long   entry2time(struct cd_toc_entry *);
 extern unsigned long   entry2frames(struct cd_toc_entry *);
 extern int              open_cd(char *, int);
 extern char **                 cddb(const char *, int, struct cd_toc_entry *, char *);
 extern unsigned long   cddb_discid(int, struct cd_toc_entry *);
 extern void            free_names(char **);
+extern int             get_media_type(void);
 extern int             get_media_capabilities(int *cap);
 extern int             blank(void);
 extern int             unit_ready(void);
index 4b76e8e..df9b898 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: mmc.c,v 1.24 2008/08/08 07:26:40 fgsch Exp $  */
+/*     $OpenBSD: mmc.c,v 1.25 2008/08/13 12:21:19 av Exp $     */
 /*
  * Copyright (c) 2006 Michael Coulter <mjc@openbsd.org>
  *
@@ -39,6 +39,42 @@ extern char *cdname;
 #define MMC_FEATURE_CD_TAO             0x2d
 #define MMC_FEATURE_CDRW_WRITE         0x37
 
+int
+get_media_type(void)
+{
+       scsireq_t scr;
+       char buf[32];
+       u_char disctype;
+       int rv, error;
+
+       rv = MEDIATYPE_UNKNOWN;
+       memset(buf, 0, sizeof(buf));
+       memset(&scr, 0, sizeof(scr));
+
+       scr.cmd[0] = READ_TOC;
+       scr.cmd[1] = 0x2;       /* MSF */
+       scr.cmd[2] = 0x4;       /* ATIP */
+       scr.cmd[8] = 0x20;
+
+       scr.flags = SCCMD_ESCAPE | SCCMD_READ;
+       scr.databuf = buf;
+       scr.datalen = sizeof(buf);
+       scr.cmdlen = 10;
+       scr.timeout = 120000;
+       scr.senselen = SENSEBUFLEN;
+
+       error = ioctl(fd, SCIOCCOMMAND, &scr);
+       if (error != -1 && scr.retsts == 0 && scr.datalen_used > 7) {
+               disctype = (buf[6] >> 6) & 0x1;
+               if (disctype == 0)
+                       rv = MEDIATYPE_CDR;
+               else if (disctype == 1)
+                       rv = MEDIATYPE_CDRW;
+       }
+
+       return (rv);
+}
+
 int
 get_media_capabilities(int *cap)
 {