svn commit: r196886 - in head: share/man/man4 sys/dev/pty sys/kern
sys/sys
Ed Schouten
ed at FreeBSD.org
Sun Sep 6 10:27:46 UTC 2009
Author: ed
Date: Sun Sep 6 10:27:45 2009
New Revision: 196886
URL: http://svn.freebsd.org/changeset/base/196886
Log:
Move ptmx into pty(4).
Now that pty(4) is a loadable kernel module, I'd better move /dev/ptmx
in there as well. This means that pty(4) now provides almost all
pseudo-terminal compatibility code. This means it's very easy to test
whether applications use the proper library interfaces when allocating
pseudo-terminals (namely posix_openpt and openpty).
Modified:
head/share/man/man4/pts.4
head/share/man/man4/pty.4
head/sys/dev/pty/pty.c
head/sys/kern/tty_pts.c
head/sys/sys/tty.h
Modified: head/share/man/man4/pts.4
==============================================================================
--- head/share/man/man4/pts.4 Sun Sep 6 09:59:02 2009 (r196885)
+++ head/share/man/man4/pts.4 Sun Sep 6 10:27:45 2009 (r196886)
@@ -147,15 +147,6 @@ The files used by this
pseudo-terminals implementation are:
.Pp
.Bl -tag -width ".Pa /dev/pts/[num]"
-.It Pa /dev/ptmx
-Control device, returns a file descriptor to a new master
-pseudo-terminal when opened.
-This device should not be opened directly.
-It's only available for binary compatibility.
-New devices should only be allocated with
-.Xr posix_openpt 2
-and
-.Xr openpty 3 .
.It Pa /dev/pts/[num]
Pseudo-terminal slave devices.
.El
Modified: head/share/man/man4/pty.4
==============================================================================
--- head/share/man/man4/pty.4 Sun Sep 6 09:59:02 2009 (r196885)
+++ head/share/man/man4/pty.4 Sun Sep 6 10:27:45 2009 (r196886)
@@ -32,7 +32,7 @@
.Os
.Sh NAME
.Nm pty
-.Nd BSD-style compatibility pseudo-terminal driver
+.Nd BSD-style and System V-style compatibility pseudo-terminal driver
.Sh SYNOPSIS
.Cd "device pty"
.Sh DESCRIPTION
@@ -48,6 +48,12 @@ driver.
A device node for this terminal shall be created, which has the name
.Pa /dev/ttyXX .
.Pp
+The
+.Nm
+driver also provides a cloning System V
+.Pa /dev/ptmx
+device.
+.Pp
New code should not try to allocate pseudo-terminals using this
interface.
It is only provided for compatibility with older C libraries
@@ -63,6 +69,9 @@ device names:
Pseudo-terminal master devices.
.It Pa /dev/tty[l-sL-S][0-9a-v]
Pseudo-terminal slave devices.
+.It Pa /dev/ptmx
+Control device, returns a file descriptor to a new master
+pseudo-terminal when opened.
.El
.Sh DIAGNOSTICS
None.
@@ -75,7 +84,7 @@ A
pseudo-terminal driver appeared in
.Bx 4.2 .
.Sh BUGS
-Unlike previous implementations, the master slave device nodes are
+Unlike previous implementations, the master and slave device nodes are
destroyed when the PTY becomes unused.
A call to
.Xr stat 2
Modified: head/sys/dev/pty/pty.c
==============================================================================
--- head/sys/dev/pty/pty.c Sun Sep 6 09:59:02 2009 (r196885)
+++ head/sys/dev/pty/pty.c Sun Sep 6 10:27:45 2009 (r196886)
@@ -47,6 +47,9 @@ __FBSDID("$FreeBSD$");
* the pts(4) driver. We just call into pts(4) to create the actual PTY.
* To make sure we don't use the same PTY multiple times, we abuse
* si_drv1 inside the cdev to mark whether the PTY is in use.
+ *
+ * It also implements a /dev/ptmx device node, which is useful for Linux
+ * binary emulation.
*/
static unsigned int pty_warningcnt = 1;
@@ -119,12 +122,27 @@ pty_clone(void *arg, struct ucred *cr, c
}
static int
+ptmx_fdopen(struct cdev *dev __unused, int fflags, struct thread *td,
+ struct file *fp)
+{
+
+ return (pts_alloc(fflags & (FREAD|FWRITE), td, fp));
+}
+
+static struct cdevsw ptmx_cdevsw = {
+ .d_version = D_VERSION,
+ .d_fdopen = ptmx_fdopen,
+ .d_name = "ptmx",
+};
+
+static int
pty_modevent(module_t mod, int type, void *data)
{
switch(type) {
case MOD_LOAD:
EVENTHANDLER_REGISTER(dev_clone, pty_clone, 0, 1000);
+ make_dev(&ptmx_cdevsw, 0, UID_ROOT, GID_WHEEL, 0666, "ptmx");
break;
case MOD_SHUTDOWN:
break;
Modified: head/sys/kern/tty_pts.c
==============================================================================
--- head/sys/kern/tty_pts.c Sun Sep 6 09:59:02 2009 (r196885)
+++ head/sys/kern/tty_pts.c Sun Sep 6 10:27:45 2009 (r196886)
@@ -32,7 +32,7 @@ __FBSDID("$FreeBSD$");
/* Add compatibility bits for FreeBSD. */
#define PTS_COMPAT
-/* Add /dev/ptyXX compat bits. */
+/* Add pty(4) compat bits. */
#define PTS_EXTERNAL
/* Add bits to make Linux binaries work. */
#define PTS_LINUX
@@ -694,7 +694,10 @@ static struct ttydevsw pts_class = {
.tsw_free = ptsdrv_free,
};
-static int
+#ifndef PTS_EXTERNAL
+static
+#endif /* !PTS_EXTERNAL */
+int
pts_alloc(int fflags, struct thread *td, struct file *fp)
{
int unit, ok;
@@ -815,29 +818,11 @@ posix_openpt(struct thread *td, struct p
return (0);
}
-#if defined(PTS_COMPAT) || defined(PTS_LINUX)
-static int
-ptmx_fdopen(struct cdev *dev, int fflags, struct thread *td, struct file *fp)
-{
-
- return (pts_alloc(fflags & (FREAD|FWRITE), td, fp));
-}
-
-static struct cdevsw ptmx_cdevsw = {
- .d_version = D_VERSION,
- .d_fdopen = ptmx_fdopen,
- .d_name = "ptmx",
-};
-#endif /* PTS_COMPAT || PTS_LINUX */
-
static void
pts_init(void *unused)
{
pts_pool = new_unrhdr(0, INT_MAX, NULL);
-#if defined(PTS_COMPAT) || defined(PTS_LINUX)
- make_dev(&ptmx_cdevsw, 0, UID_ROOT, GID_WHEEL, 0666, "ptmx");
-#endif /* PTS_COMPAT || PTS_LINUX */
}
SYSINIT(pts, SI_SUB_DRIVERS, SI_ORDER_MIDDLE, pts_init, NULL);
Modified: head/sys/sys/tty.h
==============================================================================
--- head/sys/sys/tty.h Sun Sep 6 09:59:02 2009 (r196885)
+++ head/sys/sys/tty.h Sun Sep 6 10:27:45 2009 (r196886)
@@ -202,6 +202,7 @@ void tty_info(struct tty *tp);
void ttyconsdev_select(const char *name);
/* Pseudo-terminal hooks. */
+int pts_alloc(int fflags, struct thread *td, struct file *fp);
int pts_alloc_external(int fd, struct thread *td, struct file *fp,
struct cdev *dev, const char *name);
More information about the svn-src-all
mailing list