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); }
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"); }
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); }
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"); }
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; } } }
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); }