Changeset View
Changeset View
Standalone View
Standalone View
sys/kern/tty_tty.c
Show First 20 Lines • Show All 62 Lines • ▼ Show 20 Lines | ctty_clone(void *arg, struct ucred *cred, char *name, int namelen, | ||||
struct proc *p; | struct proc *p; | ||||
if (*dev != NULL) | if (*dev != NULL) | ||||
return; | return; | ||||
if (strcmp(name, "tty")) | if (strcmp(name, "tty")) | ||||
return; | return; | ||||
p = curproc; | p = curproc; | ||||
sx_sunlock(&clone_drain_lock); | sx_sunlock(&clone_drain_lock); | ||||
sx_slock(&proctree_lock); | sx_slock(&V_proctree_lock); | ||||
sx_slock(&clone_drain_lock); | sx_slock(&clone_drain_lock); | ||||
dev_lock(); | dev_lock(); | ||||
if (!(p->p_flag & P_CONTROLT)) | if (!(p->p_flag & P_CONTROLT)) | ||||
*dev = ctty; | *dev = ctty; | ||||
else if (p->p_session->s_ttyvp == NULL) | else if (p->p_session->s_ttyvp == NULL) | ||||
*dev = ctty; | *dev = ctty; | ||||
else if (p->p_session->s_ttyvp->v_type == VBAD || | else if (p->p_session->s_ttyvp->v_type == VBAD || | ||||
p->p_session->s_ttyvp->v_rdev == NULL) { | p->p_session->s_ttyvp->v_rdev == NULL) { | ||||
/* e.g. s_ttyvp was revoked */ | /* e.g. s_ttyvp was revoked */ | ||||
*dev = ctty; | *dev = ctty; | ||||
} else | } else | ||||
*dev = p->p_session->s_ttyvp->v_rdev; | *dev = p->p_session->s_ttyvp->v_rdev; | ||||
dev_refl(*dev); | dev_refl(*dev); | ||||
dev_unlock(); | dev_unlock(); | ||||
sx_sunlock(&proctree_lock); | sx_sunlock(&V_proctree_lock); | ||||
} | } | ||||
static void | static void | ||||
ctty_drvinit(void *unused) | ctty_drvinit(void *unused) | ||||
{ | { | ||||
EVENTHANDLER_REGISTER(dev_clone, ctty_clone, 0, 1000); | EVENTHANDLER_REGISTER(dev_clone, ctty_clone, 0, 1000); | ||||
ctty = make_dev_credf(MAKEDEV_ETERNAL, &ctty_cdevsw, 0, NULL, UID_ROOT, | ctty = make_dev_credf(MAKEDEV_ETERNAL, &ctty_cdevsw, 0, NULL, UID_ROOT, | ||||
GID_WHEEL, 0666, "ctty"); | GID_WHEEL, 0666, "ctty"); | ||||
} | } | ||||
SYSINIT(cttydev,SI_SUB_DRIVERS,SI_ORDER_MIDDLE,ctty_drvinit,NULL); | SYSINIT(cttydev,SI_SUB_DRIVERS,SI_ORDER_MIDDLE,ctty_drvinit,NULL); |