summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sys/kern/tty.c71
-rw-r--r--sys/sys/tty.h35
-rw-r--r--usr.sbin/pstat/pstat.82
-rw-r--r--usr.sbin/pstat/pstat.c39
4 files changed, 80 insertions, 67 deletions
diff --git a/sys/kern/tty.c b/sys/kern/tty.c
index 25d44e8..d73683c 100644
--- a/sys/kern/tty.c
+++ b/sys/kern/tty.c
@@ -291,11 +291,12 @@ ttydev_open(struct cdev *dev, int oflags, int devtype, struct thread *td)
}
}
- if (TTY_CALLOUT(tp, dev)) {
+ if (dev == dev_console)
+ tp->t_flags |= TF_OPENED_CONS;
+ else if (TTY_CALLOUT(tp, dev))
tp->t_flags |= TF_OPENED_OUT;
- } else {
+ else
tp->t_flags |= TF_OPENED_IN;
- }
done: tp->t_flags &= ~TF_OPENCLOSE;
ttydev_leave(tp);
@@ -308,22 +309,28 @@ ttydev_close(struct cdev *dev, int fflag, int devtype, struct thread *td)
{
struct tty *tp = dev->si_drv1;
+ tty_lock(tp);
+
/*
* Don't actually close the device if it is being used as the
* console.
*/
- if (dev_console_filename != NULL &&
- strcmp(dev_console_filename, tty_devname(tp)) == 0)
- return (0);
+ MPASS((tp->t_flags & TF_OPENED) != TF_OPENED);
+ if (dev == dev_console)
+ tp->t_flags &= ~TF_OPENED_CONS;
+ else
+ tp->t_flags &= ~(TF_OPENED_IN|TF_OPENED_OUT);
- tty_lock(tp);
+ if (tp->t_flags & TF_OPENED) {
+ tty_unlock(tp);
+ return (0);
+ }
/*
* This can only be called once. The callin and the callout
* devices cannot be opened at the same time.
*/
- MPASS((tp->t_flags & TF_OPENED) != TF_OPENED);
- tp->t_flags &= ~(TF_OPENED|TF_EXCLUDE|TF_STOPPED);
+ tp->t_flags &= ~(TF_EXCLUDE|TF_STOPPED);
/* Properly wake up threads that are stuck - revoke(). */
tp->t_revokecnt++;
@@ -1797,13 +1804,14 @@ ttyconsdev_write(struct cdev *dev, struct uio *uio, int ioflag)
}
/*
- * /dev/console is a little different than normal TTY's. Unlike regular
- * TTY device nodes, this device node will not revoke the entire TTY
- * upon closure and all data written to it will be logged.
+ * /dev/console is a little different than normal TTY's. When opened,
+ * it determines which TTY to use. When data gets written to it, it
+ * will be logged in the kernel message buffer.
*/
static struct cdevsw ttyconsdev_cdevsw = {
.d_version = D_VERSION,
.d_open = ttyconsdev_open,
+ .d_close = ttydev_close,
.d_read = ttydev_read,
.d_write = ttyconsdev_write,
.d_ioctl = ttydev_ioctl,
@@ -1845,33 +1853,34 @@ static struct {
char val;
} ttystates[] = {
#if 0
- { TF_NOPREFIX, 'N' },
+ { TF_NOPREFIX, 'N' },
#endif
- { TF_INITLOCK, 'I' },
- { TF_CALLOUT, 'C' },
+ { TF_INITLOCK, 'I' },
+ { TF_CALLOUT, 'C' },
/* Keep these together -> 'Oi' and 'Oo'. */
- { TF_OPENED, 'O' },
- { TF_OPENED_IN, 'i' },
- { TF_OPENED_OUT,'o' },
+ { TF_OPENED, 'O' },
+ { TF_OPENED_IN, 'i' },
+ { TF_OPENED_OUT, 'o' },
+ { TF_OPENED_CONS, 'c' },
- { TF_GONE, 'G' },
- { TF_OPENCLOSE, 'B' },
- { TF_ASYNC, 'Y' },
- { TF_LITERAL, 'L' },
+ { TF_GONE, 'G' },
+ { TF_OPENCLOSE, 'B' },
+ { TF_ASYNC, 'Y' },
+ { TF_LITERAL, 'L' },
/* Keep these together -> 'Hi' and 'Ho'. */
- { TF_HIWAT, 'H' },
- { TF_HIWAT_IN, 'i' },
- { TF_HIWAT_OUT, 'o' },
+ { TF_HIWAT, 'H' },
+ { TF_HIWAT_IN, 'i' },
+ { TF_HIWAT_OUT, 'o' },
- { TF_STOPPED, 'S' },
- { TF_EXCLUDE, 'X' },
- { TF_BYPASS, 'l' },
- { TF_ZOMBIE, 'Z' },
- { TF_HOOK, 's' },
+ { TF_STOPPED, 'S' },
+ { TF_EXCLUDE, 'X' },
+ { TF_BYPASS, 'l' },
+ { TF_ZOMBIE, 'Z' },
+ { TF_HOOK, 's' },
- { 0, '\0' },
+ { 0, '\0'},
};
#define TTY_FLAG_BITS \
diff --git a/sys/sys/tty.h b/sys/sys/tty.h
index 7505562..218fd21 100644
--- a/sys/sys/tty.h
+++ b/sys/sys/tty.h
@@ -64,24 +64,25 @@ struct tty {
TAILQ_ENTRY(tty) t_list; /* (l) TTY list entry. */
unsigned int t_flags; /* (t) Terminal option flags. */
/* Keep flags in sync with db_show_tty and pstat(8). */
-#define TF_NOPREFIX 0x0001 /* Don't prepend "tty" to device name. */
-#define TF_INITLOCK 0x0002 /* Create init/lock state devices. */
-#define TF_CALLOUT 0x0004 /* Create "cua" devices. */
-#define TF_OPENED_IN 0x0008 /* "tty" node is in use. */
-#define TF_OPENED_OUT 0x0010 /* "cua" node is in use. */
-#define TF_OPENED (TF_OPENED_IN|TF_OPENED_OUT)
-#define TF_GONE 0x0020 /* Device node is gone. */
-#define TF_OPENCLOSE 0x0040 /* Device is in open()/close(). */
-#define TF_ASYNC 0x0080 /* Asynchronous I/O enabled. */
-#define TF_LITERAL 0x0100 /* Accept the next character literally. */
-#define TF_HIWAT_IN 0x0200 /* We've reached the input watermark. */
-#define TF_HIWAT_OUT 0x0400 /* We've reached the output watermark. */
+#define TF_NOPREFIX 0x00001 /* Don't prepend "tty" to device name. */
+#define TF_INITLOCK 0x00002 /* Create init/lock state devices. */
+#define TF_CALLOUT 0x00004 /* Create "cua" devices. */
+#define TF_OPENED_IN 0x00008 /* "tty" node is in use. */
+#define TF_OPENED_OUT 0x00010 /* "cua" node is in use. */
+#define TF_OPENED_CONS 0x00020 /* Device in use as console. */
+#define TF_OPENED (TF_OPENED_IN|TF_OPENED_OUT|TF_OPENED_CONS)
+#define TF_GONE 0x00040 /* Device node is gone. */
+#define TF_OPENCLOSE 0x00080 /* Device is in open()/close(). */
+#define TF_ASYNC 0x00100 /* Asynchronous I/O enabled. */
+#define TF_LITERAL 0x00200 /* Accept the next character literally. */
+#define TF_HIWAT_IN 0x00400 /* We've reached the input watermark. */
+#define TF_HIWAT_OUT 0x00800 /* We've reached the output watermark. */
#define TF_HIWAT (TF_HIWAT_IN|TF_HIWAT_OUT)
-#define TF_STOPPED 0x0800 /* Output flow control - stopped. */
-#define TF_EXCLUDE 0x1000 /* Exclusive access. */
-#define TF_BYPASS 0x2000 /* Optimized input path. */
-#define TF_ZOMBIE 0x4000 /* Modem disconnect received. */
-#define TF_HOOK 0x8000 /* TTY has hook attached. */
+#define TF_STOPPED 0x01000 /* Output flow control - stopped. */
+#define TF_EXCLUDE 0x02000 /* Exclusive access. */
+#define TF_BYPASS 0x04000 /* Optimized input path. */
+#define TF_ZOMBIE 0x08000 /* Modem disconnect received. */
+#define TF_HOOK 0x10000 /* TTY has hook attached. */
unsigned int t_revokecnt; /* (t) revoke() count. */
/* Buffering mechanisms. */
diff --git a/usr.sbin/pstat/pstat.8 b/usr.sbin/pstat/pstat.8
index 5474f8b..b92abd8 100644
--- a/usr.sbin/pstat/pstat.8
+++ b/usr.sbin/pstat/pstat.8
@@ -183,6 +183,8 @@ init/lock-state device nodes present
callout device nodes present
.It O
opened
+.It c
+console in use
.It G
gone
.It B
diff --git a/usr.sbin/pstat/pstat.c b/usr.sbin/pstat/pstat.c
index a33bd0a..2cb52fe 100644
--- a/usr.sbin/pstat/pstat.c
+++ b/usr.sbin/pstat/pstat.c
@@ -288,33 +288,34 @@ static struct {
char val;
} ttystates[] = {
#if 0
- { TF_NOPREFIX, 'N' },
+ { TF_NOPREFIX, 'N' },
#endif
- { TF_INITLOCK, 'I' },
- { TF_CALLOUT, 'C' },
+ { TF_INITLOCK, 'I' },
+ { TF_CALLOUT, 'C' },
/* Keep these together -> 'Oi' and 'Oo'. */
- { TF_OPENED, 'O' },
- { TF_OPENED_IN, 'i' },
- { TF_OPENED_OUT,'o' },
+ { TF_OPENED, 'O' },
+ { TF_OPENED_IN, 'i' },
+ { TF_OPENED_OUT, 'o' },
+ { TF_OPENED_CONS, 'c' },
- { TF_GONE, 'G' },
- { TF_OPENCLOSE, 'B' },
- { TF_ASYNC, 'Y' },
- { TF_LITERAL, 'L' },
+ { TF_GONE, 'G' },
+ { TF_OPENCLOSE, 'B' },
+ { TF_ASYNC, 'Y' },
+ { TF_LITERAL, 'L' },
/* Keep these together -> 'Hi' and 'Ho'. */
- { TF_HIWAT, 'H' },
- { TF_HIWAT_IN, 'i' },
- { TF_HIWAT_OUT, 'o' },
+ { TF_HIWAT, 'H' },
+ { TF_HIWAT_IN, 'i' },
+ { TF_HIWAT_OUT, 'o' },
- { TF_STOPPED, 'S' },
- { TF_EXCLUDE, 'X' },
- { TF_BYPASS, 'l' },
- { TF_ZOMBIE, 'Z' },
- { TF_HOOK, 's' },
+ { TF_STOPPED, 'S' },
+ { TF_EXCLUDE, 'X' },
+ { TF_BYPASS, 'l' },
+ { TF_ZOMBIE, 'Z' },
+ { TF_HOOK, 's' },
- { 0, '\0' },
+ { 0, '\0'},
};
static void
OpenPOWER on IntegriCloud