/* * Perform special action on behalf of the user. * Only does generic scsi ioctls. */ static int ukioctl(dev_t dev, u_long cmd, void *addr, int flag, struct lwp *l) { struct uk_softc *uk = device_lookup_private(&uk_cd, minor(dev)); return scsipi_do_ioctl(uk->sc_periph, dev, cmd, addr, flag, l); }
/* * Perform special action on behalf of the user; * knows about the internals of this device */ int ssioctl(dev_t dev, u_long cmd, void *addr, int flag, struct lwp *l) { struct ss_softc *ss = device_lookup_private(&ss_cd, SSUNIT(dev)); int error = 0; struct scan_io *sio; if (!device_is_active(&ss->sc_dev)) return (ENODEV); switch (cmd) { case SCIOCGET: if (ss->special && ss->special->get_params) { /* call special handler */ error = (ss->special->get_params)(ss); if (error) return (error); } else { /* XXX add code for SCSI2 scanner, if any */ return (EOPNOTSUPP); } memcpy(addr, &ss->sio, sizeof(struct scan_io)); break; case SCIOCSET: sio = (struct scan_io *)addr; if (ss->special && ss->special->set_params) { /* call special handler */ error = (ss->special->set_params)(ss, sio); if (error) return (error); } else { /* XXX add code for SCSI2 scanner, if any */ return (EOPNOTSUPP); } break; case SCIOCRESTART: if (ss->special && ss->special->rewind_scanner ) { /* call special handler */ error = (ss->special->rewind_scanner)(ss); if (error) return (error); } else /* XXX add code for SCSI2 scanner, if any */ return (EOPNOTSUPP); ss->flags &= ~SSF_TRIGGERED; break; #ifdef NOTYET case SCAN_USE_ADF: break; #endif default: return (scsipi_do_ioctl(ss->sc_periph, dev, cmd, addr, flag, l)); } return (error); }
static int chioctl(dev_t dev, u_long cmd, void *data, int flags, struct lwp *l) { struct ch_softc *sc = device_lookup_private(&ch_cd, CHUNIT(dev)); int error = 0; /* * If this command can change the device's state, we must * have the device open for writing. */ switch (cmd) { case CHIOGPICKER: case CHIOGPARAMS: case OCHIOGSTATUS: break; default: if ((flags & FWRITE) == 0) return (EBADF); } switch (cmd) { case CHIOMOVE: error = ch_move(sc, (struct changer_move_request *)data); break; case CHIOEXCHANGE: error = ch_exchange(sc, (struct changer_exchange_request *)data); break; case CHIOPOSITION: error = ch_position(sc, (struct changer_position_request *)data); break; case CHIOGPICKER: *(int *)data = sc->sc_picker - sc->sc_firsts[CHET_MT]; break; case CHIOSPICKER: { int new_picker = *(int *)data; if (new_picker > (sc->sc_counts[CHET_MT] - 1)) return (EINVAL); sc->sc_picker = sc->sc_firsts[CHET_MT] + new_picker; break; } case CHIOGPARAMS: { struct changer_params *cp = (struct changer_params *)data; cp->cp_curpicker = sc->sc_picker - sc->sc_firsts[CHET_MT]; cp->cp_npickers = sc->sc_counts[CHET_MT]; cp->cp_nslots = sc->sc_counts[CHET_ST]; cp->cp_nportals = sc->sc_counts[CHET_IE]; cp->cp_ndrives = sc->sc_counts[CHET_DT]; break; } case CHIOIELEM: error = ch_ielem(sc); if (error == 0) { sc->sc_periph->periph_flags |= PERIPH_MEDIA_LOADED; } break; case OCHIOGSTATUS: { struct ochanger_element_status_request *cesr = (struct ochanger_element_status_request *)data; error = ch_ousergetelemstatus(sc, cesr->cesr_type, cesr->cesr_data); break; } case CHIOGSTATUS: error = ch_usergetelemstatus(sc, (struct changer_element_status_request *)data); break; case CHIOSVOLTAG: error = ch_setvoltag(sc, (struct changer_set_voltag_request *)data); break; /* Implement prevent/allow? */ default: error = scsipi_do_ioctl(sc->sc_periph, dev, cmd, data, flags, l); break; } return (error); }