=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/cdio/mmc.c,v retrieving revision 1.19 retrieving revision 1.20 diff -u -r1.19 -r1.20 --- src/usr.bin/cdio/mmc.c 2008/06/06 10:16:52 1.19 +++ src/usr.bin/cdio/mmc.c 2008/06/08 21:01:24 1.20 @@ -1,4 +1,4 @@ -/* $OpenBSD: mmc.c,v 1.19 2008/06/06 10:16:52 av Exp $ */ +/* $OpenBSD: mmc.c,v 1.20 2008/06/08 21:01:24 av Exp $ */ /* * Copyright (c) 2006 Michael Coulter @@ -32,6 +32,63 @@ extern int fd; extern char *cdname; + +#define SCSI_GET_CONFIGURATION 0x46 + +#define MMC_FEATURE_CD_TAO 0x2d +#define MMC_FEATURE_CDRW_WRITE 0x37 + +int +get_media_capabilities(int *cap) +{ + scsireq_t scr; + char buf[4096]; + int error; + u_int32_t i, dsz; + u_int16_t feature; + + *cap = 0; + memset(buf, 0, sizeof(buf)); + memset(&scr, 0, sizeof(scr)); + + scr.cmd[0] = SCSI_GET_CONFIGURATION; + scr.cmd[1] = 1; /* enumerate only "current" features */ + *(u_int16_t *)(scr.cmd + 7) = betoh16(sizeof(buf)); + + 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) + return (-1); + if (scr.datalen_used < 8) + return (-1); /* can't get header */ + + dsz = betoh32(*(u_int32_t *)buf); + if (dsz > scr.datalen_used - 4) + dsz = scr.datalen_used - 4; + + dsz += 4; /* total size of bufer for all features */ + i = 8; + while (i <= dsz - 4) { + if (dsz - i < 4 + buf[i + 3]) + break; /* partial feature descriptor */ + feature = betoh16(*(u_int16_t *)(buf + i)); + + if (feature == MMC_FEATURE_CD_TAO) + *cap |= MEDIACAP_TAO; + else if (feature == MMC_FEATURE_CDRW_WRITE) + *cap |= MEDIACAP_CDRW_WRITE; + + i += 4 + buf[i + 3]; + } + + return (0); +} int blank(void)