Ejemplo n.º 1
0
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);
}
Ejemplo n.º 2
0
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);
}