2 * Copyright (c) 2003 Poul-Henning Kamp. All rights reserved.
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
13 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
14 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
16 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
17 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
18 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
19 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
20 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
21 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
22 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26 #include <sys/cdefs.h>
27 __FBSDID("$FreeBSD$");
29 #include <sys/param.h>
30 #include <sys/systm.h>
32 #include <sys/kernel.h>
35 #include <sys/vnode.h>
37 #include <fs/devfs/devfs.h>
38 #include <fs/devfs/devfs_int.h>
40 static d_open_t cttyopen
;
42 static struct cdevsw ctty_cdevsw
= {
43 .d_version
= D_VERSION
,
48 static struct cdev
*ctty
;
51 cttyopen(struct cdev
*dev
, int flag
, int mode
, struct thread
*td
)
58 ctty_clone(void *arg
, struct ucred
*cred
, char *name
, int namelen
,
64 if (strcmp(name
, "tty"))
66 sx_sunlock(&clone_drain_lock
);
67 sx_slock(&proctree_lock
);
68 sx_slock(&clone_drain_lock
);
70 if (!(curthread
->td_proc
->p_flag
& P_CONTROLT
))
72 else if (curthread
->td_proc
->p_session
->s_ttyvp
== NULL
)
74 else if (curthread
->td_proc
->p_session
->s_ttyvp
->v_type
== VBAD
||
75 curthread
->td_proc
->p_session
->s_ttyvp
->v_rdev
== NULL
) {
76 /* e.g. s_ttyvp was revoked */
79 *dev
= curthread
->td_proc
->p_session
->s_ttyvp
->v_rdev
;
82 sx_sunlock(&proctree_lock
);
86 ctty_drvinit(void *unused
)
89 EVENTHANDLER_REGISTER(dev_clone
, ctty_clone
, 0, 1000);
90 ctty
= make_dev(&ctty_cdevsw
, 0, 0, 0, 0666, "ctty");
93 SYSINIT(cttydev
,SI_SUB_DRIVERS
,SI_ORDER_MIDDLE
,ctty_drvinit
,NULL
);