diff options
| author | Maxim Sobolev <sobomax@FreeBSD.org> | 2005-01-30 08:12:37 +0000 |
|---|---|---|
| committer | Maxim Sobolev <sobomax@FreeBSD.org> | 2005-01-30 08:12:37 +0000 |
| commit | 43792195376d49565d1ce5daf330b19f90bce1d3 (patch) | |
| tree | 60c80029e1db66c753066e1ca06309b6a56d0ce6 /sys/dev | |
| parent | 6b0206227514ad8c99ed9d119fdf795ca94fe7df (diff) | |
Notes
Diffstat (limited to 'sys/dev')
| -rw-r--r-- | sys/dev/ata/atapi-cd.c | 13 | ||||
| -rw-r--r-- | sys/dev/mcd/mcd.c | 14 | ||||
| -rw-r--r-- | sys/dev/scd/scd.c | 16 |
3 files changed, 32 insertions, 11 deletions
diff --git a/sys/dev/ata/atapi-cd.c b/sys/dev/ata/atapi-cd.c index 9b86948c4ffc..4a7df8083459 100644 --- a/sys/dev/ata/atapi-cd.c +++ b/sys/dev/ata/atapi-cd.c @@ -553,7 +553,7 @@ static int acd_geom_ioctl(struct g_provider *pp, u_long cmd, void *addr, int fflag, struct thread *td) { struct acd_softc *cdp = pp->geom->softc; - int error = 0; + int error = 0, nocopyout; if (!cdp) return ENXIO; @@ -574,6 +574,7 @@ acd_geom_ioctl(struct g_provider *pp, u_long cmd, void *addr, int fflag, struct cdp->flags |= F_LOCKED; break; } + nocopyout = 0; switch (cmd) { case CDIOCRESUME: @@ -738,6 +739,9 @@ acd_geom_ioctl(struct g_provider *pp, u_long cmd, void *addr, int fflag, struct } break; + case CDIOCREADSUBCHANNEL_SYSSPACE: + nocopyout = 1; + /* Fallthrough */ case CDIOCREADSUBCHANNEL: { struct ioc_read_subchannel *args = @@ -782,7 +786,12 @@ acd_geom_ioctl(struct g_provider *pp, u_long cmd, void *addr, int fflag, struct break; } } - error = copyout(&cdp->subchan, args->data, args->data_len); + if (nocopyout == 0) { + error = copyout(&cdp->subchan, args->data, args->data_len); + } else { + error = 0; + bcopy(&cdp->subchan, args->data, args->data_len); + } } break; diff --git a/sys/dev/mcd/mcd.c b/sys/dev/mcd/mcd.c index db351909c652..e9cc575ecf2a 100644 --- a/sys/dev/mcd/mcd.c +++ b/sys/dev/mcd/mcd.c @@ -135,7 +135,8 @@ static void mcd_soft_reset(struct mcd_softc *); static int mcd_hard_reset(struct mcd_softc *); static int mcd_setmode(struct mcd_softc *, int mode); static int mcd_getqchan(struct mcd_softc *, struct mcd_qchninfo *q); -static int mcd_subchan(struct mcd_softc *, struct ioc_read_subchannel *sc); +static int mcd_subchan(struct mcd_softc *, struct ioc_read_subchannel *sc, + int nocopyout); static int mcd_toc_header(struct mcd_softc *, struct ioc_toc_header *th); static int mcd_read_toc(struct mcd_softc *); static int mcd_toc_entrys(struct mcd_softc *, struct ioc_read_toc_entry *te); @@ -440,8 +441,10 @@ MCD_TRACE("ioctl called 0x%lx\n", cmd); return mcd_playblocks(sc, (struct ioc_play_blocks *) addr); case CDIOCPLAYMSF: return mcd_playmsf(sc, (struct ioc_play_msf *) addr); + case CDIOCREADSUBCHANNEL_SYSSPACE: + return mcd_subchan(sc, (struct ioc_read_subchannel *) addr, 1); case CDIOCREADSUBCHANNEL: - return mcd_subchan(sc, (struct ioc_read_subchannel *) addr); + return mcd_subchan(sc, (struct ioc_read_subchannel *) addr, 0); case CDIOREADTOCHEADER: return mcd_toc_header(sc, (struct ioc_toc_header *) addr); case CDIOREADTOCENTRYS: @@ -1357,7 +1360,7 @@ mcd_getqchan(struct mcd_softc *sc, struct mcd_qchninfo *q) } static int -mcd_subchan(struct mcd_softc *sc, struct ioc_read_subchannel *sch) +mcd_subchan(struct mcd_softc *sc, struct ioc_read_subchannel *sch, int nocopyout) { struct mcd_qchninfo q; struct cd_sub_channel_info data; @@ -1423,7 +1426,10 @@ mcd_subchan(struct mcd_softc *sc, struct ioc_read_subchannel *sch) break; } - return copyout(&data, sch->data, min(sizeof(struct cd_sub_channel_info), sch->data_len)); + if (nocopyout == 0) + return copyout(&data, sch->data, min(sizeof(struct cd_sub_channel_info), sch->data_len)); + bcopy(&data, sch->data, min(sizeof(struct cd_sub_channel_info), sch->data_len)); + return (0) } static int diff --git a/sys/dev/scd/scd.c b/sys/dev/scd/scd.c index 1b00e02d2ae2..2c5f7966f506 100644 --- a/sys/dev/scd/scd.c +++ b/sys/dev/scd/scd.c @@ -131,7 +131,7 @@ static int scd_resume(struct scd_softc *); static int scd_playtracks(struct scd_softc *, struct ioc_play_track *pt); static int scd_playmsf(struct scd_softc *, struct ioc_play_msf *msf); static int scd_play(struct scd_softc *, struct ioc_play_msf *msf); -static int scd_subchan(struct scd_softc *, struct ioc_read_subchannel *sch); +static int scd_subchan(struct scd_softc *, struct ioc_read_subchannel *sch, int nocopyout); static int read_subcode(struct scd_softc *, struct sony_subchannel_position_data *sch); /* for xcdplayer */ @@ -350,8 +350,10 @@ scdioctl(struct cdev *dev, u_long cmd, caddr_t addr, int flags, struct thread *t return (EINVAL); case CDIOCPLAYMSF: return scd_playmsf(sc, (struct ioc_play_msf *) addr); + case CDIOCREADSUBCHANNEL_SYSSPACE: + return scd_subchan(sc, (struct ioc_read_subchannel *) addr, 1); case CDIOCREADSUBCHANNEL: - return scd_subchan(sc, (struct ioc_read_subchannel *) addr); + return scd_subchan(sc, (struct ioc_read_subchannel *) addr, 0); case CDIOREADTOCHEADER: return scd_toc_header (sc, (struct ioc_toc_header *) addr); case CDIOREADTOCENTRYS: @@ -544,7 +546,7 @@ scd_eject(struct scd_softc *sc) } static int -scd_subchan(struct scd_softc *sc, struct ioc_read_subchannel *sch) +scd_subchan(struct scd_softc *sc, struct ioc_read_subchannel *sch, int nocopyout) { struct sony_subchannel_position_data q; struct cd_sub_channel_info data; @@ -573,8 +575,12 @@ scd_subchan(struct scd_softc *sc, struct ioc_read_subchannel *sch) data.what.position.absaddr.msf.second = bcd2bin(q.abs_msf[1]); data.what.position.absaddr.msf.frame = bcd2bin(q.abs_msf[2]); - if (copyout(&data, sch->data, min(sizeof(struct cd_sub_channel_info), sch->data_len))!=0) - return (EFAULT); + if (nocopyout == 0) { + if (copyout(&data, sch->data, min(sizeof(struct cd_sub_channel_info), sch->data_len))!=0) + return (EFAULT); + } else { + bcopy(&data, sch->data, min(sizeof(struct cd_sub_channel_info), sch->data_len)); + } return (0); } |
