Ejemplo n.º 1
0
static void
pty_clone(void *arg, struct ucred *cr, char *name, int namelen,
    struct cdev **dev)
{

	/* Cloning is already satisfied. */
	if (*dev != NULL)
		return;

	/* Only catch /dev/ptyXX. */
	if (namelen != 5 || bcmp(name, "pty", 3) != 0)
		return;

	/* Only catch /dev/pty[l-sL-S]X. */
	if (!(name[3] >= 'l' && name[3] <= 's') &&
	    !(name[3] >= 'L' && name[3] <= 'S'))
		return;

	/* Only catch /dev/pty[l-sL-S][0-9a-v]. */
	if (!(name[4] >= '0' && name[4] <= '9') &&
	    !(name[4] >= 'a' && name[4] <= 'v'))
		return;

	/* Create the controller device node. */
	*dev = make_dev_credf(MAKEDEV_REF, &ptydev_cdevsw, 0,
	    NULL, UID_ROOT, GID_WHEEL, 0666, "%s", name);
}
Ejemplo n.º 2
0
static void
ctty_drvinit(void *unused)
{

	EVENTHANDLER_REGISTER(dev_clone, ctty_clone, 0, 1000);
	ctty = make_dev_credf(MAKEDEV_ETERNAL, &ctty_cdevsw, 0, NULL, UID_ROOT,
	    GID_WHEEL, 0666, "ctty");
}
Ejemplo n.º 3
0
static int
privcmd_attach(device_t dev)
{

	make_dev_credf(MAKEDEV_ETERNAL, &privcmd_devsw, 0, NULL, UID_ROOT,
	    GID_WHEEL, 0600, "xen/privcmd");
	return (0);
}
Ejemplo n.º 4
0
static void
log_drvinit(void *unused)
{

	cv_init(&log_wakeup, "klog");
	callout_init_mtx(&logsoftc.sc_callout, &msgbuf_lock, 0);
	make_dev_credf(MAKEDEV_ETERNAL, &log_cdevsw, 0, NULL, UID_ROOT,
	    GID_WHEEL, 0600, "klog");
}
Ejemplo n.º 5
0
static void
sms1xxx_demux_clone(void *arg, struct ucred *cred, char *name,
    int namelen, struct cdev **dev)
{
    char buf[40];
    int filtnr = 0;
    int unit;
    struct sms1xxx_softc *sc = arg;

    TRACE(TRACE_OPEN,"name=%s\n",name);

    if (*dev != NULL || sc == NULL)
        return;

    snprintf(buf,39,"dvb/adapter%d/demux0",device_get_unit(sc->sc_dev));
    if(strcmp(name,buf) != 0)
        return;

    for(filtnr = 0; filtnr < MAX_FILTERS; ++filtnr) {
        if(sc->filter[filtnr].pid == PIDFREE)
            break;
    }

    if(filtnr >= MAX_FILTERS) {
        ERR("no more filter free\n");
        return;
    }

    if(sc->filter[filtnr].dev != NULL) {
        ERR("filter %d not free\n", filtnr);
        return;
    }

    /* Clones are shared among devices, so handle unit numbers
       manually by reserving a range of MAX_FILTERS units per-device
       (clone_create will fail setting unit number automatically :
       unit number assignment is done by crawling sc's (only) clones
       and will not detect clones created for other devices, resulting
       in trying to set twice the same unit number). */
    unit = device_get_unit(sc->sc_dev) * MAX_FILTERS + filtnr;

    if(clone_create(&sc->demux_clones, &sms1xxx_demux_cdevsw, &unit, dev, 0)) {
        *dev = make_dev_credf(MAKEDEV_REF, &sms1xxx_demux_cdevsw,
            unit, NULL, UID_ROOT, GID_WHEEL,
            0666, "dvb/adapter%d/demux0.%d",
            device_get_unit(sc->sc_dev), filtnr);
        if(*dev != NULL) {
            TRACE(TRACE_MODULE,"created demux0.%d device, addr=%p\n",
                filtnr, *dev);
            (*dev)->si_flags |= SI_CHEAPCLONE;
            (*dev)->si_drv1 = sc;
            (*dev)->si_drv2 = &sc->filter[filtnr];  /* map filter to device */
            sc->filter[filtnr].dev = *dev;          /* map device to filter */
            sc->filter[filtnr].pid = PIDCLONED;
        }
    }
}
Ejemplo n.º 6
0
static void
nsmb_dev_clone(void *arg, struct ucred *cred, char *name, int namelen,
    struct cdev **dev)
{
	int i, u;

	if (*dev != NULL)
		return;

	if (strcmp(name, NSMB_NAME) == 0)
		u = -1;
	else if (dev_stdclone(name, NULL, NSMB_NAME, &u) != 1)
		return;
	i = clone_create(&nsmb_clones, &nsmb_cdevsw, &u, dev, 0);
	if (i)
		*dev = make_dev_credf(MAKEDEV_REF, &nsmb_cdevsw, u, cred,
		    UID_ROOT, GID_WHEEL, 0600, "%s%d", NSMB_NAME, u);
}