static int sysctl_kern_dumpdev(SYSCTL_HANDLER_ARGS) { int error; udev_t ndumpdev; ndumpdev = dev2udev(dumpdev); error = sysctl_handle_opaque(oidp, &ndumpdev, sizeof ndumpdev, req); if (error == 0 && req->newptr != NULL) error = setdumpdev(udev2dev(ndumpdev, 0)); return (error); }
static int snpioctl(struct dev_ioctl_args *ap) { cdev_t dev = ap->a_head.a_dev; struct snoop *snp; struct tty *tp, *tpo; cdev_t tdev; int ret; lwkt_gettoken(&tty_token); snp = dev->si_drv1; switch (ap->a_cmd) { case SNPSTTY: tdev = udev2dev(*((udev_t *)ap->a_data), 0); if (tdev == NULL) { lwkt_reltoken(&tty_token); ret = snp_down(snp); return ret; } tp = snpdevtotty(tdev); if (!tp) { lwkt_reltoken(&tty_token); return (EINVAL); } if (tp->t_state & TS_SNOOP) { lwkt_reltoken(&tty_token); return (EBUSY); } crit_enter(); if (snp->snp_target == NULL) { tpo = snp->snp_tty; if (tpo) tpo->t_state &= ~TS_SNOOP; } tp->t_sc = (caddr_t)snp; tp->t_state |= TS_SNOOP; snp->snp_olddisc = tp->t_line; tp->t_line = snooplinedisc; snp->snp_tty = tp; snp->snp_target = tdev; /* * Clean overflow and down flags - * we'll have a chance to get them in the future :))) */ snp->snp_flags &= ~SNOOP_OFLOW; snp->snp_flags &= ~SNOOP_DOWN; crit_exit(); break; case SNPGTTY: /* * We keep snp_target field specially to make * SNPGTTY happy, else we can't know what is device * major/minor for tty. */ *((cdev_t *)ap->a_data) = snp->snp_target; break; case FIOASYNC: if (*(int *)ap->a_data) snp->snp_flags |= SNOOP_ASYNC; else snp->snp_flags &= ~SNOOP_ASYNC; break; case FIONREAD: crit_enter(); if (snp->snp_tty != NULL) *(int *)ap->a_data = snp->snp_len; else if (snp->snp_flags & SNOOP_DOWN) { if (snp->snp_flags & SNOOP_OFLOW) *(int *)ap->a_data = SNP_OFLOW; else *(int *)ap->a_data = SNP_TTYCLOSE; } else { *(int *)ap->a_data = SNP_DETACH; } crit_exit(); break; default: lwkt_reltoken(&tty_token); return (ENOTTY); } lwkt_reltoken(&tty_token); return (0); }