mirror of
https://git.FreeBSD.org/src.git
synced 2024-12-18 10:35:55 +00:00
Turn consolectl into a simple device node, not a TTY.
Apart from the 16 virtual terminals, Syscons allocates two device nodes that should not really be TTYs, even though they are. One of them is consolectl. In RELENG_7 and before, these device nodes are used in single user mode. After I simplified input path, we only use this device node to call ioctl() on (moused, Xorg, vidcontrol). When you call ioctl() on consolectl, it will behave the same as being called on the first window.
This commit is contained in:
parent
a9754a7538
commit
983d12f39b
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=192143
@ -207,7 +207,7 @@ static int save_kbd_state(scr_stat *scp);
|
||||
static int update_kbd_state(scr_stat *scp, int state, int mask);
|
||||
static int update_kbd_leds(scr_stat *scp, int which);
|
||||
static timeout_t blink_screen;
|
||||
static struct tty *sc_alloc_tty(int, const char *, ...) __printflike(2, 3);
|
||||
static struct tty *sc_alloc_tty(int, int);
|
||||
|
||||
static cn_probe_t sc_cnprobe;
|
||||
static cn_init_t sc_cninit;
|
||||
@ -224,11 +224,6 @@ static tsw_ioctl_t sctty_ioctl;
|
||||
static tsw_mmap_t sctty_mmap;
|
||||
|
||||
static struct ttydevsw sc_ttydevsw = {
|
||||
/*
|
||||
* XXX: we should use the prefix, but this doesn't work for
|
||||
* consolectl.
|
||||
*/
|
||||
.tsw_flags = TF_NOPREFIX,
|
||||
.tsw_open = sctty_open,
|
||||
.tsw_close = sctty_close,
|
||||
.tsw_outwakeup = sctty_outwakeup,
|
||||
@ -236,6 +231,15 @@ static struct ttydevsw sc_ttydevsw = {
|
||||
.tsw_mmap = sctty_mmap,
|
||||
};
|
||||
|
||||
static d_ioctl_t consolectl_ioctl;
|
||||
|
||||
static struct cdevsw consolectl_devsw = {
|
||||
.d_version = D_VERSION,
|
||||
.d_flags = D_NEEDGIANT,
|
||||
.d_ioctl = consolectl_ioctl,
|
||||
.d_name = "consolectl",
|
||||
};
|
||||
|
||||
int
|
||||
sc_probe_unit(int unit, int flags)
|
||||
{
|
||||
@ -321,14 +325,10 @@ sctty_outwakeup(struct tty *tp)
|
||||
}
|
||||
|
||||
static struct tty *
|
||||
sc_alloc_tty(int index, const char *fmt, ...)
|
||||
sc_alloc_tty(int index, int devnum)
|
||||
{
|
||||
va_list ap;
|
||||
struct sc_ttysoftc *stc;
|
||||
struct tty *tp;
|
||||
char name[11]; /* "consolectl" */
|
||||
|
||||
va_start(ap, fmt);
|
||||
|
||||
/* Allocate TTY object and softc to store unit number. */
|
||||
stc = malloc(sizeof(struct sc_ttysoftc), M_DEVBUF, M_WAITOK);
|
||||
@ -337,10 +337,7 @@ sc_alloc_tty(int index, const char *fmt, ...)
|
||||
tp = tty_alloc(&sc_ttydevsw, stc, &Giant);
|
||||
|
||||
/* Create device node. */
|
||||
va_start(ap, fmt);
|
||||
vsnrprintf(name, sizeof name, 32, fmt, ap);
|
||||
va_end(ap);
|
||||
tty_makedev(tp, NULL, "%s", name);
|
||||
tty_makedev(tp, NULL, "v%r", devnum);
|
||||
|
||||
return (tp);
|
||||
}
|
||||
@ -354,7 +351,7 @@ sc_attach_unit(int unit, int flags)
|
||||
video_info_t info;
|
||||
#endif
|
||||
int vc;
|
||||
struct tty *tp;
|
||||
struct cdev *dev;
|
||||
|
||||
flags &= ~SC_KERNEL_CONSOLE;
|
||||
|
||||
@ -425,7 +422,7 @@ sc_attach_unit(int unit, int flags)
|
||||
|
||||
for (vc = 0; vc < sc->vtys; vc++) {
|
||||
if (sc->dev[vc] == NULL) {
|
||||
sc->dev[vc] = sc_alloc_tty(vc, "ttyv%r", vc + unit * MAXCONS);
|
||||
sc->dev[vc] = sc_alloc_tty(vc, vc + unit * MAXCONS);
|
||||
if (vc == 0 && sc->dev == main_devs)
|
||||
SC_STAT(sc->dev[0]) = &main_console;
|
||||
}
|
||||
@ -436,8 +433,9 @@ sc_attach_unit(int unit, int flags)
|
||||
*/
|
||||
}
|
||||
|
||||
tp = sc_alloc_tty(0, "consolectl");
|
||||
SC_STAT(tp) = sc_console;
|
||||
dev = make_dev(&consolectl_devsw, 0, UID_ROOT, GID_WHEEL, 0600,
|
||||
"consolectl");
|
||||
dev->si_drv1 = sc->dev[0];
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -1428,6 +1426,14 @@ sctty_ioctl(struct tty *tp, u_long cmd, caddr_t data, struct thread *td)
|
||||
return (ENOIOCTL);
|
||||
}
|
||||
|
||||
static int
|
||||
consolectl_ioctl(struct cdev *dev, u_long cmd, caddr_t data, int fflag,
|
||||
struct thread *td)
|
||||
{
|
||||
|
||||
return sctty_ioctl(dev->si_drv1, cmd, data, td);
|
||||
}
|
||||
|
||||
static void
|
||||
sc_cnprobe(struct consdev *cp)
|
||||
{
|
||||
@ -2728,7 +2734,7 @@ scinit(int unit, int flags)
|
||||
/* assert(sc_malloc) */
|
||||
sc->dev = malloc(sizeof(struct tty *)*sc->vtys, M_DEVBUF,
|
||||
M_WAITOK|M_ZERO);
|
||||
sc->dev[0] = sc_alloc_tty(0, "ttyv%r", unit * MAXCONS);
|
||||
sc->dev[0] = sc_alloc_tty(0, unit * MAXCONS);
|
||||
scp = alloc_scp(sc, sc->first_vty);
|
||||
SC_STAT(sc->dev[0]) = scp;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user