[BACK]Return to linux_cdrom.c CVS log [TXT][DIR] Up to [local] / sys / compat / linux

Annotation of sys/compat/linux/linux_cdrom.c, Revision 1.1.1.1

1.1       nbrk        1:
                      2: /*     $OpenBSD: linux_cdrom.c,v 1.8 2002/03/14 01:26:50 millert Exp $ */
                      3: /*
                      4:  * Copyright 1997 Niels Provos <provos@physnet.uni-hamburg.de>
                      5:  * All rights reserved.
                      6:  *
                      7:  * Redistribution and use in source and binary forms, with or without
                      8:  * modification, are permitted provided that the following conditions
                      9:  * are met:
                     10:  * 1. Redistributions of source code must retain the above copyright
                     11:  *    notice, this list of conditions and the following disclaimer.
                     12:  * 2. Redistributions in binary form must reproduce the above copyright
                     13:  *    notice, this list of conditions and the following disclaimer in the
                     14:  *    documentation and/or other materials provided with the distribution.
                     15:  * 3. All advertising materials mentioning features or use of this software
                     16:  *    must display the following acknowledgement:
                     17:  *      This product includes software developed by Niels Provos.
                     18:  * 4. The name of the author may not be used to endorse or promote products
                     19:  *    derived from this software without specific prior written permission.
                     20:  *
                     21:  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
                     22:  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
                     23:  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
                     24:  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
                     25:  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
                     26:  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
                     27:  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
                     28:  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
                     29:  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
                     30:  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
                     31:  */
                     32:
                     33: #include <sys/param.h>
                     34: #include <sys/proc.h>
                     35: #include <sys/systm.h>
                     36: #include <sys/file.h>
                     37: #include <sys/filedesc.h>
                     38: #include <sys/ioctl.h>
                     39: #include <sys/mount.h>
                     40: #include <sys/cdio.h>
                     41:
                     42: #include <sys/syscallargs.h>
                     43:
                     44: #include <compat/linux/linux_types.h>
                     45: #include <compat/linux/linux_ioctl.h>
                     46: #include <compat/linux/linux_signal.h>
                     47: #include <compat/linux/linux_syscallargs.h>
                     48: #include <compat/linux/linux_util.h>
                     49: #include <compat/linux/linux_cdrom.h>
                     50:
                     51: void bsd_addr_to_linux_addr(union msf_lba *bsd,
                     52:     union linux_cdrom_addr *linux, int format);
                     53:
                     54: void
                     55: bsd_addr_to_linux_addr(bsd, linux, format)
                     56:         union msf_lba *bsd;
                     57:         union linux_cdrom_addr *linux;
                     58:         int format;
                     59: {
                     60:         if (format == CD_MSF_FORMAT) {
                     61:                linux->msf.minute = bsd->msf.minute;
                     62:                linux->msf.second = bsd->msf.second;
                     63:                linux->msf.frame = bsd->msf.frame;
                     64:        } else
                     65:                linux->lba = bsd->lba;
                     66: }
                     67:
                     68: int
                     69: linux_ioctl_cdrom(p, v, retval)
                     70:        struct proc *p;
                     71:        void *v;
                     72:        register_t *retval;
                     73: {
                     74:        struct linux_sys_ioctl_args /* {
                     75:                syscallarg(int) fd;
                     76:                syscallarg(u_long) com;
                     77:                syscallarg(caddr_t) data;
                     78:        } */ *uap = v;
                     79:        struct file *fp;
                     80:        struct filedesc *fdp;
                     81:        caddr_t sg;
                     82:        u_long com, arg;
                     83:        struct sys_ioctl_args ia;
                     84:        int error;
                     85:
                     86:        union {
                     87:                struct cd_toc_entry te;
                     88:                struct cd_sub_channel_info scinfo;
                     89:        } data;
                     90:        union {
                     91:                struct ioc_toc_header th;
                     92:                struct ioc_read_toc_entry tes;
                     93:                struct ioc_play_track ti;
                     94:                struct ioc_play_msf msf;
                     95:                struct ioc_play_blocks blk;
                     96:                struct ioc_read_subchannel sc;
                     97:                struct ioc_vol vol;
                     98:        } tmpb;
                     99:        union {
                    100:                struct linux_cdrom_tochdr th;
                    101:                struct linux_cdrom_tocentry te;
                    102:                struct linux_cdrom_ti ti;
                    103:                struct linux_cdrom_msf msf;
                    104:                struct linux_cdrom_blk blk;
                    105:                struct linux_cdrom_subchnl sc;
                    106:                struct linux_cdrom_volctrl vol;
                    107:        } tmpl;
                    108:
                    109:
                    110:        fdp = p->p_fd;
                    111:        if ((fp = fd_getfile(fdp, SCARG(uap, fd))) == NULL)
                    112:                return (EBADF);
                    113:        FREF(fp);
                    114:
                    115:        if ((fp->f_flag & (FREAD | FWRITE)) == 0) {
                    116:                error = EBADF;
                    117:                goto out;
                    118:        }
                    119:
                    120:        com = SCARG(uap, com);
                    121:        retval[0] = 0;
                    122:
                    123:        switch (com) {
                    124:        case LINUX_CDROMREADTOCHDR:
                    125:                error = (*fp->f_ops->fo_ioctl)(fp, CDIOREADTOCHEADER,
                    126:                    (caddr_t)&tmpb.th, p);
                    127:                if (error)
                    128:                        goto out;
                    129:                tmpl.th.cdth_trk0 = tmpb.th.starting_track;
                    130:                tmpl.th.cdth_trk1 = tmpb.th.ending_track;
                    131:                error = copyout(&tmpl, SCARG(uap, data), sizeof tmpl.th);
                    132:                goto out;
                    133:        case LINUX_CDROMREADTOCENTRY:
                    134:                error = copyin(SCARG(uap, data), &tmpl.te, sizeof tmpl.te);
                    135:                if (error)
                    136:                        goto out;
                    137:
                    138:                sg = stackgap_init(p->p_emul);
                    139:
                    140:                bzero(&tmpb.tes, sizeof tmpb.tes);
                    141:                tmpb.tes.starting_track = tmpl.te.cdte_track;
                    142:                tmpb.tes.address_format = (tmpl.te.cdte_format == LINUX_CDROM_MSF)
                    143:                    ? CD_MSF_FORMAT : CD_LBA_FORMAT;
                    144:                tmpb.tes.data_len = sizeof(struct cd_toc_entry);
                    145:                tmpb.tes.data = stackgap_alloc(&sg, tmpb.tes.data_len);
                    146:
                    147:                error = (*fp->f_ops->fo_ioctl)(fp, CDIOREADTOCENTRYS,
                    148:                    (caddr_t)&tmpb.tes, p);
                    149:                if (error)
                    150:                        goto out;
                    151:                if ((error = copyin(tmpb.tes.data, &data.te, sizeof data.te)))
                    152:                        goto out;
                    153:
                    154:                tmpl.te.cdte_ctrl = data.te.control;
                    155:                tmpl.te.cdte_adr = data.te.addr_type;
                    156:                tmpl.te.cdte_track = data.te.track;
                    157:                tmpl.te.cdte_datamode = CD_TRACK_INFO;
                    158:                bsd_addr_to_linux_addr(&data.te.addr, &tmpl.te.cdte_addr,
                    159:                    tmpb.tes.address_format);
                    160:                error = copyout(&tmpl, SCARG(uap, data), sizeof tmpl.te);
                    161:                goto out;
                    162:        case LINUX_CDROMSUBCHNL:
                    163:                error = copyin(SCARG(uap, data), &tmpl.sc, sizeof tmpl.sc);
                    164:                if (error)
                    165:                        goto out;
                    166:
                    167:                sg = stackgap_init(p->p_emul);
                    168:
                    169:                bzero(&tmpb.sc, sizeof tmpb.sc);
                    170:                tmpb.sc.data_format = CD_CURRENT_POSITION;
                    171:                tmpb.sc.address_format = (tmpl.sc.cdsc_format == LINUX_CDROM_MSF)
                    172:                    ? CD_MSF_FORMAT : CD_LBA_FORMAT;
                    173:                tmpb.sc.data_len = sizeof(struct cd_sub_channel_info);
                    174:                tmpb.sc.data = stackgap_alloc(&sg, tmpb.sc.data_len);
                    175:
                    176:                error = (*fp->f_ops->fo_ioctl)(fp, CDIOCREADSUBCHANNEL,
                    177:                    (caddr_t)&tmpb.sc, p);
                    178:                if (error)
                    179:                        goto out;
                    180:                if ((error = copyin(tmpb.sc.data, &data.scinfo, sizeof data.scinfo)))
                    181:                        goto out;
                    182:
                    183:                tmpl.sc.cdsc_audiostatus = data.scinfo.header.audio_status;
                    184:                tmpl.sc.cdsc_adr = data.scinfo.what.position.addr_type;
                    185:                tmpl.sc.cdsc_ctrl = data.scinfo.what.position.control;
                    186:                tmpl.sc.cdsc_trk = data.scinfo.what.position.track_number;
                    187:                tmpl.sc.cdsc_ind = data.scinfo.what.position.index_number;
                    188:                bsd_addr_to_linux_addr(&data.scinfo.what.position.absaddr,
                    189:                    &tmpl.sc.cdsc_absaddr,
                    190:                    tmpb.sc.address_format);
                    191:                bsd_addr_to_linux_addr(&data.scinfo.what.position.reladdr,
                    192:                    &tmpl.sc.cdsc_reladdr,
                    193:                    tmpb.sc.address_format);
                    194:
                    195:                error = copyout(&tmpl, SCARG(uap, data), sizeof tmpl.sc);
                    196:                goto out;
                    197:        case LINUX_CDROMPLAYTRKIND:
                    198:                error = copyin(SCARG(uap, data), &tmpl.ti, sizeof tmpl.ti);
                    199:                if (error)
                    200:                        goto out;
                    201:
                    202:                tmpb.ti.start_track = tmpl.ti.cdti_trk0;
                    203:                tmpb.ti.start_index = tmpl.ti.cdti_ind0;
                    204:                tmpb.ti.end_track = tmpl.ti.cdti_trk1;
                    205:                tmpb.ti.end_index = tmpl.ti.cdti_ind1;
                    206:                error = (*fp->f_ops->fo_ioctl)(fp, CDIOCPLAYTRACKS,
                    207:                    (caddr_t)&tmpb.ti, p);
                    208:                goto out;
                    209:        case LINUX_CDROMPLAYMSF:
                    210:                error = copyin(SCARG(uap, data), &tmpl.msf, sizeof tmpl.msf);
                    211:                if (error)
                    212:                        goto out;
                    213:
                    214:                tmpb.msf.start_m = tmpl.msf.cdmsf_min0;
                    215:                tmpb.msf.start_s = tmpl.msf.cdmsf_sec0;
                    216:                tmpb.msf.start_f = tmpl.msf.cdmsf_frame0;
                    217:                tmpb.msf.end_m = tmpl.msf.cdmsf_min1;
                    218:                tmpb.msf.end_s = tmpl.msf.cdmsf_sec1;
                    219:                tmpb.msf.end_f = tmpl.msf.cdmsf_frame1;
                    220:
                    221:                error = (*fp->f_ops->fo_ioctl)(fp, CDIOCPLAYMSF,
                    222:                    (caddr_t)&tmpb.msf, p);
                    223:                goto out;
                    224:        case LINUX_CDROMPLAYBLK:
                    225:                error = copyin(SCARG(uap, data), &tmpl.blk, sizeof tmpl.blk);
                    226:                if (error)
                    227:                        goto out;
                    228:
                    229:                tmpb.blk.blk = tmpl.blk.from;
                    230:                tmpb.blk.len = tmpl.blk.len;
                    231:
                    232:                error = (*fp->f_ops->fo_ioctl)(fp, CDIOCPLAYBLOCKS,
                    233:                    (caddr_t)&tmpb.blk, p);
                    234:                goto out;
                    235:        case LINUX_CDROMVOLCTRL:
                    236:                error = copyin(SCARG(uap, data), &tmpl.vol, sizeof tmpl.vol);
                    237:                if (error)
                    238:                        goto out;
                    239:
                    240:                tmpb.vol.vol[0] = tmpl.vol.channel0;
                    241:                tmpb.vol.vol[1] = tmpl.vol.channel1;
                    242:                tmpb.vol.vol[2] = tmpl.vol.channel2;
                    243:                tmpb.vol.vol[3] = tmpl.vol.channel3;
                    244:
                    245:                error = (*fp->f_ops->fo_ioctl)(fp, CDIOCSETVOL,
                    246:                    (caddr_t)&tmpb.vol, p);
                    247:                goto out;
                    248:        case LINUX_CDROMVOLREAD:
                    249:                error = (*fp->f_ops->fo_ioctl)(fp, CDIOCGETVOL,
                    250:                    (caddr_t)&tmpb.vol, p);
                    251:                if (error)
                    252:                        goto out;
                    253:
                    254:                tmpl.vol.channel0 = tmpb.vol.vol[0];
                    255:                tmpl.vol.channel1 = tmpb.vol.vol[1];
                    256:                tmpl.vol.channel2 = tmpb.vol.vol[2];
                    257:                tmpl.vol.channel3 = tmpb.vol.vol[3];
                    258:
                    259:                error = copyout(&tmpl.vol, SCARG(uap, data), sizeof tmpl.vol);
                    260:                goto out;
                    261:        case LINUX_CDROMPAUSE:
                    262:                SCARG(&ia, com) = CDIOCPAUSE;
                    263:                break;
                    264:        case LINUX_CDROMRESUME:
                    265:                SCARG(&ia, com) = CDIOCRESUME;
                    266:                break;
                    267:        case LINUX_CDROMSTOP:
                    268:                SCARG(&ia, com) = CDIOCSTOP;
                    269:                break;
                    270:        case LINUX_CDROMSTART:
                    271:                SCARG(&ia, com) = CDIOCSTART;
                    272:                break;
                    273:        case LINUX_CDROMEJECT_SW:
                    274:                error = copyin(SCARG(uap, data), &arg, sizeof arg);
                    275:                if (error)
                    276:                        goto out;
                    277:                SCARG(&ia, com) = arg ? CDIOCALLOW : CDIOCPREVENT;
                    278:                break;
                    279:        case LINUX_CDROMEJECT:
                    280:                SCARG(&ia, com) = CDIOCEJECT;
                    281:                break;
                    282:        case LINUX_CDROMRESET:
                    283:                SCARG(&ia, com) = CDIOCRESET;
                    284:                break;
                    285:        default:
                    286:                printf("linux_ioctl_cdrom: invalid ioctl %08lx\n", com);
                    287:                error = EINVAL;
                    288:                goto out;
                    289:        }
                    290:
                    291:        SCARG(&ia, fd) = SCARG(uap, fd);
                    292:        SCARG(&ia, data) = SCARG(uap, data);
                    293:        error = sys_ioctl(p, &ia, retval);
                    294:
                    295: out:
                    296:        FRELE(fp);
                    297:        return (error);
                    298: }

CVSweb