PERFORCE change 147721 for review
Ed Schouten
ed at FreeBSD.org
Mon Aug 18 14:09:08 UTC 2008
http://perforce.freebsd.org/chv.cgi?CH=147721
Change 147721 by ed at ed_dull on 2008/08/18 14:08:25
Fix a compatibility regression:
I thought I had older FreeBSD versions working, but it turned
out openpty() does things differently than
posix_openpt()/ptsname(). We had openpty() working, but
ptsname() failed, because the minor number that gets returned
should get translated to the master device, not the slave
device.
Make the PTS_EXTERNAL interface a little more ugly by changing
the fstat() and FIODGNAME stuff to return the device number for
the master part.
Affected files ...
.. //depot/projects/mpsafetty/sys/kern/tty_pts.c#10 edit
.. //depot/projects/mpsafetty/sys/kern/tty_pty.c#8 edit
.. //depot/projects/mpsafetty/sys/sys/tty.h#11 edit
Differences ...
==== //depot/projects/mpsafetty/sys/kern/tty_pts.c#10 (text+ko) ====
@@ -85,8 +85,7 @@
struct selinfo pts_outpoll; /* (t) Select queue for read(). */
#ifdef PTS_EXTERNAL
- pts_external_free_t *pts_external_free; /* (c) Destructor callback. */
- void *pts_external_softc; /* (c) Destructor softc. */
+ struct cdev *pts_cdev; /* (c) Master device node. */
#endif /* PTS_EXTERNAL */
struct uidinfo *pts_uidinfo; /* (c) Resource limit. */
@@ -243,7 +242,12 @@
/* Reverse device name lookups, for ptsname() and ttyname(). */
fgn = data;
- p = tty_devname(tp);
+#ifdef PTS_EXTERNAL
+ if (psc->pts_cdev != NULL)
+ p = devtoname(psc->pts_cdev);
+ else
+#endif /* PTS_EXTERNAL */
+ p = tty_devname(tp);
i = strlen(p) + 1;
if (i > fgn->len)
return (EINVAL);
@@ -393,6 +397,9 @@
struct thread *td)
{
struct tty *tp = fp->f_data;
+#ifdef PTS_EXTERNAL
+ struct pts_softc *psc = tty_softc(tp);
+#endif /* PTS_EXTERNAL */
/*
* According to POSIX, we must implement an fstat(). This also
@@ -405,7 +412,12 @@
*/
bzero(sb, sizeof *sb);
- sb->st_ino = sb->st_rdev = tty_udev(tp);
+#ifdef PTS_EXTERNAL
+ if (psc->pts_cdev != NULL)
+ sb->st_ino = sb->st_rdev = dev2udev(psc->pts_cdev);
+ else
+#endif /* PTS_EXTERNAL */
+ sb->st_ino = sb->st_rdev = tty_udev(tp);
sb->st_mode = S_IFCHR;
sb->st_uid = tp->t_dev->si_cred->cr_ruid;
sb->st_gid = GID_TTY;
@@ -479,9 +491,9 @@
uifree(psc->pts_uidinfo);
#ifdef PTS_EXTERNAL
- /* Call shutdown hook. */
- if (psc->pts_external_free != NULL)
- psc->pts_external_free(psc->pts_external_softc);
+ /* Destroy master device as well. */
+ if (psc->pts_cdev != NULL)
+ destroy_dev_sched(psc->pts_cdev);
#endif /* PTS_EXTERNAL */
free(psc, M_PTS);
@@ -540,7 +552,7 @@
#ifdef PTS_EXTERNAL
int
pts_alloc_external(int fflags, struct thread *td, struct file *fp,
- pts_external_free_t freefunc, void *softc, const char *name)
+ struct cdev *dev, const char *name)
{
int ok;
struct tty *tp;
@@ -561,8 +573,7 @@
cv_init(&psc->pts_outwait, "pts outwait");
psc->pts_unit = -1;
- psc->pts_external_free = freefunc;
- psc->pts_external_softc = softc;
+ psc->pts_cdev = dev;
psc->pts_uidinfo = uid;
uihold(uid);
==== //depot/projects/mpsafetty/sys/kern/tty_pty.c#8 (text+ko) ====
@@ -48,15 +48,6 @@
static int pty_warningcnt = 10;
-static void
-ptydev_free(void *softc)
-{
- struct cdev *dev = softc;
-
- /* Remove the master device. */
- destroy_dev_sched(dev);
-}
-
static int
ptydev_fdopen(struct cdev *dev, int fflags, struct thread *td, struct file *fp)
{
@@ -71,8 +62,7 @@
name[3] = u >> 8;
name[4] = u;
- error = pts_alloc_external(fflags & (FREAD|FWRITE), td, fp,
- ptydev_free, dev, name);
+ error = pts_alloc_external(fflags & (FREAD|FWRITE), td, fp, dev, name);
if (error != 0) {
destroy_dev_sched(dev);
return (error);
==== //depot/projects/mpsafetty/sys/sys/tty.h#11 (text+ko) ====
@@ -186,9 +186,8 @@
void tty_info(struct tty *);
/* Pseudo-terminal hooks. */
-typedef void pts_external_free_t(void *);
int pts_alloc_external(int, struct thread *, struct file *,
- pts_external_free_t, void *, const char *);
+ struct cdev *, const char *);
/* Drivers and line disciplines also need to call these. */
#include <sys/ttydevsw.h>
More information about the p4-projects
mailing list