=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/cdio/mmc.c,v retrieving revision 1.19 retrieving revision 1.20 diff -c -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 **** ! /* $OpenBSD: mmc.c,v 1.19 2008/06/06 10:16:52 av Exp $ */ /* * Copyright (c) 2006 Michael Coulter --- 1,4 ---- ! /* $OpenBSD: mmc.c,v 1.20 2008/06/08 21:01:24 av Exp $ */ /* * Copyright (c) 2006 Michael Coulter *************** *** 32,37 **** --- 32,94 ---- 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)